Merge pull request #477 from tzugen/context-free

Make all preference operations context-free
This commit is contained in:
Nite 2021-05-11 12:34:51 +02:00 committed by GitHub
commit e9cc2880f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
60 changed files with 555 additions and 616 deletions

View File

@ -21,23 +21,9 @@
<ID>CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun areIndexesMissing(): Boolean</ID> <ID>CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun areIndexesMissing(): Boolean</ID>
<ID>CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun reindexSettings()</ID> <ID>CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun reindexSettings()</ID>
<ID>ComplexCondition:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$!append &amp;&amp; !playNext &amp;&amp; !unpin &amp;&amp; !background</ID> <ID>ComplexCondition:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$!append &amp;&amp; !playNext &amp;&amp; !unpin &amp;&amp; !background</ID>
<ID>ComplexCondition:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$!isOffline(activity) &amp;&amp; isArtist &amp;&amp; Util.getShouldUseId3Tags(activity)</ID>
<ID>ComplexCondition:EditServerFragment.kt$EditServerFragment$urlString != urlString.trim(' ') || urlString.contains("@") || url.host.isNullOrBlank()</ID>
<ID>ComplexCondition:FilePickerAdapter.kt$FilePickerAdapter$currentDirectory.absolutePath == "/" || currentDirectory.absolutePath == "/storage" || currentDirectory.absolutePath == "/storage/emulated" || currentDirectory.absolutePath == "/mnt"</ID> <ID>ComplexCondition:FilePickerAdapter.kt$FilePickerAdapter$currentDirectory.absolutePath == "/" || currentDirectory.absolutePath == "/storage" || currentDirectory.absolutePath == "/storage/emulated" || currentDirectory.absolutePath == "/mnt"</ID>
<ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$Util.getGaplessPlaybackPreference(context) &amp;&amp; Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.JELLY_BEAN &amp;&amp; ( playerState === PlayerState.STARTED || playerState === PlayerState.PAUSED )</ID> <ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$Util.getGaplessPlaybackPreference() &amp;&amp; Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.JELLY_BEAN &amp;&amp; ( playerState === PlayerState.STARTED || playerState === PlayerState.PAUSED )</ID>
<ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$playerState !== PlayerState.IDLE &amp;&amp; playerState !== PlayerState.DOWNLOADING &amp;&amp; playerState !== PlayerState.PREPARING</ID> <ID>ComplexCondition:SongView.kt$SongView$TextUtils.isEmpty(transcodedSuffix) || transcodedSuffix == suffix || song.isVideo &amp;&amp; Util.getVideoPlayerType() !== VideoPlayerType.FLASH</ID>
<ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer.&lt;no name provided&gt;$!isPartial || downloadFile.isWorkDone &amp;&amp; abs(duration - pos) &lt; 1000</ID>
<ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer.&lt;no name provided&gt;$Util.getGaplessPlaybackPreference(context) &amp;&amp; nextPlaying != null &amp;&amp; nextPlayerState === PlayerState.PREPARED</ID>
<ID>ComplexCondition:MediaPlayerService.kt$MediaPlayerService$localMediaPlayer.playerState === PlayerState.IDLE || localMediaPlayer.playerState === PlayerState.DOWNLOADING || localMediaPlayer.playerState === PlayerState.PREPARING</ID>
<ID>ComplexCondition:MediaPlayerService.kt$MediaPlayerService$localMediaPlayer.playerState === PlayerState.PAUSED || localMediaPlayer.playerState === PlayerState.COMPLETED || localMediaPlayer.playerState === PlayerState.STOPPED</ID>
<ID>ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$enabled &amp;&amp; !deleteEnabled &amp;&amp; !isOffline(context)</ID>
<ID>ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$enabled &amp;&amp; !isOffline(context) &amp;&amp; selection.size &gt; pinnedCount</ID>
<ID>ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$entry != null &amp;&amp; !entry.isDirectory &amp;&amp; !entry.isVideo</ID>
<ID>ComplexCondition:SelectAlbumModel.kt$SelectAlbumModel$Util.getShouldShowAllSongsByArtist(context) &amp;&amp; musicDirectory.findChild(allSongsId) == null &amp;&amp; musicDirectory.getChildren(true, false).size == musicDirectory.getChildren(true, true).size</ID>
<ID>ComplexCondition:ServerSettingsModel.kt$ServerSettingsModel$url.isNullOrEmpty() || userName.isNullOrEmpty() || isMigrated</ID>
<ID>ComplexCondition:SongView.kt$SongView$TextUtils.isEmpty(transcodedSuffix) || transcodedSuffix == suffix || song.isVideo &amp;&amp; Util.getVideoPlayerType(this.context) !== VideoPlayerType.FLASH</ID>
<ID>ComplexCondition:SubsonicImageLoaderProxy.kt$SubsonicImageLoaderProxy$id != null &amp;&amp; view != null &amp;&amp; view is ImageView</ID>
<ID>ComplexCondition:SubsonicImageLoaderProxy.kt$SubsonicImageLoaderProxy$username != null &amp;&amp; view != null &amp;&amp; view is ImageView</ID>
<ID>ComplexMethod:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String</ID> <ID>ComplexMethod:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String</ID>
<ID>ComplexMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute()</ID> <ID>ComplexMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute()</ID>
<ID>ComplexMethod:EditServerFragment.kt$EditServerFragment$ private fun areFieldsChanged(): Boolean</ID> <ID>ComplexMethod:EditServerFragment.kt$EditServerFragment$ private fun areFieldsChanged(): Boolean</ID>
@ -96,7 +82,6 @@
<ID>LongMethod:DownloadFile.kt$DownloadFile$private fun updateModificationDate(file: File)</ID> <ID>LongMethod:DownloadFile.kt$DownloadFile$private fun updateModificationDate(file: File)</ID>
<ID>LongMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute()</ID> <ID>LongMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute()</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler$fun download( fragment: Fragment, append: Boolean, save: Boolean, autoPlay: Boolean, playNext: Boolean, shuffle: Boolean, songs: List&lt;MusicDirectory.Entry?&gt; )</ID> <ID>LongMethod:DownloadHandler.kt$DownloadHandler$fun download( fragment: Fragment, append: Boolean, save: Boolean, autoPlay: Boolean, playNext: Boolean, shuffle: Boolean, songs: List&lt;MusicDirectory.Entry?&gt; )</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Exception::class) private fun getSongsForArtist( id: String, songs: MutableCollection&lt;MusicDirectory.Entry&gt; )</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Exception::class) private fun getSongsRecursively( parent: MusicDirectory, songs: MutableList&lt;MusicDirectory.Entry&gt; )</ID> <ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Exception::class) private fun getSongsRecursively( parent: MusicDirectory, songs: MutableList&lt;MusicDirectory.Entry&gt; )</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Throwable::class) override fun doInBackground(): List&lt;MusicDirectory.Entry&gt;</ID> <ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Throwable::class) override fun doInBackground(): List&lt;MusicDirectory.Entry&gt;</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$override fun done(songs: List&lt;MusicDirectory.Entry&gt;)</ID> <ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$override fun done(songs: List&lt;MusicDirectory.Entry&gt;)</ID>
@ -129,13 +114,12 @@
<ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnPlayerStateChangedHandler()</ID> <ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnPlayerStateChangedHandler()</ID>
<ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler()</ID> <ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler()</ID>
<ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun updateMediaSession(currentPlaying: DownloadFile?, playerState: PlayerState)</ID> <ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun updateMediaSession(currentPlaying: DownloadFile?, playerState: PlayerState)</ID>
<ID>LongMethod:MediaStoreService.kt$MediaStoreService$fun saveInMediaStore(downloadFile: DownloadFile)</ID>
<ID>LongMethod:NavigationActivity.kt$NavigationActivity$// TODO Test if this works with external Intents // android.intent.action.SEARCH and android.media.action.MEDIA_PLAY_FROM_SEARCH calls here override fun onNewIntent(intent: Intent?)</ID> <ID>LongMethod:NavigationActivity.kt$NavigationActivity$// TODO Test if this works with external Intents // android.intent.action.SEARCH and android.media.action.MEDIA_PLAY_FROM_SEARCH calls here override fun onNewIntent(intent: Intent?)</ID>
<ID>LongMethod:NavigationActivity.kt$NavigationActivity$override fun onCreate(savedInstanceState: Bundle?)</ID> <ID>LongMethod:NavigationActivity.kt$NavigationActivity$override fun onCreate(savedInstanceState: Bundle?)</ID>
<ID>LongMethod:NavigationActivity.kt$NavigationActivity$private fun showNowPlaying()</ID> <ID>LongMethod:NavigationActivity.kt$NavigationActivity$private fun showNowPlaying()</ID>
<ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getAvatar( context: Context, username: String?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap?</ID> <ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getAvatar( context: Context, username: String?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap?</ID>
<ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getCoverArt( context: Context, entry: MusicDirectory.Entry?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap?</ID> <ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getCoverArt( context: Context, entry: MusicDirectory.Entry?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap?</ID>
<ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(IOException::class) private fun savePlaylist( name: String?, context: Context, playlist: MusicDirectory )</ID> <ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(IOException::class) private fun savePlaylist( name: String?, playlist: MusicDirectory )</ID>
<ID>LongMethod:RestErrorMapper.kt$ fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String</ID> <ID>LongMethod:RestErrorMapper.kt$ fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String</ID>
<ID>LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean</ID> <ID>LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean</ID>
<ID>LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?)</ID> <ID>LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?)</ID>

View File

@ -2,7 +2,6 @@
<SmellBaseline> <SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues> <ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues> <CurrentIssues>
<ID>ComplexCondition:SubsonicAPIClient.kt$SubsonicAPIClient$contentType != null &amp;&amp; contentType.type().equals("application", true) &amp;&amp; contentType.subtype().equals("json", true)</ID>
<ID>ComplexMethod:AlbumListType.kt$AlbumListType.Companion$@JvmStatic fun fromName(typeName: String): AlbumListType</ID> <ID>ComplexMethod:AlbumListType.kt$AlbumListType.Companion$@JvmStatic fun fromName(typeName: String): AlbumListType</ID>
<ID>ComplexMethod:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$@JvmStatic @Throws(IllegalArgumentException::class) fun getClosestKnownClientApiVersion(apiVersion: String): SubsonicAPIVersions</ID> <ID>ComplexMethod:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$@JvmStatic @Throws(IllegalArgumentException::class) fun getClosestKnownClientApiVersion(apiVersion: String): SubsonicAPIVersions</ID>
<ID>ComplexMethod:SubsonicError.kt$SubsonicError.Companion$fun getError(code: Int, message: String)</ID> <ID>ComplexMethod:SubsonicError.kt$SubsonicError.Companion$fun getError(code: Int, message: String)</ID>

View File

@ -21,23 +21,9 @@
<ID>CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun areIndexesMissing(): Boolean</ID> <ID>CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun areIndexesMissing(): Boolean</ID>
<ID>CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun reindexSettings()</ID> <ID>CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun reindexSettings()</ID>
<ID>ComplexCondition:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$!append &amp;&amp; !playNext &amp;&amp; !unpin &amp;&amp; !background</ID> <ID>ComplexCondition:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$!append &amp;&amp; !playNext &amp;&amp; !unpin &amp;&amp; !background</ID>
<ID>ComplexCondition:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$!isOffline(activity) &amp;&amp; isArtist &amp;&amp; Util.getShouldUseId3Tags(activity)</ID>
<ID>ComplexCondition:EditServerFragment.kt$EditServerFragment$urlString != urlString.trim(' ') || urlString.contains("@") || url.host.isNullOrBlank()</ID>
<ID>ComplexCondition:FilePickerAdapter.kt$FilePickerAdapter$currentDirectory.absolutePath == "/" || currentDirectory.absolutePath == "/storage" || currentDirectory.absolutePath == "/storage/emulated" || currentDirectory.absolutePath == "/mnt"</ID> <ID>ComplexCondition:FilePickerAdapter.kt$FilePickerAdapter$currentDirectory.absolutePath == "/" || currentDirectory.absolutePath == "/storage" || currentDirectory.absolutePath == "/storage/emulated" || currentDirectory.absolutePath == "/mnt"</ID>
<ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$Util.getGaplessPlaybackPreference(context) &amp;&amp; Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.JELLY_BEAN &amp;&amp; ( playerState === PlayerState.STARTED || playerState === PlayerState.PAUSED )</ID> <ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$Util.getGaplessPlaybackPreference() &amp;&amp; Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.JELLY_BEAN &amp;&amp; ( playerState === PlayerState.STARTED || playerState === PlayerState.PAUSED )</ID>
<ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$playerState !== PlayerState.IDLE &amp;&amp; playerState !== PlayerState.DOWNLOADING &amp;&amp; playerState !== PlayerState.PREPARING</ID> <ID>ComplexCondition:SongView.kt$SongView$TextUtils.isEmpty(transcodedSuffix) || transcodedSuffix == suffix || song.isVideo &amp;&amp; Util.getVideoPlayerType() !== VideoPlayerType.FLASH</ID>
<ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer.&lt;no name provided&gt;$!isPartial || downloadFile.isWorkDone &amp;&amp; abs(duration - pos) &lt; 1000</ID>
<ID>ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer.&lt;no name provided&gt;$Util.getGaplessPlaybackPreference(context) &amp;&amp; nextPlaying != null &amp;&amp; nextPlayerState === PlayerState.PREPARED</ID>
<ID>ComplexCondition:MediaPlayerService.kt$MediaPlayerService$localMediaPlayer.playerState === PlayerState.IDLE || localMediaPlayer.playerState === PlayerState.DOWNLOADING || localMediaPlayer.playerState === PlayerState.PREPARING</ID>
<ID>ComplexCondition:MediaPlayerService.kt$MediaPlayerService$localMediaPlayer.playerState === PlayerState.PAUSED || localMediaPlayer.playerState === PlayerState.COMPLETED || localMediaPlayer.playerState === PlayerState.STOPPED</ID>
<ID>ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$enabled &amp;&amp; !deleteEnabled &amp;&amp; !isOffline(context)</ID>
<ID>ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$enabled &amp;&amp; !isOffline(context) &amp;&amp; selection.size &gt; pinnedCount</ID>
<ID>ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$entry != null &amp;&amp; !entry.isDirectory &amp;&amp; !entry.isVideo</ID>
<ID>ComplexCondition:SelectAlbumModel.kt$SelectAlbumModel$Util.getShouldShowAllSongsByArtist(context) &amp;&amp; musicDirectory.findChild(allSongsId) == null &amp;&amp; musicDirectory.getChildren(true, false).size == musicDirectory.getChildren(true, true).size</ID>
<ID>ComplexCondition:ServerSettingsModel.kt$ServerSettingsModel$url.isNullOrEmpty() || userName.isNullOrEmpty() || isMigrated</ID>
<ID>ComplexCondition:SongView.kt$SongView$TextUtils.isEmpty(transcodedSuffix) || transcodedSuffix == suffix || song.isVideo &amp;&amp; Util.getVideoPlayerType(this.context) !== VideoPlayerType.FLASH</ID>
<ID>ComplexCondition:SubsonicImageLoaderProxy.kt$SubsonicImageLoaderProxy$id != null &amp;&amp; view != null &amp;&amp; view is ImageView</ID>
<ID>ComplexCondition:SubsonicImageLoaderProxy.kt$SubsonicImageLoaderProxy$username != null &amp;&amp; view != null &amp;&amp; view is ImageView</ID>
<ID>ComplexMethod:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String</ID> <ID>ComplexMethod:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String</ID>
<ID>ComplexMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute()</ID> <ID>ComplexMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute()</ID>
<ID>ComplexMethod:EditServerFragment.kt$EditServerFragment$ private fun areFieldsChanged(): Boolean</ID> <ID>ComplexMethod:EditServerFragment.kt$EditServerFragment$ private fun areFieldsChanged(): Boolean</ID>
@ -52,8 +38,6 @@
<ID>ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun enableButtons()</ID> <ID>ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun enableButtons()</ID>
<ID>ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun updateDisplay(refresh: Boolean)</ID> <ID>ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun updateDisplay(refresh: Boolean)</ID>
<ID>ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun updateInterfaceWithEntries(musicDirectory: MusicDirectory)</ID> <ID>ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun updateInterfaceWithEntries(musicDirectory: MusicDirectory)</ID>
<ID>ComplexMethod:SelectAlbumModel.kt$SelectAlbumModel$suspend fun getAlbumList(albumListType: String, size: Int, offset: Int)</ID>
<ID>ComplexMethod:SelectAlbumModel.kt$SelectAlbumModel$suspend fun getMusicDirectory( refresh: Boolean, id: String?, name: String?, parentId: String? )</ID>
<ID>ComplexMethod:SelectArtistFragment.kt$SelectArtistFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?)</ID> <ID>ComplexMethod:SelectArtistFragment.kt$SelectArtistFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?)</ID>
<ID>ComplexMethod:ServerRowAdapter.kt$ServerRowAdapter$ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View?</ID> <ID>ComplexMethod:ServerRowAdapter.kt$ServerRowAdapter$ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View?</ID>
<ID>ComplexMethod:SongView.kt$SongView$fun setSong(song: MusicDirectory.Entry, checkable: Boolean, draggable: Boolean)</ID> <ID>ComplexMethod:SongView.kt$SongView$fun setSong(song: MusicDirectory.Entry, checkable: Boolean, draggable: Boolean)</ID>
@ -98,7 +82,6 @@
<ID>LongMethod:DownloadFile.kt$DownloadFile$private fun updateModificationDate(file: File)</ID> <ID>LongMethod:DownloadFile.kt$DownloadFile$private fun updateModificationDate(file: File)</ID>
<ID>LongMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute()</ID> <ID>LongMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute()</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler$fun download( fragment: Fragment, append: Boolean, save: Boolean, autoPlay: Boolean, playNext: Boolean, shuffle: Boolean, songs: List&lt;MusicDirectory.Entry?&gt; )</ID> <ID>LongMethod:DownloadHandler.kt$DownloadHandler$fun download( fragment: Fragment, append: Boolean, save: Boolean, autoPlay: Boolean, playNext: Boolean, shuffle: Boolean, songs: List&lt;MusicDirectory.Entry?&gt; )</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Exception::class) private fun getSongsForArtist( id: String, songs: MutableCollection&lt;MusicDirectory.Entry&gt; )</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Exception::class) private fun getSongsRecursively( parent: MusicDirectory, songs: MutableList&lt;MusicDirectory.Entry&gt; )</ID> <ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Exception::class) private fun getSongsRecursively( parent: MusicDirectory, songs: MutableList&lt;MusicDirectory.Entry&gt; )</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Throwable::class) override fun doInBackground(): List&lt;MusicDirectory.Entry&gt;</ID> <ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$@Throws(Throwable::class) override fun doInBackground(): List&lt;MusicDirectory.Entry&gt;</ID>
<ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$override fun done(songs: List&lt;MusicDirectory.Entry&gt;)</ID> <ID>LongMethod:DownloadHandler.kt$DownloadHandler.&lt;no name provided&gt;$override fun done(songs: List&lt;MusicDirectory.Entry&gt;)</ID>
@ -131,13 +114,12 @@
<ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnPlayerStateChangedHandler()</ID> <ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnPlayerStateChangedHandler()</ID>
<ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler()</ID> <ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler()</ID>
<ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun updateMediaSession(currentPlaying: DownloadFile?, playerState: PlayerState)</ID> <ID>LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun updateMediaSession(currentPlaying: DownloadFile?, playerState: PlayerState)</ID>
<ID>LongMethod:MediaStoreService.kt$MediaStoreService$fun saveInMediaStore(downloadFile: DownloadFile)</ID>
<ID>LongMethod:NavigationActivity.kt$NavigationActivity$// TODO Test if this works with external Intents // android.intent.action.SEARCH and android.media.action.MEDIA_PLAY_FROM_SEARCH calls here override fun onNewIntent(intent: Intent?)</ID> <ID>LongMethod:NavigationActivity.kt$NavigationActivity$// TODO Test if this works with external Intents // android.intent.action.SEARCH and android.media.action.MEDIA_PLAY_FROM_SEARCH calls here override fun onNewIntent(intent: Intent?)</ID>
<ID>LongMethod:NavigationActivity.kt$NavigationActivity$override fun onCreate(savedInstanceState: Bundle?)</ID> <ID>LongMethod:NavigationActivity.kt$NavigationActivity$override fun onCreate(savedInstanceState: Bundle?)</ID>
<ID>LongMethod:NavigationActivity.kt$NavigationActivity$private fun showNowPlaying()</ID> <ID>LongMethod:NavigationActivity.kt$NavigationActivity$private fun showNowPlaying()</ID>
<ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getAvatar( context: Context, username: String?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap?</ID> <ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getAvatar( context: Context, username: String?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap?</ID>
<ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getCoverArt( context: Context, entry: MusicDirectory.Entry?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap?</ID> <ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getCoverArt( context: Context, entry: MusicDirectory.Entry?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap?</ID>
<ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(IOException::class) private fun savePlaylist( name: String?, context: Context, playlist: MusicDirectory )</ID> <ID>LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(IOException::class) private fun savePlaylist( name: String?, playlist: MusicDirectory )</ID>
<ID>LongMethod:RestErrorMapper.kt$ fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String</ID> <ID>LongMethod:RestErrorMapper.kt$ fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String</ID>
<ID>LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean</ID> <ID>LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean</ID>
<ID>LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?)</ID> <ID>LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?)</ID>

View File

@ -306,9 +306,9 @@ public class BookmarksFragment extends Fragment {
} }
playNowButton.setVisibility(enabled && deleteEnabled ? View.VISIBLE : View.GONE); playNowButton.setVisibility(enabled && deleteEnabled ? View.VISIBLE : View.GONE);
pinButton.setVisibility((enabled && !ActiveServerProvider.Companion.isOffline(getContext()) && selection.size() > pinnedCount) ? View.VISIBLE : View.GONE); pinButton.setVisibility((enabled && !ActiveServerProvider.Companion.isOffline() && selection.size() > pinnedCount) ? View.VISIBLE : View.GONE);
unpinButton.setVisibility(enabled && unpinEnabled ? View.VISIBLE : View.GONE); unpinButton.setVisibility(enabled && unpinEnabled ? View.VISIBLE : View.GONE);
downloadButton.setVisibility(enabled && !deleteEnabled && !ActiveServerProvider.Companion.isOffline(getContext()) ? View.VISIBLE : View.GONE); downloadButton.setVisibility(enabled && !deleteEnabled && !ActiveServerProvider.Companion.isOffline() ? View.VISIBLE : View.GONE);
deleteButton.setVisibility(enabled && deleteEnabled ? View.VISIBLE : View.GONE); deleteButton.setVisibility(enabled && deleteEnabled ? View.VISIBLE : View.GONE);
} }
@ -381,9 +381,9 @@ public class BookmarksFragment extends Fragment {
@Override @Override
protected Pair<MusicDirectory, Boolean> doInBackground() throws Throwable protected Pair<MusicDirectory, Boolean> doInBackground() throws Throwable
{ {
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
MusicDirectory dir = load(musicService); MusicDirectory dir = load(musicService);
boolean valid = musicService.isLicenseValid(getContext()); boolean valid = musicService.isLicenseValid();
return new Pair<>(dir, valid); return new Pair<>(dir, valid);
} }

View File

@ -202,7 +202,7 @@ public class ChatFragment extends Fragment {
private void timerMethod() private void timerMethod()
{ {
int refreshInterval = Util.getChatRefreshInterval(getContext()); int refreshInterval = Util.getChatRefreshInterval();
if (refreshInterval > 0) if (refreshInterval > 0)
{ {
@ -249,7 +249,7 @@ public class ChatFragment extends Fragment {
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
musicService.addChatMessage(message, getContext()); musicService.addChatMessage(message, getContext());
return null; return null;
} }
@ -273,7 +273,7 @@ public class ChatFragment extends Fragment {
@Override @Override
protected List<ChatMessage> doInBackground() throws Throwable protected List<ChatMessage> doInBackground() throws Throwable
{ {
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
return musicService.getChatMessages(lastChatMessageTime, getContext()); return musicService.getChatMessages(lastChatMessageTime, getContext());
} }

View File

@ -78,7 +78,7 @@ public class LyricsFragment extends Fragment {
if (arguments == null) return null; if (arguments == null) return null;
String artist = arguments.getString(Constants.INTENT_EXTRA_NAME_ARTIST); String artist = arguments.getString(Constants.INTENT_EXTRA_NAME_ARTIST);
String title = arguments.getString(Constants.INTENT_EXTRA_NAME_TITLE); String title = arguments.getString(Constants.INTENT_EXTRA_NAME_TITLE);
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
return musicService.getLyrics(artist, title, getContext()); return musicService.getLyrics(artist, title, getContext());
} }

View File

@ -65,7 +65,7 @@ public class MainFragment extends Fragment {
super.onResume(); super.onResume();
boolean shouldRestart = false; boolean shouldRestart = false;
boolean id3 = Util.getShouldUseId3Tags(MainFragment.this.getContext()); boolean id3 = Util.getShouldUseId3Tags();
String currentActiveServerProperties = getActiveServerProperties(); String currentActiveServerProperties = getActiveServerProperties();
if (id3 != shouldUseId3) if (id3 != shouldUseId3)
@ -118,7 +118,7 @@ public class MainFragment extends Fragment {
final MergeAdapter adapter = new MergeAdapter(); final MergeAdapter adapter = new MergeAdapter();
adapter.addViews(Collections.singletonList(serverButton), true); adapter.addViews(Collections.singletonList(serverButton), true);
if (!ActiveServerProvider.Companion.isOffline(this.getContext())) if (!ActiveServerProvider.Companion.isOffline())
{ {
adapter.addView(musicTitle, false); adapter.addView(musicTitle, false);
adapter.addViews(asList(artistsButton, albumsButton, genresButton), true); adapter.addViews(asList(artistsButton, albumsButton, genresButton), true);
@ -126,7 +126,7 @@ public class MainFragment extends Fragment {
adapter.addViews(asList(randomSongsButton, songsStarredButton), true); adapter.addViews(asList(randomSongsButton, songsStarredButton), true);
adapter.addView(albumsTitle, false); adapter.addView(albumsTitle, false);
if (Util.getShouldUseId3Tags(MainFragment.this.getContext())) if (Util.getShouldUseId3Tags())
{ {
shouldUseId3 = true; shouldUseId3 = true;
adapter.addViews(asList(albumsNewestButton, albumsRecentButton, albumsFrequentButton, albumsRandomButton, albumsStarredButton, albumsAlphaByNameButton, albumsAlphaByArtistButton), true); adapter.addViews(asList(albumsNewestButton, albumsRecentButton, albumsFrequentButton, albumsRandomButton, albumsStarredButton, albumsAlphaByNameButton, albumsAlphaByArtistButton), true);
@ -224,7 +224,7 @@ public class MainFragment extends Fragment {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE, type); bundle.putString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE, type);
bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, title); bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, title);
bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxAlbums(getContext())); bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxAlbums());
bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0); bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0);
Navigation.findNavController(getView()).navigate(R.id.mainToSelectAlbum, bundle); Navigation.findNavController(getView()).navigate(R.id.mainToSelectAlbum, bundle);
} }
@ -240,7 +240,7 @@ public class MainFragment extends Fragment {
{ {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt(Constants.INTENT_EXTRA_NAME_RANDOM, 1); bundle.putInt(Constants.INTENT_EXTRA_NAME_RANDOM, 1);
bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxSongs(getContext())); bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxSongs());
Navigation.findNavController(getView()).navigate(R.id.mainToSelectAlbum, bundle); Navigation.findNavController(getView()).navigate(R.id.mainToSelectAlbum, bundle);
} }

View File

@ -115,7 +115,7 @@ public class NowPlayingFragment extends Fragment {
nowPlayingAlbumArtImage.setOnClickListener(v -> { nowPlayingAlbumArtImage.setOnClickListener(v -> {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
if (Util.getShouldUseId3Tags(getContext())) { if (Util.getShouldUseId3Tags()) {
bundle.putBoolean(Constants.INTENT_EXTRA_NAME_IS_ALBUM, true); bundle.putBoolean(Constants.INTENT_EXTRA_NAME_IS_ALBUM, true);
bundle.putString(Constants.INTENT_EXTRA_NAME_ID, song.getAlbumId()); bundle.putString(Constants.INTENT_EXTRA_NAME_ID, song.getAlbumId());
} else { } else {

View File

@ -287,7 +287,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
@Override @Override
public void run() public void run()
{ {
int incrementTime = Util.getIncrementTime(getActivity()); int incrementTime = Util.getIncrementTime();
changeProgress(-incrementTime); changeProgress(-incrementTime);
} }
}); });
@ -326,7 +326,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
@Override @Override
public void run() public void run()
{ {
int incrementTime = Util.getIncrementTime(getActivity()); int incrementTime = Util.getIncrementTime();
changeProgress(incrementTime); changeProgress(incrementTime);
} }
}); });
@ -709,7 +709,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
MenuItem bookmarkRemoveMenuItem = menu.findItem(R.id.menu_item_bookmark_delete); MenuItem bookmarkRemoveMenuItem = menu.findItem(R.id.menu_item_bookmark_delete);
if (ActiveServerProvider.Companion.isOffline(getContext())) if (ActiveServerProvider.Companion.isOffline())
{ {
if (shareMenuItem != null) if (shareMenuItem != null)
{ {
@ -834,7 +834,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
} }
} }
if (ActiveServerProvider.Companion.isOffline(getContext()) || !Util.getShouldUseId3Tags(getContext())) if (ActiveServerProvider.Companion.isOffline() || !Util.getShouldUseId3Tags())
{ {
MenuItem menuItem = menu.findItem(R.id.menu_show_artist); MenuItem menuItem = menu.findItem(R.id.menu_show_artist);
@ -844,7 +844,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
} }
} }
if (ActiveServerProvider.Companion.isOffline(getContext())) if (ActiveServerProvider.Companion.isOffline())
{ {
MenuItem menuItem = menu.findItem(R.id.menu_lyrics); MenuItem menuItem = menu.findItem(R.id.menu_lyrics);
@ -891,7 +891,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
return false; return false;
} }
if (Util.getShouldUseId3Tags(getContext())) { if (Util.getShouldUseId3Tags()) {
bundle = new Bundle(); bundle = new Bundle();
bundle.putString(Constants.INTENT_EXTRA_NAME_ID, entry.getArtistId()); bundle.putString(Constants.INTENT_EXTRA_NAME_ID, entry.getArtistId());
bundle.putString(Constants.INTENT_EXTRA_NAME_NAME, entry.getArtist()); bundle.putString(Constants.INTENT_EXTRA_NAME_NAME, entry.getArtist());
@ -906,7 +906,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
return false; return false;
} }
String albumId = Util.getShouldUseId3Tags(getContext()) ? entry.getAlbumId() : entry.getParent(); String albumId = Util.getShouldUseId3Tags() ? entry.getAlbumId() : entry.getParent();
bundle = new Bundle(); bundle = new Bundle();
bundle.putString(Constants.INTENT_EXTRA_NAME_ID, albumId); bundle.putString(Constants.INTENT_EXTRA_NAME_ID, albumId);
bundle.putString(Constants.INTENT_EXTRA_NAME_NAME, entry.getAlbum()); bundle.putString(Constants.INTENT_EXTRA_NAME_NAME, entry.getAlbum());
@ -994,13 +994,13 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
final MusicService musicService = MusicServiceFactory.getMusicService(getContext()); final MusicService musicService = MusicServiceFactory.getMusicService();
try { try {
if (isStarred) { if (isStarred) {
musicService.unstar(id, null, null, getContext()); musicService.unstar(id, null, null);
} else { } else {
musicService.star(id, null, null, getContext()); musicService.star(id, null, null);
} }
} catch (Exception e) { } catch (Exception e) {
Timber.e(e); Timber.e(e);
@ -1024,7 +1024,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
final MusicService musicService = MusicServiceFactory.getMusicService(getContext()); final MusicService musicService = MusicServiceFactory.getMusicService();
try { try {
musicService.createBookmark(songId, playerPosition, getContext()); musicService.createBookmark(songId, playerPosition, getContext());
@ -1050,7 +1050,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
final MusicService musicService = MusicServiceFactory.getMusicService(getContext()); final MusicService musicService = MusicServiceFactory.getMusicService();
try { try {
musicService.deleteBookmark(bookmarkSongId, getContext()); musicService.deleteBookmark(bookmarkSongId, getContext());
@ -1127,7 +1127,7 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur
{ {
entries.add(downloadFile.getSong()); entries.add(downloadFile.getSong());
} }
final MusicService musicService = MusicServiceFactory.getMusicService(getContext()); final MusicService musicService = MusicServiceFactory.getMusicService();
musicService.createPlaylist(null, playlistName, entries, getContext()); musicService.createPlaylist(null, playlistName, entries, getContext());
return null; return null;
} }

View File

@ -127,10 +127,10 @@ public class PlaylistsFragment extends Fragment {
@Override @Override
protected List<Playlist> doInBackground() throws Throwable protected List<Playlist> doInBackground() throws Throwable
{ {
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
List<Playlist> playlists = musicService.getPlaylists(refresh, getContext()); List<Playlist> playlists = musicService.getPlaylists(refresh, getContext());
if (!ActiveServerProvider.Companion.isOffline(getContext())) if (!ActiveServerProvider.Companion.isOffline())
new CacheCleaner(getContext()).cleanPlaylists(playlists); new CacheCleaner(getContext()).cleanPlaylists(playlists);
return playlists; return playlists;
} }
@ -151,14 +151,14 @@ public class PlaylistsFragment extends Fragment {
super.onCreateContextMenu(menu, view, menuInfo); super.onCreateContextMenu(menu, view, menuInfo);
MenuInflater inflater = getActivity().getMenuInflater(); MenuInflater inflater = getActivity().getMenuInflater();
if (ActiveServerProvider.Companion.isOffline(getContext())) inflater.inflate(R.menu.select_playlist_context_offline, menu); if (ActiveServerProvider.Companion.isOffline()) inflater.inflate(R.menu.select_playlist_context_offline, menu);
else inflater.inflate(R.menu.select_playlist_context, menu); else inflater.inflate(R.menu.select_playlist_context, menu);
MenuItem downloadMenuItem = menu.findItem(R.id.album_menu_download); MenuItem downloadMenuItem = menu.findItem(R.id.album_menu_download);
if (downloadMenuItem != null) if (downloadMenuItem != null)
{ {
downloadMenuItem.setVisible(!ActiveServerProvider.Companion.isOffline(getContext())); downloadMenuItem.setVisible(!ActiveServerProvider.Companion.isOffline());
} }
} }
@ -222,7 +222,7 @@ public class PlaylistsFragment extends Fragment {
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
musicService.deletePlaylist(playlist.getId(), getContext()); musicService.deletePlaylist(playlist.getId(), getContext());
return null; return null;
} }
@ -312,7 +312,7 @@ public class PlaylistsFragment extends Fragment {
String name = nameBoxText != null ? nameBoxText.toString() : null; String name = nameBoxText != null ? nameBoxText.toString() : null;
String comment = commentBoxText != null ? commentBoxText.toString() : null; String comment = commentBoxText != null ? commentBoxText.toString() : null;
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
musicService.updatePlaylist(playlist.getId(), name, comment, publicBox.isChecked(), getContext()); musicService.updatePlaylist(playlist.getId(), name, comment, publicBox.isChecked(), getContext());
return null; return null;
} }

View File

@ -96,7 +96,7 @@ public class PodcastFragment extends Fragment {
@Override @Override
protected List<PodcastsChannel> doInBackground() throws Throwable protected List<PodcastsChannel> doInBackground() throws Throwable
{ {
MusicService musicService = MusicServiceFactory.getMusicService(context); MusicService musicService = MusicServiceFactory.getMusicService();
return musicService.getPodcastsChannels(refresh, context); return musicService.getPodcastsChannels(refresh, context);
} }

View File

@ -113,9 +113,9 @@ public class SearchFragment extends Fragment {
FragmentTitle.Companion.setTitle(this, R.string.search_title); FragmentTitle.Companion.setTitle(this, R.string.search_title);
setHasOptionsMenu(true); setHasOptionsMenu(true);
DEFAULT_ARTISTS = Util.getDefaultArtists(getContext()); DEFAULT_ARTISTS = Util.getDefaultArtists();
DEFAULT_ALBUMS = Util.getDefaultAlbums(getContext()); DEFAULT_ALBUMS = Util.getDefaultAlbums();
DEFAULT_SONGS = Util.getDefaultSongs(getContext()); DEFAULT_SONGS = Util.getDefaultSongs();
View buttons = LayoutInflater.from(getContext()).inflate(R.layout.search_buttons, list, false); View buttons = LayoutInflater.from(getContext()).inflate(R.layout.search_buttons, list, false);
@ -280,10 +280,10 @@ public class SearchFragment extends Fragment {
if (downloadMenuItem != null) if (downloadMenuItem != null)
{ {
downloadMenuItem.setVisible(!ActiveServerProvider.Companion.isOffline(getContext())); downloadMenuItem.setVisible(!ActiveServerProvider.Companion.isOffline());
} }
if (ActiveServerProvider.Companion.isOffline(getContext()) || isArtist) if (ActiveServerProvider.Companion.isOffline() || isArtist)
{ {
if (shareButton != null) if (shareButton != null)
{ {
@ -410,9 +410,9 @@ public class SearchFragment extends Fragment {
private void search(final String query, final boolean autoplay) private void search(final String query, final boolean autoplay)
{ {
final int maxArtists = Util.getMaxArtists(getContext()); final int maxArtists = Util.getMaxArtists();
final int maxAlbums = Util.getMaxAlbums(getContext()); final int maxAlbums = Util.getMaxAlbums();
final int maxSongs = Util.getMaxSongs(getContext()); final int maxSongs = Util.getMaxSongs();
BackgroundTask<SearchResult> task = new FragmentBackgroundTask<SearchResult>(getActivity(), true, searchRefresh, cancellationToken) BackgroundTask<SearchResult> task = new FragmentBackgroundTask<SearchResult>(getActivity(), true, searchRefresh, cancellationToken)
{ {
@ -420,7 +420,7 @@ public class SearchFragment extends Fragment {
protected SearchResult doInBackground() throws Throwable protected SearchResult doInBackground() throws Throwable
{ {
SearchCriteria criteria = new SearchCriteria(query, maxArtists, maxAlbums, maxSongs); SearchCriteria criteria = new SearchCriteria(query, maxArtists, maxAlbums, maxSongs);
MusicService service = MusicServiceFactory.getMusicService(getContext()); MusicService service = MusicServiceFactory.getMusicService();
return service.search(criteria, getContext()); return service.search(criteria, getContext());
} }

View File

@ -75,7 +75,7 @@ public class SelectGenreFragment extends Fragment {
{ {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putString(Constants.INTENT_EXTRA_NAME_GENRE_NAME, genre.getName()); bundle.putString(Constants.INTENT_EXTRA_NAME_GENRE_NAME, genre.getName());
bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxSongs(getContext())); bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxSongs());
bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0); bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0);
Navigation.findNavController(view).navigate(R.id.selectAlbumFragment, bundle); Navigation.findNavController(view).navigate(R.id.selectAlbumFragment, bundle);
} }
@ -102,13 +102,13 @@ public class SelectGenreFragment extends Fragment {
@Override @Override
protected List<Genre> doInBackground() protected List<Genre> doInBackground()
{ {
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
List<Genre> genres = new ArrayList<>(); List<Genre> genres = new ArrayList<>();
try try
{ {
genres = musicService.getGenres(refresh, getContext()); genres = musicService.getGenres(refresh);
} }
catch (Exception x) catch (Exception x)
{ {

View File

@ -166,14 +166,14 @@ public class SettingsFragment extends PreferenceFragmentCompat
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
SharedPreferences preferences = Util.getPreferences(getActivity()); SharedPreferences preferences = Util.getPreferences();
preferences.registerOnSharedPreferenceChangeListener(this); preferences.registerOnSharedPreferenceChangeListener(this);
} }
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
SharedPreferences prefs = Util.getPreferences(getActivity()); SharedPreferences prefs = Util.getPreferences();
prefs.unregisterOnSharedPreferenceChangeListener(this); prefs.unregisterOnSharedPreferenceChangeListener(this);
} }
@ -224,7 +224,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
private void setupCacheLocationPreference() { private void setupCacheLocationPreference() {
cacheLocation.setSummary(settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, cacheLocation.setSummary(settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION,
FileUtil.getDefaultMusicDirectory(getActivity()).getPath())); FileUtil.getDefaultMusicDirectory().getPath()));
cacheLocation.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { cacheLocation.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override @Override
@ -235,7 +235,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
public void onPermissionRequestFinished(boolean hasPermission) { public void onPermissionRequestFinished(boolean hasPermission) {
if (hasPermission) { if (hasPermission) {
FilePickerDialog filePickerDialog = FilePickerDialog.Companion.createFilePickerDialog(getContext()); FilePickerDialog filePickerDialog = FilePickerDialog.Companion.createFilePickerDialog(getContext());
filePickerDialog.setDefaultDirectory(FileUtil.getDefaultMusicDirectory(getActivity()).getPath()); filePickerDialog.setDefaultDirectory(FileUtil.getDefaultMusicDirectory().getPath());
filePickerDialog.setInitialDirectory(cacheLocation.getSummary().toString()); filePickerDialog.setInitialDirectory(cacheLocation.getSummary().toString());
filePickerDialog.setOnFileSelectedListener(new OnFileSelectedListener() { filePickerDialog.setOnFileSelectedListener(new OnFileSelectedListener() {
@Override @Override
@ -257,8 +257,8 @@ public class SettingsFragment extends PreferenceFragmentCompat
} }
private void setupBluetoothDevicePreferences() { private void setupBluetoothDevicePreferences() {
final int resumeSetting = Util.getResumeOnBluetoothDevice(getActivity()); final int resumeSetting = Util.getResumeOnBluetoothDevice();
final int pauseSetting = Util.getPauseOnBluetoothDevice(getActivity()); final int pauseSetting = Util.getPauseOnBluetoothDevice();
resumeOnBluetoothDevice.setSummary(bluetoothDevicePreferenceToString(resumeSetting)); resumeOnBluetoothDevice.setSummary(bluetoothDevicePreferenceToString(resumeSetting));
pauseOnBluetoothDevice.setSummary(bluetoothDevicePreferenceToString(pauseSetting)); pauseOnBluetoothDevice.setSummary(bluetoothDevicePreferenceToString(pauseSetting));
@ -268,7 +268,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
showBluetoothDevicePreferenceDialog( showBluetoothDevicePreferenceDialog(
R.string.settings_playback_resume_on_bluetooth_device, R.string.settings_playback_resume_on_bluetooth_device,
Util.getResumeOnBluetoothDevice(getActivity()), Util.getResumeOnBluetoothDevice(),
new Consumer<Integer>() { new Consumer<Integer>() {
@Override @Override
public void accept(Integer choice) { public void accept(Integer choice) {
@ -287,7 +287,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
showBluetoothDevicePreferenceDialog( showBluetoothDevicePreferenceDialog(
R.string.settings_playback_pause_on_bluetooth_device, R.string.settings_playback_pause_on_bluetooth_device,
Util.getPauseOnBluetoothDevice(getActivity()), Util.getPauseOnBluetoothDevice(),
new Consumer<Integer>() { new Consumer<Integer>() {
@Override @Override
public void accept(Integer choice) { public void accept(Integer choice) {
@ -448,7 +448,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
sharingDefaultDescription.setSummary(sharingDefaultDescription.getText()); sharingDefaultDescription.setSummary(sharingDefaultDescription.getText());
sharingDefaultGreeting.setSummary(sharingDefaultGreeting.getText()); sharingDefaultGreeting.setSummary(sharingDefaultGreeting.getText());
cacheLocation.setSummary(settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, cacheLocation.setSummary(settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION,
FileUtil.getDefaultMusicDirectory(getActivity()).getPath())); FileUtil.getDefaultMusicDirectory().getPath()));
if (!mediaButtonsEnabled.isChecked()) { if (!mediaButtonsEnabled.isChecked()) {
lockScreenEnabled.setChecked(false); lockScreenEnabled.setChecked(false);
@ -462,12 +462,12 @@ public class SettingsFragment extends PreferenceFragmentCompat
if (debugLogToFile.isChecked()) { if (debugLogToFile.isChecked()) {
debugLogToFile.setSummary(getString(R.string.settings_debug_log_path, debugLogToFile.setSummary(getString(R.string.settings_debug_log_path,
FileUtil.getUltrasonicDirectory(getActivity()), FileLoggerTree.FILENAME)); FileUtil.getUltrasonicDirectory(), FileLoggerTree.FILENAME));
} else { } else {
debugLogToFile.setSummary(""); debugLogToFile.setSummary("");
} }
showArtistPicture.setEnabled(Util.getShouldUseId3Tags(getActivity())); showArtistPicture.setEnabled(Util.getShouldUseId3Tags());
} }
private void setImageLoaderConcurrency(int concurrency) { private void setImageLoaderConcurrency(int concurrency) {
@ -480,7 +480,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
} }
private void setHideMedia(boolean hide) { private void setHideMedia(boolean hide) {
File nomediaDir = new File(FileUtil.getUltrasonicDirectory(getActivity()), ".nomedia"); File nomediaDir = new File(FileUtil.getUltrasonicDirectory(), ".nomedia");
if (hide && !nomediaDir.exists()) { if (hide && !nomediaDir.exists()) {
if (!nomediaDir.mkdir()) { if (!nomediaDir.mkdir()) {
Timber.w("Failed to create %s", nomediaDir); Timber.w("Failed to create %s", nomediaDir);
@ -510,7 +510,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
@Override @Override
public void onPermissionRequestFinished(boolean hasPermission) { public void onPermissionRequestFinished(boolean hasPermission) {
String currentPath = settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, String currentPath = settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION,
FileUtil.getDefaultMusicDirectory(getActivity()).getPath()); FileUtil.getDefaultMusicDirectory().getPath());
cacheLocation.setSummary(currentPath); cacheLocation.setSummary(currentPath);
} }
}); });
@ -525,18 +525,18 @@ public class SettingsFragment extends PreferenceFragmentCompat
private void setDebugLogToFile(boolean writeLog) { private void setDebugLogToFile(boolean writeLog) {
if (writeLog) { if (writeLog) {
FileLoggerTree.Companion.plantToTimberForest(getActivity().getApplicationContext()); FileLoggerTree.Companion.plantToTimberForest();
Timber.i("Enabled debug logging to file"); Timber.i("Enabled debug logging to file");
} else { } else {
FileLoggerTree.Companion.uprootFromTimberForest(); FileLoggerTree.Companion.uprootFromTimberForest();
Timber.i("Disabled debug logging to file"); Timber.i("Disabled debug logging to file");
int fileNum = FileLoggerTree.Companion.getLogFileNumber(getActivity()); int fileNum = FileLoggerTree.Companion.getLogFileNumber();
long fileSize = FileLoggerTree.Companion.getLogFileSizes(getActivity()); long fileSize = FileLoggerTree.Companion.getLogFileSizes();
String message = getString(R.string.settings_debug_log_summary, String message = getString(R.string.settings_debug_log_summary,
String.valueOf(fileNum), String.valueOf(fileNum),
String.valueOf(Math.ceil(fileSize / 1000000d)), String.valueOf(Math.ceil(fileSize / 1000000d)),
FileUtil.getUltrasonicDirectory(getActivity())); FileUtil.getUltrasonicDirectory());
new AlertDialog.Builder(getActivity()) new AlertDialog.Builder(getActivity())
.setMessage(message) .setMessage(message)
@ -550,7 +550,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
.setPositiveButton(R.string.settings_debug_log_delete, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.settings_debug_log_delete, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {
FileLoggerTree.Companion.deleteLogFiles(getActivity()); FileLoggerTree.Companion.deleteLogFiles();
Timber.i("Deleted debug log files"); Timber.i("Deleted debug log files");
dialogInterface.dismiss(); dialogInterface.dismiss();
new AlertDialog.Builder(getActivity()).setMessage(R.string.settings_debug_log_deleted) new AlertDialog.Builder(getActivity()).setMessage(R.string.settings_debug_log_deleted)

View File

@ -128,7 +128,7 @@ public class SharesFragment extends Fragment {
@Override @Override
protected List<Share> doInBackground() throws Throwable protected List<Share> doInBackground() throws Throwable
{ {
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
return musicService.getShares(refresh, getContext()); return musicService.getShares(refresh, getContext());
} }
@ -195,7 +195,7 @@ public class SharesFragment extends Fragment {
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
musicService.deleteShare(share.getId(), getContext()); musicService.deleteShare(share.getId(), getContext());
return null; return null;
} }
@ -301,7 +301,7 @@ public class SharesFragment extends Fragment {
Editable shareDescriptionText = shareDescription.getText(); Editable shareDescriptionText = shareDescription.getText();
String description = shareDescriptionText != null ? shareDescriptionText.toString() : null; String description = shareDescriptionText != null ? shareDescriptionText.toString() : null;
MusicService musicService = MusicServiceFactory.getMusicService(getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
musicService.updateShare(share.getId(), description, millis, getContext()); musicService.updateShare(share.getId(), description, millis, getContext());
return null; return null;
} }

View File

@ -66,7 +66,7 @@ public class BluetoothIntentReceiver extends BroadcastReceiver
boolean resume = false; boolean resume = false;
boolean pause = false; boolean pause = false;
switch (Util.getResumeOnBluetoothDevice(context)) switch (Util.getResumeOnBluetoothDevice())
{ {
case Constants.PREFERENCE_VALUE_ALL: resume = actionA2dpConnected || actionBluetoothDeviceConnected; case Constants.PREFERENCE_VALUE_ALL: resume = actionA2dpConnected || actionBluetoothDeviceConnected;
break; break;
@ -74,7 +74,7 @@ public class BluetoothIntentReceiver extends BroadcastReceiver
break; break;
} }
switch (Util.getPauseOnBluetoothDevice(context)) switch (Util.getPauseOnBluetoothDevice())
{ {
case Constants.PREFERENCE_VALUE_ALL: pause = actionA2dpDisconnected || actionBluetoothDeviceDisconnected; case Constants.PREFERENCE_VALUE_ALL: pause = actionA2dpDisconnected || actionBluetoothDeviceDisconnected;
break; break;

View File

@ -46,8 +46,8 @@ public class MediaButtonIntentReceiver extends BroadcastReceiver
String intentAction = intent.getAction(); String intentAction = intent.getAction();
// If media button are turned off and we received a media button, exit // If media button are turned off and we received a media button, exit
if (!Util.getMediaButtonsEnabled(context) && if (!Util.getMediaButtonsEnabled() && Intent.ACTION_MEDIA_BUTTON.equals(intentAction))
Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) return; return;
// Only process media buttons and CMD_PROCESS_KEYCODE, which is received from the widgets // Only process media buttons and CMD_PROCESS_KEYCODE, which is received from the widgets
if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction) && if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction) &&

View File

@ -36,7 +36,6 @@ import org.moire.ultrasonic.domain.SearchCriteria;
import org.moire.ultrasonic.domain.SearchResult; import org.moire.ultrasonic.domain.SearchResult;
import org.moire.ultrasonic.domain.Share; import org.moire.ultrasonic.domain.Share;
import org.moire.ultrasonic.domain.UserInfo; import org.moire.ultrasonic.domain.UserInfo;
import org.moire.ultrasonic.util.CancellableTask;
import org.moire.ultrasonic.util.Constants; import org.moire.ultrasonic.util.Constants;
import org.moire.ultrasonic.util.LRUCache; import org.moire.ultrasonic.util.LRUCache;
import org.moire.ultrasonic.util.TimeLimitedCache; import org.moire.ultrasonic.util.TimeLimitedCache;
@ -88,27 +87,27 @@ public class CachedMusicService implements MusicService
} }
@Override @Override
public void ping(Context context) throws Exception public void ping() throws Exception
{ {
checkSettingsChanged(); checkSettingsChanged();
musicService.ping(context); musicService.ping();
} }
@Override @Override
public boolean isLicenseValid(Context context) throws Exception public boolean isLicenseValid() throws Exception
{ {
checkSettingsChanged(); checkSettingsChanged();
Boolean result = cachedLicenseValid.get(); Boolean result = cachedLicenseValid.get();
if (result == null) if (result == null)
{ {
result = musicService.isLicenseValid(context); result = musicService.isLicenseValid();
cachedLicenseValid.set(result, result ? 30L * 60L : 2L * 60L, TimeUnit.SECONDS); cachedLicenseValid.set(result, result ? 30L * 60L : 2L * 60L, TimeUnit.SECONDS);
} }
return result; return result;
} }
@Override @Override
public List<MusicFolder> getMusicFolders(boolean refresh, Context context) throws Exception public List<MusicFolder> getMusicFolders(boolean refresh) throws Exception
{ {
checkSettingsChanged(); checkSettingsChanged();
if (refresh) if (refresh)
@ -118,14 +117,14 @@ public class CachedMusicService implements MusicService
List<MusicFolder> result = cachedMusicFolders.get(); List<MusicFolder> result = cachedMusicFolders.get();
if (result == null) if (result == null)
{ {
result = musicService.getMusicFolders(refresh, context); result = musicService.getMusicFolders(refresh);
cachedMusicFolders.set(result); cachedMusicFolders.set(result);
} }
return result; return result;
} }
@Override @Override
public Indexes getIndexes(String musicFolderId, boolean refresh, Context context) throws Exception public Indexes getIndexes(String musicFolderId, boolean refresh) throws Exception
{ {
checkSettingsChanged(); checkSettingsChanged();
if (refresh) if (refresh)
@ -137,14 +136,14 @@ public class CachedMusicService implements MusicService
Indexes result = cachedIndexes.get(); Indexes result = cachedIndexes.get();
if (result == null) if (result == null)
{ {
result = musicService.getIndexes(musicFolderId, refresh, context); result = musicService.getIndexes(musicFolderId, refresh);
cachedIndexes.set(result); cachedIndexes.set(result);
} }
return result; return result;
} }
@Override @Override
public Indexes getArtists(boolean refresh, Context context) throws Exception public Indexes getArtists(boolean refresh) throws Exception
{ {
checkSettingsChanged(); checkSettingsChanged();
if (refresh) if (refresh)
@ -154,14 +153,14 @@ public class CachedMusicService implements MusicService
Indexes result = cachedArtists.get(); Indexes result = cachedArtists.get();
if (result == null) if (result == null)
{ {
result = musicService.getArtists(refresh, context); result = musicService.getArtists(refresh);
cachedArtists.set(result); cachedArtists.set(result);
} }
return result; return result;
} }
@Override @Override
public MusicDirectory getMusicDirectory(String id, String name, boolean refresh, Context context) throws Exception public MusicDirectory getMusicDirectory(String id, String name, boolean refresh) throws Exception
{ {
checkSettingsChanged(); checkSettingsChanged();
TimeLimitedCache<MusicDirectory> cache = refresh ? null : cachedMusicDirectories.get(id); TimeLimitedCache<MusicDirectory> cache = refresh ? null : cachedMusicDirectories.get(id);
@ -170,8 +169,8 @@ public class CachedMusicService implements MusicService
if (dir == null) if (dir == null)
{ {
dir = musicService.getMusicDirectory(id, name, refresh, context); dir = musicService.getMusicDirectory(id, name, refresh);
cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(context), TimeUnit.SECONDS); cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(), TimeUnit.SECONDS);
cache.set(dir); cache.set(dir);
cachedMusicDirectories.put(id, cache); cachedMusicDirectories.put(id, cache);
} }
@ -179,15 +178,15 @@ public class CachedMusicService implements MusicService
} }
@Override @Override
public MusicDirectory getArtist(String id, String name, boolean refresh, Context context) throws Exception public MusicDirectory getArtist(String id, String name, boolean refresh) throws Exception
{ {
checkSettingsChanged(); checkSettingsChanged();
TimeLimitedCache<MusicDirectory> cache = refresh ? null : cachedArtist.get(id); TimeLimitedCache<MusicDirectory> cache = refresh ? null : cachedArtist.get(id);
MusicDirectory dir = cache == null ? null : cache.get(); MusicDirectory dir = cache == null ? null : cache.get();
if (dir == null) if (dir == null)
{ {
dir = musicService.getArtist(id, name, refresh, context); dir = musicService.getArtist(id, name, refresh);
cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(context), TimeUnit.SECONDS); cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(), TimeUnit.SECONDS);
cache.set(dir); cache.set(dir);
cachedArtist.put(id, cache); cachedArtist.put(id, cache);
} }
@ -195,15 +194,15 @@ public class CachedMusicService implements MusicService
} }
@Override @Override
public MusicDirectory getAlbum(String id, String name, boolean refresh, Context context) throws Exception public MusicDirectory getAlbum(String id, String name, boolean refresh) throws Exception
{ {
checkSettingsChanged(); checkSettingsChanged();
TimeLimitedCache<MusicDirectory> cache = refresh ? null : cachedAlbum.get(id); TimeLimitedCache<MusicDirectory> cache = refresh ? null : cachedAlbum.get(id);
MusicDirectory dir = cache == null ? null : cache.get(); MusicDirectory dir = cache == null ? null : cache.get();
if (dir == null) if (dir == null)
{ {
dir = musicService.getAlbum(id, name, refresh, context); dir = musicService.getAlbum(id, name, refresh);
cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(context), TimeUnit.SECONDS); cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(), TimeUnit.SECONDS);
cache.set(dir); cache.set(dir);
cachedAlbum.put(id, cache); cachedAlbum.put(id, cache);
} }
@ -285,15 +284,15 @@ public class CachedMusicService implements MusicService
} }
@Override @Override
public MusicDirectory getAlbumList(String type, int size, int offset, String musicFolderId, Context context) throws Exception public MusicDirectory getAlbumList(String type, int size, int offset, String musicFolderId) throws Exception
{ {
return musicService.getAlbumList(type, size, offset, musicFolderId, context); return musicService.getAlbumList(type, size, offset, musicFolderId);
} }
@Override @Override
public MusicDirectory getAlbumList2(String type, int size, int offset, String musicFolderId, Context context) throws Exception public MusicDirectory getAlbumList2(String type, int size, int offset, String musicFolderId) throws Exception
{ {
return musicService.getAlbumList2(type, size, offset, musicFolderId, context); return musicService.getAlbumList2(type, size, offset, musicFolderId);
} }
@Override @Override
@ -303,15 +302,15 @@ public class CachedMusicService implements MusicService
} }
@Override @Override
public SearchResult getStarred(Context context) throws Exception public SearchResult getStarred() throws Exception
{ {
return musicService.getStarred(context); return musicService.getStarred();
} }
@Override @Override
public SearchResult getStarred2(Context context) throws Exception public SearchResult getStarred2() throws Exception
{ {
return musicService.getStarred2(context); return musicService.getStarred2();
} }
@Override @Override
@ -389,25 +388,25 @@ public class CachedMusicService implements MusicService
} }
@Override @Override
public void star(String id, String albumId, String artistId, Context context) throws Exception public void star(String id, String albumId, String artistId) throws Exception
{ {
musicService.star(id, albumId, artistId, context); musicService.star(id, albumId, artistId);
} }
@Override @Override
public void unstar(String id, String albumId, String artistId, Context context) throws Exception public void unstar(String id, String albumId, String artistId) throws Exception
{ {
musicService.unstar(id, albumId, artistId, context); musicService.unstar(id, albumId, artistId);
} }
@Override @Override
public void setRating(String id, int rating, Context context) throws Exception public void setRating(String id, int rating) throws Exception
{ {
musicService.setRating(id, rating, context); musicService.setRating(id, rating);
} }
@Override @Override
public List<Genre> getGenres(boolean refresh, Context context) throws Exception public List<Genre> getGenres(boolean refresh) throws Exception
{ {
checkSettingsChanged(); checkSettingsChanged();
if (refresh) if (refresh)
@ -418,7 +417,7 @@ public class CachedMusicService implements MusicService
if (result == null) if (result == null)
{ {
result = musicService.getGenres(refresh, context); result = musicService.getGenres(refresh);
cachedGenres.set(result); cachedGenres.set(result);
} }
@ -487,7 +486,7 @@ public class CachedMusicService implements MusicService
if (dir == null) if (dir == null)
{ {
dir = musicService.getVideos(refresh, context); dir = musicService.getVideos(refresh, context);
cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(context), TimeUnit.SECONDS); cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(), TimeUnit.SECONDS);
cache.set(dir); cache.set(dir);
cachedMusicDirectories.put(Constants.INTENT_EXTRA_NAME_VIDEOS, cache); cachedMusicDirectories.put(Constants.INTENT_EXTRA_NAME_VIDEOS, cache);
} }
@ -507,7 +506,7 @@ public class CachedMusicService implements MusicService
if (userInfo == null) if (userInfo == null)
{ {
userInfo = musicService.getUser(username, context); userInfo = musicService.getUser(username, context);
cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(context), TimeUnit.SECONDS); cache = new TimeLimitedCache<>(Util.getDirectoryCacheTime(), TimeUnit.SECONDS);
cache.set(userInfo); cache.set(userInfo);
cachedUserInfo.put(username, cache); cachedUserInfo.put(username, cache);
} }

View File

@ -158,7 +158,7 @@ public class Downloader
DownloadFile downloadFile = downloadList.get(i); DownloadFile downloadFile = downloadList.get(i);
if (!downloadFile.isWorkDone()) if (!downloadFile.isWorkDone())
{ {
if (downloadFile.shouldSave() || preloaded < Util.getPreloadCount(context)) if (downloadFile.shouldSave() || preloaded < Util.getPreloadCount())
{ {
currentDownloading = downloadFile; currentDownloading = downloadFile;
currentDownloading.download(); currentDownloading.download();
@ -181,7 +181,7 @@ public class Downloader
} }
// If the downloadList contains no work, check the backgroundDownloadList // If the downloadList contains no work, check the backgroundDownloadList
if ((preloaded + 1 == n || preloaded >= Util.getPreloadCount(context) || downloadList.isEmpty()) && !backgroundDownloadList.isEmpty()) if ((preloaded + 1 == n || preloaded >= Util.getPreloadCount() || downloadList.isEmpty()) && !backgroundDownloadList.isEmpty())
{ {
for (int i = 0; i < backgroundDownloadList.size(); i++) for (int i = 0; i < backgroundDownloadList.size(); i++)
{ {
@ -401,7 +401,7 @@ public class Downloader
private synchronized void checkShufflePlay(Context context) private synchronized void checkShufflePlay(Context context)
{ {
// Get users desired random playlist size // Get users desired random playlist size
int listSize = Util.getMaxSongs(context); int listSize = Util.getMaxSongs();
boolean wasEmpty = downloadList.isEmpty(); boolean wasEmpty = downloadList.isEmpty();
long revisionBefore = revision; long revisionBefore = revision;

View File

@ -160,7 +160,7 @@ public class JukeboxMediaPlayer
try try
{ {
if (!ActiveServerProvider.Companion.isOffline(context)) if (!ActiveServerProvider.Companion.isOffline())
{ {
task = tasks.take(); task = tasks.take();
JukeboxStatus status = task.execute(); JukeboxStatus status = task.execute();
@ -300,7 +300,7 @@ public class JukeboxMediaPlayer
private MusicService getMusicService() private MusicService getMusicService()
{ {
return MusicServiceFactory.getMusicService(context); return MusicServiceFactory.getMusicService();
} }
public int getPositionSeconds() public int getPositionSeconds()

View File

@ -309,13 +309,13 @@ public class MediaPlayerControllerImpl implements MediaPlayerController
@Override @Override
public RepeatMode getRepeatMode() public RepeatMode getRepeatMode()
{ {
return Util.getRepeatMode(context); return Util.getRepeatMode();
} }
@Override @Override
public synchronized void setRepeatMode(RepeatMode repeatMode) public synchronized void setRepeatMode(RepeatMode repeatMode)
{ {
Util.setRepeatMode(context, repeatMode); Util.setRepeatMode(repeatMode);
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) mediaPlayerService.setNextPlaying(); if (mediaPlayerService != null) mediaPlayerService.setNextPlaying();
} }
@ -527,7 +527,7 @@ public class MediaPlayerControllerImpl implements MediaPlayerController
try try
{ {
String username = activeServerProvider.getValue().getActiveServer().getUserName(); String username = activeServerProvider.getValue().getActiveServer().getUserName();
UserInfo user = MusicServiceFactory.getMusicService(context).getUser(username, context); UserInfo user = MusicServiceFactory.getMusicService().getUser(username, context);
return user.getJukeboxRole(); return user.getJukeboxRole();
} }
catch (Exception e) catch (Exception e)
@ -608,7 +608,7 @@ public class MediaPlayerControllerImpl implements MediaPlayerController
new Thread(() -> { new Thread(() -> {
try try
{ {
MusicServiceFactory.getMusicService(context).setRating(song.getId(), rating, context); MusicServiceFactory.getMusicService().setRating(song.getId(), rating);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -138,7 +138,7 @@ public class MediaPlayerLifecycleSupport
* while Ultrasonic is running. * while Ultrasonic is running.
*/ */
private void registerHeadsetReceiver() { private void registerHeadsetReceiver() {
final SharedPreferences sp = Util.getPreferences(context); final SharedPreferences sp = Util.getPreferences();
final String spKey = context final String spKey = context
.getString(R.string.settings_playback_resume_play_on_headphones_plug); .getString(R.string.settings_playback_resume_play_on_headphones_plug);
@ -190,7 +190,7 @@ public class MediaPlayerLifecycleSupport
final int keyCode; final int keyCode;
int receivedKeyCode = event.getKeyCode(); int receivedKeyCode = event.getKeyCode();
// Translate PLAY and PAUSE codes to PLAY_PAUSE to improve compatibility with old Bluetooth devices // Translate PLAY and PAUSE codes to PLAY_PAUSE to improve compatibility with old Bluetooth devices
if (Util.getSingleButtonPlayPause(context) && if (Util.getSingleButtonPlayPause() &&
(receivedKeyCode == KeyEvent.KEYCODE_MEDIA_PLAY || (receivedKeyCode == KeyEvent.KEYCODE_MEDIA_PLAY ||
receivedKeyCode == KeyEvent.KEYCODE_MEDIA_PAUSE)) { receivedKeyCode == KeyEvent.KEYCODE_MEDIA_PAUSE)) {
Timber.i("Single button Play/Pause is set, rewriting keyCode to PLAY_PAUSE"); Timber.i("Single button Play/Pause is set, rewriting keyCode to PLAY_PAUSE");

View File

@ -35,7 +35,6 @@ import org.moire.ultrasonic.domain.SearchCriteria;
import org.moire.ultrasonic.domain.SearchResult; import org.moire.ultrasonic.domain.SearchResult;
import org.moire.ultrasonic.domain.Share; import org.moire.ultrasonic.domain.Share;
import org.moire.ultrasonic.domain.UserInfo; import org.moire.ultrasonic.domain.UserInfo;
import org.moire.ultrasonic.util.CancellableTask;
import java.io.InputStream; import java.io.InputStream;
import java.util.List; import java.util.List;
@ -48,29 +47,29 @@ import kotlin.Pair;
public interface MusicService public interface MusicService
{ {
void ping(Context context) throws Exception; void ping() throws Exception;
boolean isLicenseValid(Context context) throws Exception; boolean isLicenseValid() throws Exception;
List<Genre> getGenres(boolean refresh, Context context) throws Exception; List<Genre> getGenres(boolean refresh) throws Exception;
void star(String id, String albumId, String artistId, Context context) throws Exception; void star(String id, String albumId, String artistId) throws Exception;
void unstar(String id, String albumId, String artistId, Context context) throws Exception; void unstar(String id, String albumId, String artistId) throws Exception;
void setRating(String id, int rating, Context context) throws Exception; void setRating(String id, int rating) throws Exception;
List<MusicFolder> getMusicFolders(boolean refresh, Context context) throws Exception; List<MusicFolder> getMusicFolders(boolean refresh) throws Exception;
Indexes getIndexes(String musicFolderId, boolean refresh, Context context) throws Exception; Indexes getIndexes(String musicFolderId, boolean refresh) throws Exception;
Indexes getArtists(boolean refresh, Context context) throws Exception; Indexes getArtists(boolean refresh) throws Exception;
MusicDirectory getMusicDirectory(String id, String name, boolean refresh, Context context) throws Exception; MusicDirectory getMusicDirectory(String id, String name, boolean refresh) throws Exception;
MusicDirectory getArtist(String id, String name, boolean refresh, Context context) throws Exception; MusicDirectory getArtist(String id, String name, boolean refresh) throws Exception;
MusicDirectory getAlbum(String id, String name, boolean refresh, Context context) throws Exception; MusicDirectory getAlbum(String id, String name, boolean refresh) throws Exception;
SearchResult search(SearchCriteria criteria, Context context) throws Exception; SearchResult search(SearchCriteria criteria, Context context) throws Exception;
@ -90,17 +89,17 @@ public interface MusicService
void scrobble(String id, boolean submission, Context context) throws Exception; void scrobble(String id, boolean submission, Context context) throws Exception;
MusicDirectory getAlbumList(String type, int size, int offset, String musicFolderId, Context context) throws Exception; MusicDirectory getAlbumList(String type, int size, int offset, String musicFolderId) throws Exception;
MusicDirectory getAlbumList2(String type, int size, int offset, String musicFolderId, Context context) throws Exception; MusicDirectory getAlbumList2(String type, int size, int offset, String musicFolderId) throws Exception;
MusicDirectory getRandomSongs(int size, Context context) throws Exception; MusicDirectory getRandomSongs(int size, Context context) throws Exception;
MusicDirectory getSongsByGenre(String genre, int count, int offset, Context context) throws Exception; MusicDirectory getSongsByGenre(String genre, int count, int offset, Context context) throws Exception;
SearchResult getStarred(Context context) throws Exception; SearchResult getStarred() throws Exception;
SearchResult getStarred2(Context context) throws Exception; SearchResult getStarred2() throws Exception;
Bitmap getCoverArt(Context context, MusicDirectory.Entry entry, int size, boolean saveToFile, boolean highQuality) throws Exception; Bitmap getCoverArt(Context context, MusicDirectory.Entry entry, int size, boolean saveToFile, boolean highQuality) throws Exception;

View File

@ -41,7 +41,6 @@ import org.moire.ultrasonic.domain.SearchCriteria;
import org.moire.ultrasonic.domain.SearchResult; import org.moire.ultrasonic.domain.SearchResult;
import org.moire.ultrasonic.domain.Share; import org.moire.ultrasonic.domain.Share;
import org.moire.ultrasonic.domain.UserInfo; import org.moire.ultrasonic.domain.UserInfo;
import org.moire.ultrasonic.util.CancellableTask;
import org.moire.ultrasonic.util.Constants; import org.moire.ultrasonic.util.Constants;
import org.moire.ultrasonic.util.FileUtil; import org.moire.ultrasonic.util.FileUtil;
import org.moire.ultrasonic.util.Util; import org.moire.ultrasonic.util.Util;
@ -78,10 +77,10 @@ public class OfflineMusicService implements MusicService
private final Lazy<ActiveServerProvider> activeServerProvider = inject(ActiveServerProvider.class); private final Lazy<ActiveServerProvider> activeServerProvider = inject(ActiveServerProvider.class);
@Override @Override
public Indexes getIndexes(String musicFolderId, boolean refresh, Context context) public Indexes getIndexes(String musicFolderId, boolean refresh)
{ {
List<Artist> artists = new ArrayList<>(); List<Artist> artists = new ArrayList<>();
File root = FileUtil.getMusicDirectory(context); File root = FileUtil.getMusicDirectory();
for (File file : FileUtil.listFiles(root)) for (File file : FileUtil.listFiles(root))
{ {
if (file.isDirectory()) if (file.isDirectory())
@ -143,7 +142,7 @@ public class OfflineMusicService implements MusicService
} }
@Override @Override
public MusicDirectory getMusicDirectory(String id, String artistName, boolean refresh, Context context) public MusicDirectory getMusicDirectory(String id, String artistName, boolean refresh)
{ {
File dir = new File(id); File dir = new File(id);
MusicDirectory result = new MusicDirectory(); MusicDirectory result = new MusicDirectory();
@ -157,7 +156,7 @@ public class OfflineMusicService implements MusicService
if (name != null & !names.contains(name)) if (name != null & !names.contains(name))
{ {
names.add(name); names.add(name);
result.addChild(createEntry(context, file, name)); result.addChild(createEntry(file, name));
} }
} }
@ -182,14 +181,14 @@ public class OfflineMusicService implements MusicService
return FileUtil.getBaseName(name); return FileUtil.getBaseName(name);
} }
private static MusicDirectory.Entry createEntry(Context context, File file, String name) private static MusicDirectory.Entry createEntry(File file, String name)
{ {
MusicDirectory.Entry entry = new MusicDirectory.Entry(); MusicDirectory.Entry entry = new MusicDirectory.Entry();
entry.setDirectory(file.isDirectory()); entry.setDirectory(file.isDirectory());
entry.setId(file.getPath()); entry.setId(file.getPath());
entry.setParent(file.getParent()); entry.setParent(file.getParent());
entry.setSize(file.length()); entry.setSize(file.length());
String root = FileUtil.getMusicDirectory(context).getPath(); String root = FileUtil.getMusicDirectory().getPath();
entry.setPath(file.getPath().replaceFirst(String.format("^%s/", root), "")); entry.setPath(file.getPath().replaceFirst(String.format("^%s/", root), ""));
entry.setTitle(name); entry.setTitle(name);
@ -323,7 +322,7 @@ public class OfflineMusicService implements MusicService
entry.setSuffix(FileUtil.getExtension(file.getName().replace(".complete", ""))); entry.setSuffix(FileUtil.getExtension(file.getName().replace(".complete", "")));
File albumArt = FileUtil.getAlbumArtFile(context, entry); File albumArt = FileUtil.getAlbumArtFile(entry);
if (albumArt.exists()) if (albumArt.exists())
{ {
@ -338,7 +337,7 @@ public class OfflineMusicService implements MusicService
{ {
try try
{ {
Bitmap bitmap = FileUtil.getAvatarBitmap(context, username, size, highQuality); Bitmap bitmap = FileUtil.getAvatarBitmap(username, size, highQuality);
return Util.scaleBitmap(bitmap, size); return Util.scaleBitmap(bitmap, size);
} }
catch (Exception e) catch (Exception e)
@ -367,7 +366,7 @@ public class OfflineMusicService implements MusicService
List<Artist> artists = new ArrayList<>(); List<Artist> artists = new ArrayList<>();
List<MusicDirectory.Entry> albums = new ArrayList<>(); List<MusicDirectory.Entry> albums = new ArrayList<>();
List<MusicDirectory.Entry> songs = new ArrayList<>(); List<MusicDirectory.Entry> songs = new ArrayList<>();
File root = FileUtil.getMusicDirectory(context); File root = FileUtil.getMusicDirectory();
int closeness; int closeness;
for (File artistFile : FileUtil.listFiles(root)) for (File artistFile : FileUtil.listFiles(root))
@ -443,7 +442,7 @@ public class OfflineMusicService implements MusicService
String albumName = getName(albumFile); String albumName = getName(albumFile);
if ((closeness = matchCriteria(criteria, albumName)) > 0) if ((closeness = matchCriteria(criteria, albumName)) > 0)
{ {
MusicDirectory.Entry album = createEntry(context, albumFile, albumName); MusicDirectory.Entry album = createEntry(albumFile, albumName);
album.setArtist(artistName); album.setArtist(artistName);
album.setCloseness(closeness); album.setCloseness(closeness);
albums.add(album); albums.add(album);
@ -459,7 +458,7 @@ public class OfflineMusicService implements MusicService
} }
else if ((closeness = matchCriteria(criteria, songName)) > 0) else if ((closeness = matchCriteria(criteria, songName)) > 0)
{ {
MusicDirectory.Entry song = createEntry(context, albumFile, songName); MusicDirectory.Entry song = createEntry(albumFile, songName);
song.setArtist(artistName); song.setArtist(artistName);
song.setAlbum(albumName); song.setAlbum(albumName);
song.setCloseness(closeness); song.setCloseness(closeness);
@ -473,7 +472,7 @@ public class OfflineMusicService implements MusicService
if ((closeness = matchCriteria(criteria, songName)) > 0) if ((closeness = matchCriteria(criteria, songName)) > 0)
{ {
MusicDirectory.Entry song = createEntry(context, albumFile, songName); MusicDirectory.Entry song = createEntry(albumFile, songName);
song.setArtist(artistName); song.setArtist(artistName);
song.setAlbum(songName); song.setAlbum(songName);
song.setCloseness(closeness); song.setCloseness(closeness);
@ -509,7 +508,7 @@ public class OfflineMusicService implements MusicService
public List<Playlist> getPlaylists(boolean refresh, Context context) public List<Playlist> getPlaylists(boolean refresh, Context context)
{ {
List<Playlist> playlists = new ArrayList<>(); List<Playlist> playlists = new ArrayList<>();
File root = FileUtil.getPlaylistDirectory(context); File root = FileUtil.getPlaylistDirectory();
String lastServer = null; String lastServer = null;
boolean removeServer = true; boolean removeServer = true;
for (File folder : FileUtil.listFiles(root)) for (File folder : FileUtil.listFiles(root))
@ -578,7 +577,7 @@ public class OfflineMusicService implements MusicService
name = name.substring(id.length() + 2); name = name.substring(id.length() + 2);
} }
File playlistFile = FileUtil.getPlaylistFile(context, id, name); File playlistFile = FileUtil.getPlaylistFile(id, name);
reader = new FileReader(playlistFile); reader = new FileReader(playlistFile);
buffer = new BufferedReader(reader); buffer = new BufferedReader(reader);
@ -593,7 +592,7 @@ public class OfflineMusicService implements MusicService
if (entryFile.exists() && entryName != null) if (entryFile.exists() && entryName != null)
{ {
playlist.addChild(createEntry(context, entryFile, entryName)); playlist.addChild(createEntry(entryFile, entryName));
} }
} }
@ -609,7 +608,7 @@ public class OfflineMusicService implements MusicService
@Override @Override
public void createPlaylist(String id, String name, List<MusicDirectory.Entry> entries, Context context) throws Exception public void createPlaylist(String id, String name, List<MusicDirectory.Entry> entries, Context context) throws Exception
{ {
File playlistFile = FileUtil.getPlaylistFile(context, activeServerProvider.getValue().getActiveServer().getName(), name); File playlistFile = FileUtil.getPlaylistFile(activeServerProvider.getValue().getActiveServer().getName(), name);
FileWriter fw = new FileWriter(playlistFile); FileWriter fw = new FileWriter(playlistFile);
BufferedWriter bw = new BufferedWriter(fw); BufferedWriter bw = new BufferedWriter(fw);
try try
@ -617,7 +616,7 @@ public class OfflineMusicService implements MusicService
fw.write("#EXTM3U\n"); fw.write("#EXTM3U\n");
for (MusicDirectory.Entry e : entries) for (MusicDirectory.Entry e : entries)
{ {
String filePath = FileUtil.getSongFile(context, e).getAbsolutePath(); String filePath = FileUtil.getSongFile(e).getAbsolutePath();
if (!new File(filePath).exists()) if (!new File(filePath).exists())
{ {
String ext = FileUtil.getExtension(filePath); String ext = FileUtil.getExtension(filePath);
@ -642,7 +641,7 @@ public class OfflineMusicService implements MusicService
@Override @Override
public MusicDirectory getRandomSongs(int size, Context context) public MusicDirectory getRandomSongs(int size, Context context)
{ {
File root = FileUtil.getMusicDirectory(context); File root = FileUtil.getMusicDirectory();
List<File> children = new LinkedList<>(); List<File> children = new LinkedList<>();
listFilesRecursively(root, children); listFilesRecursively(root, children);
MusicDirectory result = new MusicDirectory(); MusicDirectory result = new MusicDirectory();
@ -656,7 +655,7 @@ public class OfflineMusicService implements MusicService
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
{ {
File file = children.get(random.nextInt(children.size())); File file = children.get(random.nextInt(children.size()));
result.addChild(createEntry(context, file, getName(file))); result.addChild(createEntry(file, getName(file)));
} }
return result; return result;
@ -702,7 +701,7 @@ public class OfflineMusicService implements MusicService
} }
@Override @Override
public MusicDirectory getAlbumList(String type, int size, int offset, String musicFolderId, Context context) throws Exception public MusicDirectory getAlbumList(String type, int size, int offset, String musicFolderId) throws Exception
{ {
throw new OfflineException("Album lists not available in offline mode"); throw new OfflineException("Album lists not available in offline mode");
} }
@ -744,7 +743,7 @@ public class OfflineMusicService implements MusicService
} }
@Override @Override
public SearchResult getStarred(Context context) throws Exception public SearchResult getStarred() throws Exception
{ {
throw new OfflineException("Starred not available in offline mode"); throw new OfflineException("Starred not available in offline mode");
} }
@ -756,7 +755,7 @@ public class OfflineMusicService implements MusicService
} }
@Override @Override
public List<Genre> getGenres(boolean refresh, Context context) throws Exception public List<Genre> getGenres(boolean refresh) throws Exception
{ {
throw new OfflineException("Getting Genres not available in offline mode"); throw new OfflineException("Getting Genres not available in offline mode");
} }
@ -792,24 +791,24 @@ public class OfflineMusicService implements MusicService
} }
@Override @Override
public void star(String id, String albumId, String artistId, Context context) throws Exception public void star(String id, String albumId, String artistId) throws Exception
{ {
throw new OfflineException("Star not available in offline mode"); throw new OfflineException("Star not available in offline mode");
} }
@Override @Override
public void unstar(String id, String albumId, String artistId, Context context) throws Exception public void unstar(String id, String albumId, String artistId) throws Exception
{ {
throw new OfflineException("UnStar not available in offline mode"); throw new OfflineException("UnStar not available in offline mode");
} }
@Override @Override
public List<MusicFolder> getMusicFolders(boolean refresh, Context context) throws Exception public List<MusicFolder> getMusicFolders(boolean refresh) throws Exception
{ {
throw new OfflineException("Music folders not available in offline mode"); throw new OfflineException("Music folders not available in offline mode");
} }
@Override @Override
public MusicDirectory getAlbumList2(String type, int size, int offset, String musicFolderId, Context context) { public MusicDirectory getAlbumList2(String type, int size, int offset, String musicFolderId) {
Timber.w("OfflineMusicService.getAlbumList2 was called but it isn't available"); Timber.w("OfflineMusicService.getAlbumList2 was called but it isn't available");
return null; return null;
} }
@ -854,34 +853,34 @@ public class OfflineMusicService implements MusicService
} }
@Override @Override
public SearchResult getStarred2(Context context) { public SearchResult getStarred2() {
Timber.w("OfflineMusicService.getStarred2 was called but it isn't available"); Timber.w("OfflineMusicService.getStarred2 was called but it isn't available");
return null; return null;
} }
@Override @Override
public void ping(Context context) { public void ping() {
} }
@Override @Override
public boolean isLicenseValid(Context context) { public boolean isLicenseValid() {
return true; return true;
} }
@Override @Override
public Indexes getArtists(boolean refresh, Context context) { public Indexes getArtists(boolean refresh) {
Timber.w("OfflineMusicService.getArtists was called but it isn't available"); Timber.w("OfflineMusicService.getArtists was called but it isn't available");
return null; return null;
} }
@Override @Override
public MusicDirectory getArtist(String id, String name, boolean refresh, Context context) { public MusicDirectory getArtist(String id, String name, boolean refresh) {
Timber.w("OfflineMusicService.getArtist was called but it isn't available"); Timber.w("OfflineMusicService.getArtist was called but it isn't available");
return null; return null;
} }
@Override @Override
public MusicDirectory getAlbum(String id, String name, boolean refresh, Context context) { public MusicDirectory getAlbum(String id, String name, boolean refresh) {
Timber.w("OfflineMusicService.getAlbum was called but it isn't available"); Timber.w("OfflineMusicService.getAlbum was called but it isn't available");
return null; return null;
} }
@ -899,7 +898,7 @@ public class OfflineMusicService implements MusicService
} }
@Override @Override
public void setRating(String id, int rating, Context context) { public void setRating(String id, int rating) {
Timber.w("OfflineMusicService.setRating was called but it isn't available"); Timber.w("OfflineMusicService.setRating was called but it isn't available");
} }

View File

@ -18,7 +18,7 @@ public class Scrobbler
public void scrobble(final Context context, final DownloadFile song, final boolean submission) public void scrobble(final Context context, final DownloadFile song, final boolean submission)
{ {
if (song == null || !ActiveServerProvider.Companion.isScrobblingEnabled(context)) return; if (song == null || !ActiveServerProvider.Companion.isScrobblingEnabled()) return;
final String id = song.getSong().getId(); final String id = song.getSong().getId();
if (id == null) return; if (id == null) return;
@ -36,7 +36,7 @@ public class Scrobbler
@Override @Override
public void run() public void run()
{ {
MusicService service = MusicServiceFactory.getMusicService(context); MusicService service = MusicServiceFactory.getMusicService();
try try
{ {
service.scrobble(id, submission, context); service.scrobble(id, submission, context);

View File

@ -70,7 +70,7 @@ public class AlbumHeader
if (!entry.isDirectory()) if (!entry.isDirectory())
{ {
if (Util.shouldUseFolderForArtistName(context)) if (Util.shouldUseFolderForArtistName())
{ {
albumHeader.processGrandParents(entry); albumHeader.processGrandParents(entry);
} }

View File

@ -98,9 +98,9 @@ public class CacheCleaner
if (children != null) if (children != null)
{ {
// No songs left in the folder // No songs left in the folder
if (children.length == 1 && children[0].getPath().equals(FileUtil.getAlbumArtFile(context, dir).getPath())) if (children.length == 1 && children[0].getPath().equals(FileUtil.getAlbumArtFile(dir).getPath()))
{ {
Util.delete(FileUtil.getAlbumArtFile(context, dir)); Util.delete(FileUtil.getAlbumArtFile(dir));
children = dir.listFiles(); children = dir.listFiles();
} }
@ -120,7 +120,7 @@ public class CacheCleaner
return 0L; return 0L;
} }
long cacheSizeBytes = Util.getCacheSizeMB(context) * 1024L * 1024L; long cacheSizeBytes = Util.getCacheSizeMB() * 1024L * 1024L;
long bytesUsedBySubsonic = 0L; long bytesUsedBySubsonic = 0L;
for (File file : files) for (File file : files)
@ -232,7 +232,7 @@ public class CacheCleaner
filesToNotDelete.add(downloadFile.getCompleteOrSaveFile()); filesToNotDelete.add(downloadFile.getCompleteOrSaveFile());
} }
filesToNotDelete.add(FileUtil.getMusicDirectory(context)); filesToNotDelete.add(FileUtil.getMusicDirectory());
return filesToNotDelete; return filesToNotDelete;
} }
@ -247,7 +247,7 @@ public class CacheCleaner
List<File> files = new ArrayList<File>(); List<File> files = new ArrayList<File>();
List<File> dirs = new ArrayList<File>(); List<File> dirs = new ArrayList<File>();
findCandidatesForDeletion(FileUtil.getMusicDirectory(context), files, dirs); findCandidatesForDeletion(FileUtil.getMusicDirectory(), files, dirs);
sortByAscendingModificationTime(files); sortByAscendingModificationTime(files);
Set<File> filesToNotDelete = findFilesToNotDelete(); Set<File> filesToNotDelete = findFilesToNotDelete();
@ -274,7 +274,7 @@ public class CacheCleaner
Thread.currentThread().setName("BackgroundSpaceCleanup"); Thread.currentThread().setName("BackgroundSpaceCleanup");
List<File> files = new ArrayList<File>(); List<File> files = new ArrayList<File>();
List<File> dirs = new ArrayList<File>(); List<File> dirs = new ArrayList<File>();
findCandidatesForDeletion(FileUtil.getMusicDirectory(context), files, dirs); findCandidatesForDeletion(FileUtil.getMusicDirectory(), files, dirs);
long bytesToDelete = getMinimumDelete(files); long bytesToDelete = getMinimumDelete(files);
if (bytesToDelete > 0L) if (bytesToDelete > 0L)
@ -302,11 +302,11 @@ public class CacheCleaner
{ {
Thread.currentThread().setName("BackgroundPlaylistsCleanup"); Thread.currentThread().setName("BackgroundPlaylistsCleanup");
String server = activeServerProvider.getValue().getActiveServer().getName(); String server = activeServerProvider.getValue().getActiveServer().getName();
SortedSet<File> playlistFiles = FileUtil.listFiles(FileUtil.getPlaylistDirectory(context, server)); SortedSet<File> playlistFiles = FileUtil.listFiles(FileUtil.getPlaylistDirectory(server));
List<Playlist> playlists = params[0]; List<Playlist> playlists = params[0];
for (Playlist playlist : playlists) for (Playlist playlist : playlists)
{ {
playlistFiles.remove(FileUtil.getPlaylistFile(context, server, playlist.getName())); playlistFiles.remove(FileUtil.getPlaylistFile(server, playlist.getName()));
} }
for (File playlist : playlistFiles) for (File playlist : playlistFiles)

View File

@ -28,6 +28,7 @@ import android.text.TextUtils;
import kotlin.Lazy; import kotlin.Lazy;
import timber.log.Timber; import timber.log.Timber;
import org.moire.ultrasonic.app.UApp;
import org.moire.ultrasonic.domain.MusicDirectory; import org.moire.ultrasonic.domain.MusicDirectory;
import org.moire.ultrasonic.subsonic.ImageLoaderProvider; import org.moire.ultrasonic.subsonic.ImageLoaderProvider;
@ -62,9 +63,9 @@ public class FileUtil
private static final Lazy<ImageLoaderProvider> imageLoaderProvider = inject(ImageLoaderProvider.class); private static final Lazy<ImageLoaderProvider> imageLoaderProvider = inject(ImageLoaderProvider.class);
private static final Lazy<PermissionUtil> permissionUtil = inject(PermissionUtil.class); private static final Lazy<PermissionUtil> permissionUtil = inject(PermissionUtil.class);
public static File getSongFile(Context context, MusicDirectory.Entry song) public static File getSongFile(MusicDirectory.Entry song)
{ {
File dir = getAlbumDirectory(context, song); File dir = getAlbumDirectory(song);
// Do not generate new name for offline files. Offline files will have their Path as their Id. // Do not generate new name for offline files. Offline files will have their Path as their Id.
if (!TextUtils.isEmpty(song.getId())) if (!TextUtils.isEmpty(song.getId()))
@ -97,35 +98,35 @@ public class FileUtil
return new File(dir, fileName.toString()); return new File(dir, fileName.toString());
} }
public static File getPlaylistFile(Context context, String server, String name) public static File getPlaylistFile(String server, String name)
{ {
File playlistDir = getPlaylistDirectory(context, server); File playlistDir = getPlaylistDirectory(server);
return new File(playlistDir, String.format("%s.m3u", fileSystemSafe(name))); return new File(playlistDir, String.format("%s.m3u", fileSystemSafe(name)));
} }
public static File getPlaylistDirectory(Context context) public static File getPlaylistDirectory()
{ {
File playlistDir = new File(getUltrasonicDirectory(context), "playlists"); File playlistDir = new File(getUltrasonicDirectory(), "playlists");
ensureDirectoryExistsAndIsReadWritable(playlistDir); ensureDirectoryExistsAndIsReadWritable(playlistDir);
return playlistDir; return playlistDir;
} }
public static File getPlaylistDirectory(Context context, String server) public static File getPlaylistDirectory(String server)
{ {
File playlistDir = new File(getPlaylistDirectory(context), server); File playlistDir = new File(getPlaylistDirectory(), server);
ensureDirectoryExistsAndIsReadWritable(playlistDir); ensureDirectoryExistsAndIsReadWritable(playlistDir);
return playlistDir; return playlistDir;
} }
public static File getAlbumArtFile(Context context, MusicDirectory.Entry entry) public static File getAlbumArtFile(MusicDirectory.Entry entry)
{ {
File albumDir = getAlbumDirectory(context, entry); File albumDir = getAlbumDirectory(entry);
return getAlbumArtFile(context, albumDir); return getAlbumArtFile(albumDir);
} }
public static File getAvatarFile(Context context, String username) public static File getAvatarFile(String username)
{ {
File albumArtDir = getAlbumArtDirectory(context); File albumArtDir = getAlbumArtDirectory();
if (albumArtDir == null || username == null) if (albumArtDir == null || username == null)
{ {
@ -136,9 +137,9 @@ public class FileUtil
return new File(albumArtDir, String.format("%s.jpeg", md5Hex)); return new File(albumArtDir, String.format("%s.jpeg", md5Hex));
} }
public static File getAlbumArtFile(Context context, File albumDir) public static File getAlbumArtFile(File albumDir)
{ {
File albumArtDir = getAlbumArtDirectory(context); File albumArtDir = getAlbumArtDirectory();
if (albumArtDir == null || albumDir == null) if (albumArtDir == null || albumDir == null)
{ {
@ -149,11 +150,11 @@ public class FileUtil
return new File(albumArtDir, String.format("%s.jpeg", md5Hex)); return new File(albumArtDir, String.format("%s.jpeg", md5Hex));
} }
public static Bitmap getAvatarBitmap(Context context, String username, int size, boolean highQuality) public static Bitmap getAvatarBitmap(String username, int size, boolean highQuality)
{ {
if (username == null) return null; if (username == null) return null;
File avatarFile = getAvatarFile(context, username); File avatarFile = getAvatarFile(username);
Bitmap bitmap = null; Bitmap bitmap = null;
ImageLoader imageLoader = imageLoaderProvider.getValue().getImageLoader(); ImageLoader imageLoader = imageLoaderProvider.getValue().getImageLoader();
@ -217,7 +218,7 @@ public class FileUtil
{ {
if (entry == null) return null; if (entry == null) return null;
File albumArtFile = getAlbumArtFile(context, entry); File albumArtFile = getAlbumArtFile(entry);
Bitmap bitmap = null; Bitmap bitmap = null;
ImageLoader imageLoader = imageLoaderProvider.getValue().getImageLoader(); ImageLoader imageLoader = imageLoaderProvider.getValue().getImageLoader();
@ -301,15 +302,15 @@ public class FileUtil
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opt); return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opt);
} }
public static File getAlbumArtDirectory(Context context) public static File getAlbumArtDirectory()
{ {
File albumArtDir = new File(getUltrasonicDirectory(context), "artwork"); File albumArtDir = new File(getUltrasonicDirectory(), "artwork");
ensureDirectoryExistsAndIsReadWritable(albumArtDir); ensureDirectoryExistsAndIsReadWritable(albumArtDir);
ensureDirectoryExistsAndIsReadWritable(new File(albumArtDir, ".nomedia")); ensureDirectoryExistsAndIsReadWritable(new File(albumArtDir, ".nomedia"));
return albumArtDir; return albumArtDir;
} }
public static File getAlbumDirectory(Context context, MusicDirectory.Entry entry) public static File getAlbumDirectory(MusicDirectory.Entry entry)
{ {
if (entry == null) if (entry == null)
{ {
@ -321,7 +322,7 @@ public class FileUtil
if (!TextUtils.isEmpty(entry.getPath())) if (!TextUtils.isEmpty(entry.getPath()))
{ {
File f = new File(fileSystemSafeDir(entry.getPath())); File f = new File(fileSystemSafeDir(entry.getPath()));
dir = new File(String.format("%s/%s", getMusicDirectory(context).getPath(), entry.isDirectory() ? f.getPath() : f.getParent())); dir = new File(String.format("%s/%s", getMusicDirectory().getPath(), entry.isDirectory() ? f.getPath() : f.getParent()));
} }
else else
{ {
@ -333,7 +334,7 @@ public class FileUtil
album = fileSystemSafe(entry.getTitle()); album = fileSystemSafe(entry.getTitle());
} }
dir = new File(String.format("%s/%s/%s", getMusicDirectory(context).getPath(), artist, album)); dir = new File(String.format("%s/%s/%s", getMusicDirectory().getPath(), artist, album));
} }
return dir; return dir;
@ -351,9 +352,9 @@ public class FileUtil
} }
} }
private static File getOrCreateDirectory(Context context, String name) private static File getOrCreateDirectory(String name)
{ {
File dir = new File(getUltrasonicDirectory(context), name); File dir = new File(getUltrasonicDirectory(), name);
if (!dir.exists() && !dir.mkdirs()) if (!dir.exists() && !dir.mkdirs())
{ {
@ -363,24 +364,24 @@ public class FileUtil
return dir; return dir;
} }
public static File getUltrasonicDirectory(Context context) public static File getUltrasonicDirectory()
{ {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
return new File(Environment.getExternalStorageDirectory(), "Android/data/org.moire.ultrasonic"); return new File(Environment.getExternalStorageDirectory(), "Android/data/org.moire.ultrasonic");
// After Android M, the location of the files must be queried differently. GetExternalFilesDir will always return a directory which Ultrasonic can access without any extra privileges. // After Android M, the location of the files must be queried differently. GetExternalFilesDir will always return a directory which Ultrasonic can access without any extra privileges.
return context.getExternalFilesDir(null); return UApp.Companion.applicationContext().getExternalFilesDir(null);
} }
public static File getDefaultMusicDirectory(Context context) public static File getDefaultMusicDirectory()
{ {
return getOrCreateDirectory(context, "music"); return getOrCreateDirectory("music");
} }
public static File getMusicDirectory(Context context) public static File getMusicDirectory()
{ {
File defaultMusicDirectory = getDefaultMusicDirectory(context); File defaultMusicDirectory = getDefaultMusicDirectory();
String path = Util.getPreferences(context).getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, defaultMusicDirectory.getPath()); String path = Util.getPreferences().getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, defaultMusicDirectory.getPath());
File dir = new File(path); File dir = new File(path);
boolean hasAccess = ensureDirectoryExistsAndIsReadWritable(dir); boolean hasAccess = ensureDirectoryExistsAndIsReadWritable(dir);

View File

@ -416,7 +416,7 @@ public class LegacyImageLoader implements Runnable, ImageLoader {
public void execute() { public void execute() {
try { try {
MusicService musicService = MusicServiceFactory.getMusicService(view.getContext()); MusicService musicService = MusicServiceFactory.getMusicService();
final boolean isAvatar = this.username != null && this.entry == null; final boolean isAvatar = this.username != null && this.entry == null;
final Bitmap bitmap = this.entry != null ? final Bitmap bitmap = this.entry != null ?
musicService.getCoverArt(view.getContext(), entry, size, saveToFile, highQuality) : musicService.getCoverArt(view.getContext(), entry, size, saveToFile, highQuality) :

View File

@ -60,8 +60,8 @@ public class PermissionUtil {
* @param callback callback function to execute after the permission request is finished * @param callback callback function to execute after the permission request is finished
*/ */
public void handlePermissionFailed(final PermissionRequestFinishedCallback callback) { public void handlePermissionFailed(final PermissionRequestFinishedCallback callback) {
String currentCachePath = Util.getPreferences(applicationContext).getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, FileUtil.getDefaultMusicDirectory(applicationContext).getPath()); String currentCachePath = Util.getPreferences().getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, FileUtil.getDefaultMusicDirectory().getPath());
String defaultCachePath = FileUtil.getDefaultMusicDirectory(applicationContext).getPath(); String defaultCachePath = FileUtil.getDefaultMusicDirectory().getPath();
// Ultrasonic can do nothing about this error when the Music Directory is already set to the default. // Ultrasonic can do nothing about this error when the Music Directory is already set to the default.
if (currentCachePath.compareTo(defaultCachePath) == 0) return; if (currentCachePath.compareTo(defaultCachePath) == 0) return;
@ -69,12 +69,12 @@ public class PermissionUtil {
if ((PermissionChecker.checkSelfPermission(applicationContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PERMISSION_DENIED) || if ((PermissionChecker.checkSelfPermission(applicationContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PERMISSION_DENIED) ||
(PermissionChecker.checkSelfPermission(applicationContext, Manifest.permission.READ_EXTERNAL_STORAGE) == PERMISSION_DENIED)) { (PermissionChecker.checkSelfPermission(applicationContext, Manifest.permission.READ_EXTERNAL_STORAGE) == PERMISSION_DENIED)) {
// While we request permission, the Music Directory is temporarily reset to its default location // While we request permission, the Music Directory is temporarily reset to its default location
setCacheLocation(applicationContext, FileUtil.getDefaultMusicDirectory(applicationContext).getPath()); setCacheLocation(applicationContext, FileUtil.getDefaultMusicDirectory().getPath());
// If the application is not running, we can't notify the user // If the application is not running, we can't notify the user
if (activityContext == null) return; if (activityContext == null) return;
requestFailedPermission(activityContext, currentCachePath, callback); requestFailedPermission(activityContext, currentCachePath, callback);
} else { } else {
setCacheLocation(applicationContext, FileUtil.getDefaultMusicDirectory(applicationContext).getPath()); setCacheLocation(applicationContext, FileUtil.getDefaultMusicDirectory().getPath());
// If the application is not running, we can't notify the user // If the application is not running, we can't notify the user
if (activityContext != null) { if (activityContext != null) {
new Handler(Looper.getMainLooper()).post(new Runnable() { new Handler(Looper.getMainLooper()).post(new Runnable() {
@ -136,7 +136,7 @@ public class PermissionUtil {
} }
private static void setCacheLocation(Context context, String cacheLocation) { private static void setCacheLocation(Context context, String cacheLocation) {
Util.getPreferences(context).edit() Util.getPreferences().edit()
.putString(Constants.PREFERENCES_KEY_CACHE_LOCATION, cacheLocation) .putString(Constants.PREFERENCES_KEY_CACHE_LOCATION, cacheLocation)
.apply(); .apply();
} }
@ -164,7 +164,7 @@ public class PermissionUtil {
} }
Timber.i("At least one permission is missing to use directory %s ", cacheLocation); Timber.i("At least one permission is missing to use directory %s ", cacheLocation);
setCacheLocation(context, FileUtil.getDefaultMusicDirectory(context).getPath()); setCacheLocation(context, FileUtil.getDefaultMusicDirectory().getPath());
showWarning(context, context.getString(R.string.permissions_message_box_title), showWarning(context, context.getString(R.string.permissions_message_box_title),
context.getString(R.string.permissions_permission_missing), null); context.getString(R.string.permissions_permission_missing), null);
if (callback != null) callback.onPermissionRequestFinished(false); if (callback != null) callback.onPermissionRequestFinished(false);
@ -201,7 +201,7 @@ public class PermissionUtil {
builder.setNegativeButton(context.getString(R.string.common_cancel), new DialogInterface.OnClickListener() { builder.setNegativeButton(context.getString(R.string.common_cancel), new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
setCacheLocation(context, FileUtil.getDefaultMusicDirectory(context).getPath()); setCacheLocation(context, FileUtil.getDefaultMusicDirectory().getPath());
dialog.cancel(); dialog.cancel();
} }
}); });

View File

@ -97,14 +97,14 @@ public class ShufflePlayBuffer
// Check if active server has changed. // Check if active server has changed.
clearBufferIfNecessary(); clearBufferIfNecessary();
if (buffer.size() > REFILL_THRESHOLD || (!Util.isNetworkConnected(context) && !ActiveServerProvider.Companion.isOffline(context))) if (buffer.size() > REFILL_THRESHOLD || (!Util.isNetworkConnected(context) && !ActiveServerProvider.Companion.isOffline()))
{ {
return; return;
} }
try try
{ {
MusicService service = MusicServiceFactory.getMusicService(context); MusicService service = MusicServiceFactory.getMusicService();
int n = CAPACITY - buffer.size(); int n = CAPACITY - buffer.size();
MusicDirectory songs = service.getRandomSongs(n, context); MusicDirectory songs = service.getRandomSongs(n, context);
@ -124,9 +124,9 @@ public class ShufflePlayBuffer
{ {
synchronized (buffer) synchronized (buffer)
{ {
if (currentServer != ActiveServerProvider.Companion.getActiveServerId(context)) if (currentServer != ActiveServerProvider.Companion.getActiveServerId())
{ {
currentServer = ActiveServerProvider.Companion.getActiveServerId(context); currentServer = ActiveServerProvider.Companion.getActiveServerId();
buffer.clear(); buffer.clear();
} }
} }

View File

@ -46,10 +46,10 @@ import android.view.View;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.ColorInt;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import org.moire.ultrasonic.R; import org.moire.ultrasonic.R;
import org.moire.ultrasonic.app.UApp;
import org.moire.ultrasonic.data.ActiveServerProvider; import org.moire.ultrasonic.data.ActiveServerProvider;
import org.moire.ultrasonic.domain.*; import org.moire.ultrasonic.domain.*;
import org.moire.ultrasonic.domain.MusicDirectory.Entry; import org.moire.ultrasonic.domain.MusicDirectory.Entry;
@ -86,9 +86,6 @@ public class Util
public static final String CM_AVRCP_PLAYSTATE_CHANGED = "com.android.music.playstatechanged"; public static final String CM_AVRCP_PLAYSTATE_CHANGED = "com.android.music.playstatechanged";
public static final String CM_AVRCP_METADATA_CHANGED = "com.android.music.metachanged"; public static final String CM_AVRCP_METADATA_CHANGED = "com.android.music.metachanged";
private static boolean mediaButtonsRegisteredForUI;
private static boolean mediaButtonsRegisteredForService;
// Used by hexEncode() // Used by hexEncode()
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
private static Toast toast; private static Toast toast;
@ -99,58 +96,63 @@ public class Util
{ {
} }
public static boolean isScreenLitOnDownload(Context context) // Retrieves an instance of the application Context
public static Context appContext() {
return UApp.Companion.applicationContext();
}
public static boolean isScreenLitOnDownload()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_SCREEN_LIT_ON_DOWNLOAD, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_SCREEN_LIT_ON_DOWNLOAD, false);
} }
public static RepeatMode getRepeatMode(Context context) public static RepeatMode getRepeatMode()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return RepeatMode.valueOf(preferences.getString(Constants.PREFERENCES_KEY_REPEAT_MODE, RepeatMode.OFF.name())); return RepeatMode.valueOf(preferences.getString(Constants.PREFERENCES_KEY_REPEAT_MODE, RepeatMode.OFF.name()));
} }
public static void setRepeatMode(Context context, RepeatMode repeatMode) public static void setRepeatMode(RepeatMode repeatMode)
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
SharedPreferences.Editor editor = preferences.edit(); SharedPreferences.Editor editor = preferences.edit();
editor.putString(Constants.PREFERENCES_KEY_REPEAT_MODE, repeatMode.name()); editor.putString(Constants.PREFERENCES_KEY_REPEAT_MODE, repeatMode.name());
editor.apply(); editor.apply();
} }
public static boolean isNotificationEnabled(Context context) public static boolean isNotificationEnabled()
{ {
// After API26 foreground services must be used for music playback, and they must have a notification // After API26 foreground services must be used for music playback, and they must have a notification
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) return true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) return true;
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_NOTIFICATION, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_NOTIFICATION, false);
} }
public static boolean isNotificationAlwaysEnabled(Context context) public static boolean isNotificationAlwaysEnabled()
{ {
// After API26 foreground services must be used for music playback, and they must have a notification // After API26 foreground services must be used for music playback, and they must have a notification
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) return true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) return true;
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_ALWAYS_SHOW_NOTIFICATION, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_ALWAYS_SHOW_NOTIFICATION, false);
} }
@SuppressWarnings({"BooleanMethodIsAlwaysInverted"}) // It is inverted for readability @SuppressWarnings({"BooleanMethodIsAlwaysInverted"}) // It is inverted for readability
public static boolean isLockScreenEnabled(Context context) public static boolean isLockScreenEnabled()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_LOCK_SCREEN_CONTROLS, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_LOCK_SCREEN_CONTROLS, false);
} }
public static String getTheme(Context context) public static String getTheme()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getString(Constants.PREFERENCES_KEY_THEME, Constants.PREFERENCES_KEY_THEME_DARK); return preferences.getString(Constants.PREFERENCES_KEY_THEME, Constants.PREFERENCES_KEY_THEME_DARK);
} }
public static void applyTheme(Context context) public static void applyTheme(Context context)
{ {
String theme = Util.getTheme(context); String theme = Util.getTheme();
if (Constants.PREFERENCES_KEY_THEME_DARK.equalsIgnoreCase(theme) || "fullscreen".equalsIgnoreCase(theme)) if (Constants.PREFERENCES_KEY_THEME_DARK.equalsIgnoreCase(theme) || "fullscreen".equalsIgnoreCase(theme))
{ {
@ -178,26 +180,26 @@ public class Util
} }
boolean wifi = networkInfo.getType() == ConnectivityManager.TYPE_WIFI; boolean wifi = networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(wifi ? Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI : Constants.PREFERENCES_KEY_MAX_BITRATE_MOBILE, "0")); return Integer.parseInt(preferences.getString(wifi ? Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI : Constants.PREFERENCES_KEY_MAX_BITRATE_MOBILE, "0"));
} }
public static int getPreloadCount(Context context) public static int getPreloadCount()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
int preloadCount = Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_PRELOAD_COUNT, "-1")); int preloadCount = Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_PRELOAD_COUNT, "-1"));
return preloadCount == -1 ? Integer.MAX_VALUE : preloadCount; return preloadCount == -1 ? Integer.MAX_VALUE : preloadCount;
} }
public static int getCacheSizeMB(Context context) public static int getCacheSizeMB()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
int cacheSize = Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_CACHE_SIZE, "-1")); int cacheSize = Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_CACHE_SIZE, "-1"));
return cacheSize == -1 ? Integer.MAX_VALUE : cacheSize; return cacheSize == -1 ? Integer.MAX_VALUE : cacheSize;
} }
public static SharedPreferences getPreferences(Context context) { public static SharedPreferences getPreferences() {
return PreferenceManager.getDefaultSharedPreferences(context); return PreferenceManager.getDefaultSharedPreferences(appContext());
} }
/** /**
@ -554,7 +556,7 @@ public class Util
boolean connected = networkInfo != null && networkInfo.isConnected(); boolean connected = networkInfo != null && networkInfo.isConnected();
boolean wifiConnected = connected && networkInfo.getType() == ConnectivityManager.TYPE_WIFI; boolean wifiConnected = connected && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
boolean wifiRequired = isWifiRequiredForDownload(context); boolean wifiRequired = isWifiRequiredForDownload();
return connected && (!wifiRequired || wifiConnected); return connected && (!wifiRequired || wifiConnected);
} }
@ -564,34 +566,30 @@ public class Util
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
} }
private static boolean isWifiRequiredForDownload(Context context) private static boolean isWifiRequiredForDownload()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_WIFI_REQUIRED_FOR_DOWNLOAD, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_WIFI_REQUIRED_FOR_DOWNLOAD, false);
} }
public static boolean shouldDisplayBitrateWithArtist(Context context) public static boolean shouldDisplayBitrateWithArtist()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_DISPLAY_BITRATE_WITH_ARTIST, true); return preferences.getBoolean(Constants.PREFERENCES_KEY_DISPLAY_BITRATE_WITH_ARTIST, true);
} }
public static boolean shouldUseFolderForArtistName(Context context) public static boolean shouldUseFolderForArtistName()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_USE_FOLDER_FOR_ALBUM_ARTIST, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_USE_FOLDER_FOR_ALBUM_ARTIST, false);
} }
public static boolean shouldShowTrackNumber(Context context) public static boolean shouldShowTrackNumber()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_TRACK_NUMBER, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_TRACK_NUMBER, false);
} }
public static void info(Context context, int titleId, int messageId)
{
showDialog(context, android.R.drawable.ic_dialog_info, titleId, messageId);
}
private static void showDialog(Context context, int icon, int titleId, int messageId) private static void showDialog(Context context, int icon, int titleId, int messageId)
{ {
@ -669,7 +667,7 @@ public class Util
public static int getScaledHeight(Bitmap bitmap, int width) public static int getScaledHeight(Bitmap bitmap, int width)
{ {
return getScaledHeight((double) bitmap.getHeight(), (double) bitmap.getWidth(), width); return getScaledHeight(bitmap.getHeight(), bitmap.getWidth(), width);
} }
public static Bitmap scaleBitmap(Bitmap bitmap, int size) public static Bitmap scaleBitmap(Bitmap bitmap, int size)
@ -726,7 +724,7 @@ public class Util
intent.putExtra("artist", song.getArtist()); intent.putExtra("artist", song.getArtist());
intent.putExtra("album", song.getAlbum()); intent.putExtra("album", song.getAlbum());
File albumArtFile = FileUtil.getAlbumArtFile(context, song); File albumArtFile = FileUtil.getAlbumArtFile(song);
intent.putExtra("coverart", albumArtFile.getAbsolutePath()); intent.putExtra("coverart", albumArtFile.getAbsolutePath());
} }
else else
@ -742,7 +740,7 @@ public class Util
public static void broadcastA2dpMetaDataChange(Context context, int playerPosition, DownloadFile currentPlaying, int listSize, int id) public static void broadcastA2dpMetaDataChange(Context context, int playerPosition, DownloadFile currentPlaying, int listSize, int id)
{ {
if (!Util.getShouldSendBluetoothNotifications(context)) if (!Util.getShouldSendBluetoothNotifications())
{ {
return; return;
} }
@ -763,7 +761,7 @@ public class Util
avrcpIntent.putExtra("album_artist", ""); avrcpIntent.putExtra("album_artist", "");
avrcpIntent.putExtra("album_artist_name", ""); avrcpIntent.putExtra("album_artist_name", "");
if (Util.getShouldSendBluetoothAlbumArt(context)) if (Util.getShouldSendBluetoothAlbumArt())
{ {
avrcpIntent.putExtra("coverart", (Parcelable) null); avrcpIntent.putExtra("coverart", (Parcelable) null);
avrcpIntent.putExtra("cover", (Parcelable) null); avrcpIntent.putExtra("cover", (Parcelable) null);
@ -796,9 +794,9 @@ public class Util
avrcpIntent.putExtra("album_artist_name", artist); avrcpIntent.putExtra("album_artist_name", artist);
if (Util.getShouldSendBluetoothAlbumArt(context)) if (Util.getShouldSendBluetoothAlbumArt())
{ {
File albumArtFile = FileUtil.getAlbumArtFile(context, song); File albumArtFile = FileUtil.getAlbumArtFile(song);
avrcpIntent.putExtra("coverart", albumArtFile.getAbsolutePath()); avrcpIntent.putExtra("coverart", albumArtFile.getAbsolutePath());
avrcpIntent.putExtra("cover", albumArtFile.getAbsolutePath()); avrcpIntent.putExtra("cover", albumArtFile.getAbsolutePath());
} }
@ -818,7 +816,7 @@ public class Util
public static void broadcastA2dpPlayStatusChange(Context context, PlayerState state, Entry currentSong, Integer listSize, Integer id, Integer playerPosition) public static void broadcastA2dpPlayStatusChange(Context context, PlayerState state, Entry currentSong, Integer listSize, Integer id, Integer playerPosition)
{ {
if (!Util.getShouldSendBluetoothNotifications(context)) if (!Util.getShouldSendBluetoothNotifications())
{ {
return; return;
} }
@ -852,9 +850,9 @@ public class Util
avrcpIntent.putExtra("album_artist", artist); avrcpIntent.putExtra("album_artist", artist);
avrcpIntent.putExtra("album_artist_name", artist); avrcpIntent.putExtra("album_artist_name", artist);
if (Util.getShouldSendBluetoothAlbumArt(context)) if (Util.getShouldSendBluetoothAlbumArt())
{ {
File albumArtFile = FileUtil.getAlbumArtFile(context, currentSong); File albumArtFile = FileUtil.getAlbumArtFile(currentSong);
avrcpIntent.putExtra("coverart", albumArtFile.getAbsolutePath()); avrcpIntent.putExtra("coverart", albumArtFile.getAbsolutePath());
avrcpIntent.putExtra("cover", albumArtFile.getAbsolutePath()); avrcpIntent.putExtra("cover", albumArtFile.getAbsolutePath());
} }
@ -985,109 +983,102 @@ public class Util
return inSampleSize; return inSampleSize;
} }
// TODO: Shouldn't this be used when making requests? public static int getDefaultAlbums()
public static int getNetworkTimeout(Context context)
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_NETWORK_TIMEOUT, "15000"));
}
public static int getDefaultAlbums(Context context)
{
SharedPreferences preferences = getPreferences(context);
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_ALBUMS, "5")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_ALBUMS, "5"));
} }
public static int getMaxAlbums(Context context) public static int getMaxAlbums()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_MAX_ALBUMS, "20")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_MAX_ALBUMS, "20"));
} }
public static int getDefaultSongs(Context context) public static int getDefaultSongs()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SONGS, "10")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SONGS, "10"));
} }
public static int getMaxSongs(Context context) public static int getMaxSongs()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_MAX_SONGS, "25")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_MAX_SONGS, "25"));
} }
public static int getMaxArtists(Context context) public static int getMaxArtists()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_MAX_ARTISTS, "10")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_MAX_ARTISTS, "10"));
} }
public static int getDefaultArtists(Context context) public static int getDefaultArtists()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_ARTISTS, "3")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_ARTISTS, "3"));
} }
public static int getBufferLength(Context context) public static int getBufferLength()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_BUFFER_LENGTH, "5")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_BUFFER_LENGTH, "5"));
} }
public static int getIncrementTime(Context context) public static int getIncrementTime()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_INCREMENT_TIME, "5")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_INCREMENT_TIME, "5"));
} }
public static boolean getMediaButtonsEnabled(Context context) public static boolean getMediaButtonsEnabled()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_MEDIA_BUTTONS, true); return preferences.getBoolean(Constants.PREFERENCES_KEY_MEDIA_BUTTONS, true);
} }
public static boolean getShowNowPlayingPreference(Context context) public static boolean getShowNowPlayingPreference()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_NOW_PLAYING, true); return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_NOW_PLAYING, true);
} }
public static boolean getGaplessPlaybackPreference(Context context) public static boolean getGaplessPlaybackPreference()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_GAPLESS_PLAYBACK, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_GAPLESS_PLAYBACK, false);
} }
public static boolean getShouldTransitionOnPlaybackPreference(Context context) public static boolean getShouldTransitionOnPlaybackPreference()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_DOWNLOAD_TRANSITION, true); return preferences.getBoolean(Constants.PREFERENCES_KEY_DOWNLOAD_TRANSITION, true);
} }
public static boolean getShouldUseId3Tags(Context context) public static boolean getShouldUseId3Tags()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_ID3_TAGS, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_ID3_TAGS, false);
} }
public static boolean getShouldShowArtistPicture(Context context) public static boolean getShouldShowArtistPicture(Context context)
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
boolean isOffline = ActiveServerProvider.Companion.isOffline(context); boolean isOffline = ActiveServerProvider.Companion.isOffline();
boolean isId3Enabled = preferences.getBoolean(Constants.PREFERENCES_KEY_ID3_TAGS, false); boolean isId3Enabled = preferences.getBoolean(Constants.PREFERENCES_KEY_ID3_TAGS, false);
boolean shouldShowArtistPicture = preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_ARTIST_PICTURE, false); boolean shouldShowArtistPicture = preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_ARTIST_PICTURE, false);
return (!isOffline) && isId3Enabled && shouldShowArtistPicture; return (!isOffline) && isId3Enabled && shouldShowArtistPicture;
} }
public static int getChatRefreshInterval(Context context) public static int getChatRefreshInterval()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_CHAT_REFRESH_INTERVAL, "5000")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_CHAT_REFRESH_INTERVAL, "5000"));
} }
public static int getDirectoryCacheTime(Context context) public static int getDirectoryCacheTime()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_DIRECTORY_CACHE_TIME, "300")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_DIRECTORY_CACHE_TIME, "300"));
} }
@ -1102,27 +1093,27 @@ public class Util
return formatTotalDuration(totalDuration, false); return formatTotalDuration(totalDuration, false);
} }
public static boolean getShouldClearPlaylist(Context context) public static boolean getShouldClearPlaylist()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_CLEAR_PLAYLIST, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_CLEAR_PLAYLIST, false);
} }
public static boolean getShouldSortByDisc(Context context) public static boolean getShouldSortByDisc()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_DISC_SORT, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_DISC_SORT, false);
} }
public static boolean getShouldClearBookmark(Context context) public static boolean getShouldClearBookmark()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_CLEAR_BOOKMARK, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_CLEAR_BOOKMARK, false);
} }
public static boolean getSingleButtonPlayPause(Context context) public static boolean getSingleButtonPlayPause()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_SINGLE_BUTTON_PLAY_PAUSE, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_SINGLE_BUTTON_PLAY_PAUSE, false);
} }
@ -1155,9 +1146,9 @@ public class Util
else return minutes > 0 ? String.format(Locale.getDefault(), "%d:%02d", minutes, seconds) : String.format(Locale.getDefault(), "0:%02d", seconds); else return minutes > 0 ? String.format(Locale.getDefault(), "%d:%02d", minutes, seconds) : String.format(Locale.getDefault(), "0:%02d", seconds);
} }
public static VideoPlayerType getVideoPlayerType(Context context) public static VideoPlayerType getVideoPlayerType()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return VideoPlayerType.forKey(preferences.getString(Constants.PREFERENCES_KEY_VIDEO_PLAYER, VideoPlayerType.MX.getKey())); return VideoPlayerType.forKey(preferences.getString(Constants.PREFERENCES_KEY_VIDEO_PLAYER, VideoPlayerType.MX.getKey()));
} }
@ -1232,51 +1223,51 @@ public class Util
} }
@SuppressWarnings("BooleanMethodIsAlwaysInverted") // Inverted for readability @SuppressWarnings("BooleanMethodIsAlwaysInverted") // Inverted for readability
public static boolean getShouldSendBluetoothNotifications(Context context) public static boolean getShouldSendBluetoothNotifications()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS, true); return preferences.getBoolean(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS, true);
} }
public static boolean getShouldSendBluetoothAlbumArt(Context context) public static boolean getShouldSendBluetoothAlbumArt()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_ALBUM_ART, true); return preferences.getBoolean(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_ALBUM_ART, true);
} }
public static int getViewRefreshInterval(Context context) public static int getViewRefreshInterval()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_VIEW_REFRESH, "1000")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_VIEW_REFRESH, "1000"));
} }
public static boolean getShouldAskForShareDetails(Context context) public static boolean getShouldAskForShareDetails()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS, true); return preferences.getBoolean(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS, true);
} }
public static String getDefaultShareDescription(Context context) public static String getDefaultShareDescription()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, ""); return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, "");
} }
public static String getShareGreeting(Context context) public static String getShareGreeting(Context context)
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_GREETING, String.format(context.getResources().getString(R.string.share_default_greeting), context.getResources().getString(R.string.common_appname))); return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_GREETING, String.format(context.getResources().getString(R.string.share_default_greeting), context.getResources().getString(R.string.common_appname)));
} }
public static String getDefaultShareExpiration(Context context) public static String getDefaultShareExpiration()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "0"); return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "0");
} }
public static long getDefaultShareExpirationInMillis(Context context) public static long getDefaultShareExpirationInMillis(Context context)
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
String preference = preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "0"); String preference = preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "0");
String[] split = PATTERN.split(preference); String[] split = PATTERN.split(preference);
@ -1294,33 +1285,33 @@ public class Util
return 0; return 0;
} }
public static void setShouldAskForShareDetails(Context context, boolean shouldAskForShareDetails) public static void setShouldAskForShareDetails(boolean shouldAskForShareDetails)
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
SharedPreferences.Editor editor = preferences.edit(); SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS, shouldAskForShareDetails); editor.putBoolean(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS, shouldAskForShareDetails);
editor.apply(); editor.apply();
} }
public static void setDefaultShareExpiration(Context context, String defaultShareExpiration) public static void setDefaultShareExpiration(String defaultShareExpiration)
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
SharedPreferences.Editor editor = preferences.edit(); SharedPreferences.Editor editor = preferences.edit();
editor.putString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, defaultShareExpiration); editor.putString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, defaultShareExpiration);
editor.apply(); editor.apply();
} }
public static void setDefaultShareDescription(Context context, String defaultShareDescription) public static void setDefaultShareDescription(String defaultShareDescription)
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
SharedPreferences.Editor editor = preferences.edit(); SharedPreferences.Editor editor = preferences.edit();
editor.putString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, defaultShareDescription); editor.putString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, defaultShareDescription);
editor.apply(); editor.apply();
} }
public static boolean getShouldShowAllSongsByArtist(Context context) public static boolean getShouldShowAllSongsByArtist()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_ALL_SONGS_BY_ARTIST, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_ALL_SONGS_BY_ARTIST, false);
} }
@ -1331,20 +1322,12 @@ public class Util
context.sendBroadcast(scanFileIntent); context.sendBroadcast(scanFileIntent);
} }
public static int getImageLoaderConcurrency(Context context) public static int getImageLoaderConcurrency()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_IMAGE_LOADER_CONCURRENCY, "5")); return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_IMAGE_LOADER_CONCURRENCY, "5"));
} }
public static @ColorInt int getColorFromAttribute(Context context, int resId)
{
TypedValue typedValue = new TypedValue();
Resources.Theme theme = context.getTheme();
theme.resolveAttribute(resId, typedValue, true);
return typedValue.data;
}
public static int getResourceFromAttribute(Context context, int resId) public static int getResourceFromAttribute(Context context, int resId)
{ {
TypedValue typedValue = new TypedValue(); TypedValue typedValue = new TypedValue();
@ -1353,9 +1336,9 @@ public class Util
return typedValue.resourceId; return typedValue.resourceId;
} }
public static boolean isFirstRun(Context context) public static boolean isFirstRun()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
boolean firstExecuted = preferences.getBoolean(Constants.PREFERENCES_KEY_FIRST_RUN_EXECUTED, false); boolean firstExecuted = preferences.getBoolean(Constants.PREFERENCES_KEY_FIRST_RUN_EXECUTED, false);
if (firstExecuted) return false; if (firstExecuted) return false;
SharedPreferences.Editor editor = preferences.edit(); SharedPreferences.Editor editor = preferences.edit();
@ -1364,21 +1347,21 @@ public class Util
return true; return true;
} }
public static int getResumeOnBluetoothDevice(Context context) public static int getResumeOnBluetoothDevice()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getInt(Constants.PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE, Constants.PREFERENCE_VALUE_DISABLED); return preferences.getInt(Constants.PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE, Constants.PREFERENCE_VALUE_DISABLED);
} }
public static int getPauseOnBluetoothDevice(Context context) public static int getPauseOnBluetoothDevice()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getInt(Constants.PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE, Constants.PREFERENCE_VALUE_A2DP); return preferences.getInt(Constants.PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE, Constants.PREFERENCE_VALUE_A2DP);
} }
public static boolean getDebugLogToFile(Context context) public static boolean getDebugLogToFile()
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences();
return preferences.getBoolean(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE, false); return preferences.getBoolean(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE, false);
} }

View File

@ -79,7 +79,7 @@ public enum VideoPlayerType
Intent intent = new Intent(Intent.ACTION_VIEW); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setPackage(installedPro ? PACKAGE_NAME_MX_PRO : PACKAGE_NAME_MX_AD); intent.setPackage(installedPro ? PACKAGE_NAME_MX_PRO : PACKAGE_NAME_MX_AD);
intent.putExtra("title", entry.getTitle()); intent.putExtra("title", entry.getTitle());
intent.setDataAndType(Uri.parse(MusicServiceFactory.getMusicService(context).getVideoUrl(context, entry.getId(), false)), "video/*"); intent.setDataAndType(Uri.parse(MusicServiceFactory.getMusicService().getVideoUrl(context, entry.getId(), false)), "video/*");
context.startActivity(intent); context.startActivity(intent);
} }
} }
@ -91,7 +91,7 @@ public enum VideoPlayerType
public void playVideo(Context context, MusicDirectory.Entry entry) throws Exception public void playVideo(Context context, MusicDirectory.Entry entry) throws Exception
{ {
Intent intent = new Intent(Intent.ACTION_VIEW); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(MusicServiceFactory.getMusicService(context).getVideoUrl(context, entry.getId(), true))); intent.setData(Uri.parse(MusicServiceFactory.getMusicService().getVideoUrl(context, entry.getId(), true)));
context.startActivity(intent); context.startActivity(intent);
} }
}, },
@ -102,7 +102,7 @@ public enum VideoPlayerType
public void playVideo(Context context, MusicDirectory.Entry entry) throws Exception public void playVideo(Context context, MusicDirectory.Entry entry) throws Exception
{ {
Intent intent = new Intent(Intent.ACTION_VIEW); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(MusicServiceFactory.getMusicService(context).getVideoUrl(context, entry.getId(), false)), "video/*"); intent.setDataAndType(Uri.parse(MusicServiceFactory.getMusicService().getVideoUrl(context, entry.getId(), false)), "video/*");
context.startActivity(intent); context.startActivity(intent);
} }
}; };

View File

@ -54,7 +54,7 @@ public class AlbumView extends UpdateView
this.context = context; this.context = context;
this.imageLoader = imageLoader; this.imageLoader = imageLoader;
String theme = Util.getTheme(context); String theme = Util.getTheme();
boolean themesMatch = theme.equals(AlbumView.theme); boolean themesMatch = theme.equals(AlbumView.theme);
AlbumView.theme = theme; AlbumView.theme = theme;
@ -121,7 +121,7 @@ public class AlbumView extends UpdateView
viewHolder.artist.setVisibility(artist == null ? View.GONE : View.VISIBLE); viewHolder.artist.setVisibility(artist == null ? View.GONE : View.VISIBLE);
viewHolder.star.setImageDrawable(starred ? starDrawable : starHollowDrawable); viewHolder.star.setImageDrawable(starred ? starDrawable : starHollowDrawable);
if (ActiveServerProvider.Companion.isOffline(this.context) || "-1".equals(album.getId())) if (ActiveServerProvider.Companion.isOffline() || "-1".equals(album.getId()))
{ {
viewHolder.star.setVisibility(View.GONE); viewHolder.star.setVisibility(View.GONE);
} }
@ -146,23 +146,23 @@ public class AlbumView extends UpdateView
album.setStarred(false); album.setStarred(false);
} }
final MusicService musicService = MusicServiceFactory.getMusicService(view.getContext()); final MusicService musicService = MusicServiceFactory.getMusicService();
new Thread(new Runnable() new Thread(new Runnable()
{ {
@Override @Override
public void run() public void run()
{ {
boolean useId3 = Util.getShouldUseId3Tags(getContext()); boolean useId3 = Util.getShouldUseId3Tags();
try try
{ {
if (!isStarred) if (!isStarred)
{ {
musicService.star(!useId3 ? id : null, useId3 ? id : null, null, getContext()); musicService.star(!useId3 ? id : null, useId3 ? id : null, null);
} }
else else
{ {
musicService.unstar(!useId3 ? id : null, useId3 ? id : null, null, getContext()); musicService.unstar(!useId3 ? id : null, useId3 ? id : null, null);
} }
} }
catch (Exception e) catch (Exception e)

View File

@ -116,7 +116,7 @@ public class UpdateView extends LinearLayout
Timber.w(x, "Error when updating song views."); Timber.w(x, "Error when updating song views.");
} }
uiHandler.postDelayed(updateRunnable, Util.getViewRefreshInterval(context)); uiHandler.postDelayed(updateRunnable, Util.getViewRefreshInterval());
} }
}; };

View File

@ -142,7 +142,7 @@ class NavigationActivity : AppCompatActivity() {
} }
// Determine first run and migrate server settings to DB as early as possible // Determine first run and migrate server settings to DB as early as possible
var showWelcomeScreen = Util.isFirstRun(this) var showWelcomeScreen = Util.isFirstRun()
val areServersMigrated: Boolean = serverSettingsModel.migrateFromPreferences() val areServersMigrated: Boolean = serverSettingsModel.migrateFromPreferences()
// If there are any servers in the DB, do not show the welcome screen // If there are any servers in the DB, do not show the welcome screen
@ -296,12 +296,12 @@ class NavigationActivity : AppCompatActivity() {
private fun loadSettings() { private fun loadSettings() {
PreferenceManager.setDefaultValues(this, R.xml.settings, false) PreferenceManager.setDefaultValues(this, R.xml.settings, false)
val preferences = Util.getPreferences(this) val preferences = Util.getPreferences()
if (!preferences.contains(Constants.PREFERENCES_KEY_CACHE_LOCATION)) { if (!preferences.contains(Constants.PREFERENCES_KEY_CACHE_LOCATION)) {
val editor = preferences.edit() val editor = preferences.edit()
editor.putString( editor.putString(
Constants.PREFERENCES_KEY_CACHE_LOCATION, Constants.PREFERENCES_KEY_CACHE_LOCATION,
FileUtil.getDefaultMusicDirectory(this).path FileUtil.getDefaultMusicDirectory().path
) )
editor.apply() editor.apply()
} }
@ -336,7 +336,7 @@ class NavigationActivity : AppCompatActivity() {
} }
private fun showNowPlaying() { private fun showNowPlaying() {
if (!Util.getShowNowPlayingPreference(this)) { if (!Util.getShowNowPlayingPreference()) {
hideNowPlaying() hideNowPlaying()
return return
} }
@ -368,7 +368,7 @@ class NavigationActivity : AppCompatActivity() {
} }
private fun setMenuForServerSetting() { private fun setMenuForServerSetting() {
val visibility = !isOffline(this) val visibility = !isOffline()
chatMenuItem?.isVisible = visibility chatMenuItem?.isVisible = visibility
bookmarksMenuItem?.isVisible = visibility bookmarksMenuItem?.isVisible = visibility
sharesMenuItem?.isVisible = visibility sharesMenuItem?.isVisible = visibility

View File

@ -1,5 +1,6 @@
package org.moire.ultrasonic.app package org.moire.ultrasonic.app
import android.content.Context
import androidx.multidex.MultiDexApplication import androidx.multidex.MultiDexApplication
import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin import org.koin.core.context.startKoin
@ -21,16 +22,21 @@ import timber.log.Timber.DebugTree
/** /**
* The Main class of the Application * The Main class of the Application
*/ */
@Suppress("unused")
class UApp : MultiDexApplication() { class UApp : MultiDexApplication() {
init {
instance = this
}
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
Timber.plant(DebugTree()) Timber.plant(DebugTree())
} }
if (Util.getDebugLogToFile(this)) { if (Util.getDebugLogToFile()) {
FileLoggerTree.plantToTimberForest(this) FileLoggerTree.plantToTimberForest()
} }
startKoin { startKoin {
@ -49,4 +55,12 @@ class UApp : MultiDexApplication() {
) )
} }
} }
companion object {
private var instance: UApp? = null
fun applicationContext(): Context {
return instance!!.applicationContext
}
}
} }

View File

@ -1,12 +1,12 @@
package org.moire.ultrasonic.data package org.moire.ultrasonic.data
import android.content.Context
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.moire.ultrasonic.R import org.moire.ultrasonic.R
import org.moire.ultrasonic.app.UApp
import org.moire.ultrasonic.service.MusicServiceFactory.resetMusicService import org.moire.ultrasonic.service.MusicServiceFactory.resetMusicService
import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.Constants
import org.moire.ultrasonic.util.Util import org.moire.ultrasonic.util.Util
@ -17,8 +17,7 @@ import timber.log.Timber
* It caches the settings read up from the DB to improve performance. * It caches the settings read up from the DB to improve performance.
*/ */
class ActiveServerProvider( class ActiveServerProvider(
private val repository: ServerSettingDao, private val repository: ServerSettingDao
private val context: Context
) { ) {
private var cachedServer: ServerSetting? = null private var cachedServer: ServerSetting? = null
@ -27,7 +26,7 @@ class ActiveServerProvider(
* @return The Active Server Settings * @return The Active Server Settings
*/ */
fun getActiveServer(): ServerSetting { fun getActiveServer(): ServerSetting {
val serverId = getActiveServerId(context) val serverId = getActiveServerId()
if (serverId > 0) { if (serverId > 0) {
if (cachedServer != null && cachedServer!!.id == serverId) return cachedServer!! if (cachedServer != null && cachedServer!!.id == serverId) return cachedServer!!
@ -44,13 +43,13 @@ class ActiveServerProvider(
} }
if (cachedServer != null) return cachedServer!! if (cachedServer != null) return cachedServer!!
setActiveServerId(context, 0) setActiveServerId(0)
} }
return ServerSetting( return ServerSetting(
id = -1, id = -1,
index = 0, index = 0,
name = context.getString(R.string.main_offline), name = UApp.applicationContext().getString(R.string.main_offline),
url = "http://localhost", url = "http://localhost",
userName = "", userName = "",
password = "", password = "",
@ -70,13 +69,13 @@ class ActiveServerProvider(
Timber.d("setActiveServerByIndex $index") Timber.d("setActiveServerByIndex $index")
if (index < 1) { if (index < 1) {
// Offline mode is selected // Offline mode is selected
setActiveServerId(context, 0) setActiveServerId(0)
return return
} }
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
val serverId = repository.findByIndex(index)?.id ?: 0 val serverId = repository.findByIndex(index)?.id ?: 0
setActiveServerId(context, serverId) setActiveServerId(serverId)
} }
} }
@ -132,25 +131,25 @@ class ActiveServerProvider(
* Queries if the Active Server is the "Offline" mode of Ultrasonic * Queries if the Active Server is the "Offline" mode of Ultrasonic
* @return True, if the "Offline" mode is selected * @return True, if the "Offline" mode is selected
*/ */
fun isOffline(context: Context?): Boolean { fun isOffline(): Boolean {
return context == null || getActiveServerId(context) < 1 return getActiveServerId() < 1
} }
/** /**
* Queries the Id of the Active Server * Queries the Id of the Active Server
*/ */
fun getActiveServerId(context: Context): Int { fun getActiveServerId(): Int {
val preferences = Util.getPreferences(context) val preferences = Util.getPreferences()
return preferences.getInt(Constants.PREFERENCES_KEY_SERVER_INSTANCE, -1) return preferences.getInt(Constants.PREFERENCES_KEY_SERVER_INSTANCE, -1)
} }
/** /**
* Sets the Id of the Active Server * Sets the Id of the Active Server
*/ */
fun setActiveServerId(context: Context, serverId: Int) { fun setActiveServerId(serverId: Int) {
resetMusicService() resetMusicService()
val preferences = Util.getPreferences(context) val preferences = Util.getPreferences()
val editor = preferences.edit() val editor = preferences.edit()
editor.putInt(Constants.PREFERENCES_KEY_SERVER_INSTANCE, serverId) editor.putInt(Constants.PREFERENCES_KEY_SERVER_INSTANCE, serverId)
editor.apply() editor.apply()
@ -159,22 +158,22 @@ class ActiveServerProvider(
/** /**
* Queries if Scrobbling is enabled * Queries if Scrobbling is enabled
*/ */
fun isScrobblingEnabled(context: Context): Boolean { fun isScrobblingEnabled(): Boolean {
if (isOffline(context)) { if (isOffline()) {
return false return false
} }
val preferences = Util.getPreferences(context) val preferences = Util.getPreferences()
return preferences.getBoolean(Constants.PREFERENCES_KEY_SCROBBLE, false) return preferences.getBoolean(Constants.PREFERENCES_KEY_SCROBBLE, false)
} }
/** /**
* Queries if Server Scaling is enabled * Queries if Server Scaling is enabled
*/ */
fun isServerScalingEnabled(context: Context): Boolean { fun isServerScalingEnabled(): Boolean {
if (isOffline(context)) { if (isOffline()) {
return false return false
} }
val preferences = Util.getPreferences(context) val preferences = Util.getPreferences()
return preferences.getBoolean(Constants.PREFERENCES_KEY_SERVER_SCALING, false) return preferences.getBoolean(Constants.PREFERENCES_KEY_SERVER_SCALING, false)
} }
} }

View File

@ -16,7 +16,7 @@ const val SP_NAME = "Default_SP"
* This Koin module contains registration of classes related to permanent storage * This Koin module contains registration of classes related to permanent storage
*/ */
val appPermanentStorage = module { val appPermanentStorage = module {
single(named(SP_NAME)) { Util.getPreferences(androidContext()) } single(named(SP_NAME)) { Util.getPreferences() }
single { single {
Room.databaseBuilder( Room.databaseBuilder(

View File

@ -12,7 +12,7 @@ import org.moire.ultrasonic.util.ThemeChangedEventDistributor
* This Koin module contains the registration of general classes needed for Ultrasonic * This Koin module contains the registration of general classes needed for Ultrasonic
*/ */
val applicationModule = module { val applicationModule = module {
single { ActiveServerProvider(get(), androidContext()) } single { ActiveServerProvider(get()) }
single { ImageLoaderProvider(androidContext()) } single { ImageLoaderProvider(androidContext()) }
single { PermissionUtil(androidContext()) } single { PermissionUtil(androidContext()) }
single { NowPlayingEventDistributor() } single { NowPlayingEventDistributor() }

View File

@ -36,7 +36,7 @@ internal const val OFFLINE_MUSIC_SERVICE = "OfflineMusicService"
val musicServiceModule = module { val musicServiceModule = module {
single(named("ServerInstance")) { single(named("ServerInstance")) {
return@single ActiveServerProvider.getActiveServerId(androidContext()) return@single ActiveServerProvider.getActiveServerId()
} }
single(named("ServerID")) { single(named("ServerID")) {
@ -81,7 +81,7 @@ val musicServiceModule = module {
single { SubsonicImageLoader(androidContext(), get()) } single { SubsonicImageLoader(androidContext(), get()) }
viewModel { ArtistListModel(get(), androidContext()) } viewModel { ArtistListModel(get()) }
single { DownloadHandler(get(), get()) } single { DownloadHandler(get(), get()) }
single { NetworkAndStorageChecker(androidContext()) } single { NetworkAndStorageChecker(androidContext()) }

View File

@ -18,7 +18,6 @@
*/ */
package org.moire.ultrasonic.fragment package org.moire.ultrasonic.fragment
import android.content.Context
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
@ -40,8 +39,7 @@ import org.moire.ultrasonic.util.Util
* Provides ViewModel which contains the list of available Artists * Provides ViewModel which contains the list of available Artists
*/ */
class ArtistListModel( class ArtistListModel(
private val activeServerProvider: ActiveServerProvider, private val activeServerProvider: ActiveServerProvider
private val context: Context
) : ViewModel() { ) : ViewModel() {
private val musicFolders: MutableLiveData<List<MusicFolder>> = MutableLiveData() private val musicFolders: MutableLiveData<List<MusicFolder>> = MutableLiveData()
private val artists: MutableLiveData<List<Artist>> = MutableLiveData() private val artists: MutableLiveData<List<Artist>> = MutableLiveData()
@ -78,22 +76,22 @@ class ArtistListModel(
private suspend fun loadFromServer(refresh: Boolean, swipe: SwipeRefreshLayout) = private suspend fun loadFromServer(refresh: Boolean, swipe: SwipeRefreshLayout) =
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val musicService = MusicServiceFactory.getMusicService(context) val musicService = MusicServiceFactory.getMusicService()
val isOffline = ActiveServerProvider.isOffline(context) val isOffline = ActiveServerProvider.isOffline()
val useId3Tags = Util.getShouldUseId3Tags(context) val useId3Tags = Util.getShouldUseId3Tags()
try { try {
if (!isOffline && !useId3Tags) { if (!isOffline && !useId3Tags) {
musicFolders.postValue( musicFolders.postValue(
musicService.getMusicFolders(refresh, context) musicService.getMusicFolders(refresh)
) )
} }
val musicFolderId = activeServerProvider.getActiveServer().musicFolderId val musicFolderId = activeServerProvider.getActiveServer().musicFolderId
val result = if (!isOffline && useId3Tags) val result = if (!isOffline && useId3Tags)
musicService.getArtists(refresh, context) musicService.getArtists(refresh)
else musicService.getIndexes(musicFolderId, refresh, context) else musicService.getIndexes(musicFolderId, refresh)
val retrievedArtists: MutableList<Artist> = val retrievedArtists: MutableList<Artist> =
ArrayList(result.shortcuts.size + result.artists.size) ArrayList(result.shortcuts.size + result.artists.size)

View File

@ -156,7 +156,7 @@ class ArtistRowAdapter(
inflater.inflate(R.menu.select_artist_context, popup.menu) inflater.inflate(R.menu.select_artist_context, popup.menu)
val downloadMenuItem = popup.menu.findItem(R.id.artist_menu_download) val downloadMenuItem = popup.menu.findItem(R.id.artist_menu_download)
downloadMenuItem?.isVisible = !isOffline(view.context) downloadMenuItem?.isVisible = !isOffline()
popup.setOnMenuItemClickListener { menuItem -> popup.setOnMenuItemClickListener { menuItem ->
onContextMenuClick(menuItem, artistList[position]) onContextMenuClick(menuItem, artistList[position])

View File

@ -131,7 +131,7 @@ class SelectAlbumFragment : Fragment() {
selectFolderHeader = SelectMusicFolderView( selectFolderHeader = SelectMusicFolderView(
requireContext(), view as ViewGroup requireContext(), view as ViewGroup
) { selectedFolderId -> ) { selectedFolderId ->
if (!isOffline(context)) { if (!isOffline()) {
val serverSettingsModel: ServerSettingsModel by viewModel() val serverSettingsModel: ServerSettingsModel by viewModel()
val currentSetting = activeServerProvider.getActiveServer() val currentSetting = activeServerProvider.getActiveServer()
currentSetting.musicFolderId = selectedFolderId currentSetting.musicFolderId = selectedFolderId
@ -298,7 +298,7 @@ class SelectAlbumFragment : Fragment() {
model.getRandom(albumListSize) model.getRandom(albumListSize)
} else { } else {
setTitle(name) setTitle(name)
if (!isOffline(activity) && Util.getShouldUseId3Tags(activity)) { if (!isOffline() && Util.getShouldUseId3Tags()) {
if (isAlbum) { if (isAlbum) {
model.getAlbum(refresh, id, name, parentId) model.getAlbum(refresh, id, name, parentId)
} else { } else {
@ -327,12 +327,12 @@ class SelectAlbumFragment : Fragment() {
shareButton = menu.findItem(R.id.menu_item_share) shareButton = menu.findItem(R.id.menu_item_share)
if (shareButton != null) { if (shareButton != null) {
shareButton!!.isVisible = !isOffline(context) shareButton!!.isVisible = !isOffline()
} }
val downloadMenuItem = menu.findItem(R.id.album_menu_download) val downloadMenuItem = menu.findItem(R.id.album_menu_download)
if (downloadMenuItem != null) { if (downloadMenuItem != null) {
downloadMenuItem.isVisible = !isOffline(context) downloadMenuItem.isVisible = !isOffline()
} }
} }
@ -551,12 +551,12 @@ class SelectAlbumFragment : Fragment() {
playNowButton!!.visibility = if (enabled) View.VISIBLE else View.GONE playNowButton!!.visibility = if (enabled) View.VISIBLE else View.GONE
playNextButton!!.visibility = if (enabled) View.VISIBLE else View.GONE playNextButton!!.visibility = if (enabled) View.VISIBLE else View.GONE
playLastButton!!.visibility = if (enabled) View.VISIBLE else View.GONE playLastButton!!.visibility = if (enabled) View.VISIBLE else View.GONE
pinButton!!.visibility = if (enabled && !isOffline(context) && selection.size > pinnedCount) pinButton!!.visibility = if (enabled && !isOffline() && selection.size > pinnedCount)
View.VISIBLE View.VISIBLE
else else
View.GONE View.GONE
unpinButton!!.visibility = if (enabled && unpinEnabled) View.VISIBLE else View.GONE unpinButton!!.visibility = if (enabled && unpinEnabled) View.VISIBLE else View.GONE
downloadButton!!.visibility = if (enabled && !deleteEnabled && !isOffline(context)) downloadButton!!.visibility = if (enabled && !deleteEnabled && !isOffline())
View.VISIBLE View.VISIBLE
else else
View.GONE View.GONE
@ -710,7 +710,7 @@ class SelectAlbumFragment : Fragment() {
private fun updateInterfaceWithEntries(musicDirectory: MusicDirectory) { private fun updateInterfaceWithEntries(musicDirectory: MusicDirectory) {
val entries = musicDirectory.getChildren() val entries = musicDirectory.getChildren()
if (model.currentDirectoryIsSortable && Util.getShouldSortByDisc(context)) { if (model.currentDirectoryIsSortable && Util.getShouldSortByDisc()) {
Collections.sort(entries, EntryByDiscAndTrackComparator()) Collections.sort(entries, EntryByDiscAndTrackComparator())
} }
@ -799,7 +799,7 @@ class SelectAlbumFragment : Fragment() {
) )
playAllButtonVisible = !(isAlbumList || entries.isEmpty()) && !allVideos playAllButtonVisible = !(isAlbumList || entries.isEmpty()) && !allVideos
shareButtonVisible = !isOffline(context) && songCount > 0 shareButtonVisible = !isOffline() && songCount > 0
albumListView!!.removeHeaderView(emptyView!!) albumListView!!.removeHeaderView(emptyView!!)
if (entries.isEmpty()) { if (entries.isEmpty()) {

View File

@ -40,9 +40,9 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
suspend fun getMusicFolders(refresh: Boolean) { suspend fun getMusicFolders(refresh: Boolean) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
if (!ActiveServerProvider.isOffline(context)) { if (!ActiveServerProvider.isOffline()) {
val musicService = MusicServiceFactory.getMusicService(context) val musicService = MusicServiceFactory.getMusicService()
musicFolders.postValue(musicService.getMusicFolders(refresh, context)) musicFolders.postValue(musicService.getMusicFolders(refresh))
} }
} }
} }
@ -55,13 +55,13 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
) { ) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
var root = MusicDirectory() var root = MusicDirectory()
if (allSongsId == id) { if (allSongsId == id) {
val musicDirectory = service.getMusicDirectory( val musicDirectory = service.getMusicDirectory(
parentId, name, refresh, context parentId, name, refresh
) )
val songs: MutableList<MusicDirectory.Entry> = LinkedList() val songs: MutableList<MusicDirectory.Entry> = LinkedList()
@ -73,9 +73,9 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
} }
} }
} else { } else {
val musicDirectory = service.getMusicDirectory(id, name, refresh, context) val musicDirectory = service.getMusicDirectory(id, name, refresh)
if (Util.getShouldShowAllSongsByArtist(context) && if (Util.getShouldShowAllSongsByArtist() &&
musicDirectory.findChild(allSongsId) == null && musicDirectory.findChild(allSongsId) == null &&
hasOnlyFolders(musicDirectory) hasOnlyFolders(musicDirectory)
) { ) {
@ -105,7 +105,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
parent: MusicDirectory, parent: MusicDirectory,
songs: MutableList<MusicDirectory.Entry> songs: MutableList<MusicDirectory.Entry>
) { ) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
for (song in parent.getChildren(includeDirs = false, includeFiles = true)) { for (song in parent.getChildren(includeDirs = false, includeFiles = true)) {
if (!song.isVideo && !song.isDirectory) { if (!song.isVideo && !song.isDirectory) {
@ -117,7 +117,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
var root: MusicDirectory var root: MusicDirectory
if (allSongsId != id1) { if (allSongsId != id1) {
root = service.getMusicDirectory(id1, title, false, context) root = service.getMusicDirectory(id1, title, false)
getSongsRecursively(root, songs) getSongsRecursively(root, songs)
} }
@ -127,13 +127,13 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
suspend fun getArtist(refresh: Boolean, id: String?, name: String?) { suspend fun getArtist(refresh: Boolean, id: String?, name: String?) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
var root = MusicDirectory() var root = MusicDirectory()
val musicDirectory = service.getArtist(id, name, refresh, context) val musicDirectory = service.getArtist(id, name, refresh)
if (Util.getShouldShowAllSongsByArtist(context) && if (Util.getShouldShowAllSongsByArtist() &&
musicDirectory.findChild(allSongsId) == null && musicDirectory.findChild(allSongsId) == null &&
hasOnlyFolders(musicDirectory) hasOnlyFolders(musicDirectory)
) { ) {
@ -160,7 +160,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
val musicDirectory: MusicDirectory val musicDirectory: MusicDirectory
@ -168,12 +168,12 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
val root = MusicDirectory() val root = MusicDirectory()
val songs: MutableCollection<MusicDirectory.Entry> = LinkedList() val songs: MutableCollection<MusicDirectory.Entry> = LinkedList()
val artist = service.getArtist(parentId, "", false, context) val artist = service.getArtist(parentId, "", false)
for ((id1) in artist.getChildren()) { for ((id1) in artist.getChildren()) {
if (allSongsId != id1) { if (allSongsId != id1) {
val albumDirectory = service.getAlbum( val albumDirectory = service.getAlbum(
id1, "", false, context id1, "", false
) )
for (song in albumDirectory.getChildren()) { for (song in albumDirectory.getChildren()) {
@ -191,7 +191,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
} }
root root
} else { } else {
service.getAlbum(id, name, refresh, context) service.getAlbum(id, name, refresh)
} }
currentDirectory.postValue(musicDirectory) currentDirectory.postValue(musicDirectory)
} }
@ -199,7 +199,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
suspend fun getSongsForGenre(genre: String, count: Int, offset: Int) { suspend fun getSongsForGenre(genre: String, count: Int, offset: Int) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
val musicDirectory = service.getSongsByGenre(genre, count, offset, context) val musicDirectory = service.getSongsByGenre(genre, count, offset, context)
songsForGenre.postValue(musicDirectory) songsForGenre.postValue(musicDirectory)
} }
@ -209,14 +209,13 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
val musicDirectory: MusicDirectory val musicDirectory: MusicDirectory
val context = context
if (Util.getShouldUseId3Tags(context)) { if (Util.getShouldUseId3Tags()) {
musicDirectory = Util.getSongsFromSearchResult(service.getStarred2(context)) musicDirectory = Util.getSongsFromSearchResult(service.starred2)
} else { } else {
musicDirectory = Util.getSongsFromSearchResult(service.getStarred(context)) musicDirectory = Util.getSongsFromSearchResult(service.starred)
} }
currentDirectory.postValue(musicDirectory) currentDirectory.postValue(musicDirectory)
@ -227,7 +226,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
showHeader = false showHeader = false
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
currentDirectory.postValue(service.getVideos(refresh, context)) currentDirectory.postValue(service.getVideos(refresh, context))
} }
} }
@ -235,7 +234,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
suspend fun getRandom(size: Int) { suspend fun getRandom(size: Int) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
val musicDirectory = service.getRandomSongs(size, context) val musicDirectory = service.getRandomSongs(size, context)
currentDirectoryIsSortable = false currentDirectoryIsSortable = false
@ -246,7 +245,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
suspend fun getPlaylist(playlistId: String, playlistName: String?) { suspend fun getPlaylist(playlistId: String, playlistName: String?) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
val musicDirectory = service.getPlaylist(playlistId, playlistName, context) val musicDirectory = service.getPlaylist(playlistId, playlistName, context)
currentDirectory.postValue(musicDirectory) currentDirectory.postValue(musicDirectory)
@ -256,7 +255,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
suspend fun getPodcastEpisodes(podcastChannelId: String) { suspend fun getPodcastEpisodes(podcastChannelId: String) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
val musicDirectory = service.getPodcastEpisodes(podcastChannelId, context) val musicDirectory = service.getPodcastEpisodes(podcastChannelId, context)
currentDirectory.postValue(musicDirectory) currentDirectory.postValue(musicDirectory)
} }
@ -265,7 +264,7 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
suspend fun getShare(shareId: String) { suspend fun getShare(shareId: String) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
val musicDirectory = MusicDirectory() val musicDirectory = MusicDirectory()
val shares = service.getShares(true, context) val shares = service.getShares(true, context)
@ -285,14 +284,14 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
suspend fun getAlbumList(albumListType: String, size: Int, offset: Int) { suspend fun getAlbumList(albumListType: String, size: Int, offset: Int) {
showHeader = false showHeader = false
showSelectFolderHeader = !ActiveServerProvider.isOffline(context) && showSelectFolderHeader = !ActiveServerProvider.isOffline() &&
!Util.getShouldUseId3Tags(context) && ( !Util.getShouldUseId3Tags() && (
(albumListType == AlbumListType.SORTED_BY_NAME.toString()) || (albumListType == AlbumListType.SORTED_BY_NAME.toString()) ||
(albumListType == AlbumListType.SORTED_BY_ARTIST.toString()) (albumListType == AlbumListType.SORTED_BY_ARTIST.toString())
) )
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val service = MusicServiceFactory.getMusicService(context) val service = MusicServiceFactory.getMusicService()
val musicDirectory: MusicDirectory val musicDirectory: MusicDirectory
val musicFolderId = if (showSelectFolderHeader) { val musicFolderId = if (showSelectFolderHeader) {
activeServerProvider.getActiveServer().musicFolderId activeServerProvider.getActiveServer().musicFolderId
@ -300,15 +299,15 @@ class SelectAlbumModel(application: Application) : AndroidViewModel(application)
null null
} }
if (Util.getShouldUseId3Tags(context)) { if (Util.getShouldUseId3Tags()) {
musicDirectory = service.getAlbumList2( musicDirectory = service.getAlbumList2(
albumListType, size, albumListType, size,
offset, musicFolderId, context offset, musicFolderId
) )
} else { } else {
musicDirectory = service.getAlbumList( musicDirectory = service.getAlbumList(
albumListType, size, albumListType, size,
offset, musicFolderId, context offset, musicFolderId
) )
} }

View File

@ -59,13 +59,13 @@ class SelectArtistFragment : Fragment() {
artistListModel.refresh(refreshArtistListView!!) artistListModel.refresh(refreshArtistListView!!)
} }
if (!ActiveServerProvider.isOffline(this.context) && if (!ActiveServerProvider.isOffline() &&
!Util.getShouldUseId3Tags(this.context) !Util.getShouldUseId3Tags()
) { ) {
selectFolderHeader = SelectMusicFolderView( selectFolderHeader = SelectMusicFolderView(
requireContext(), view as ViewGroup, requireContext(), view as ViewGroup,
{ selectedFolderId -> { selectedFolderId ->
if (!ActiveServerProvider.isOffline(context)) { if (!ActiveServerProvider.isOffline()) {
val currentSetting = activeServerProvider.getActiveServer() val currentSetting = activeServerProvider.getActiveServer()
currentSetting.musicFolderId = selectedFolderId currentSetting.musicFolderId = selectedFolderId
serverSettingsModel.updateItem(currentSetting) serverSettingsModel.updateItem(currentSetting)
@ -81,7 +81,7 @@ class SelectArtistFragment : Fragment() {
if (title == null) { if (title == null) {
setTitle( setTitle(
this, this,
if (ActiveServerProvider.isOffline(this.context)) if (ActiveServerProvider.isOffline())
R.string.music_library_label_offline R.string.music_library_label_offline
else R.string.music_library_label else R.string.music_library_label
) )

View File

@ -1,6 +1,5 @@
package org.moire.ultrasonic.log package org.moire.ultrasonic.log
import android.content.Context
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -14,7 +13,7 @@ import timber.log.Timber
* A Timber Tree which can be used to log to a file * A Timber Tree which can be used to log to a file
* Subclass of the DebugTree so it inherits the Tag handling * Subclass of the DebugTree so it inherits the Tag handling
*/ */
class FileLoggerTree(val context: Context) : Timber.DebugTree() { class FileLoggerTree : Timber.DebugTree() {
private val dateFormat = SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault()) private val dateFormat = SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault())
/** /**
@ -81,7 +80,7 @@ class FileLoggerTree(val context: Context) : Timber.DebugTree() {
*/ */
private fun getNumberedFile(next: Boolean) { private fun getNumberedFile(next: Boolean) {
var fileNum = 1 var fileNum = 1
val fileList = getLogFileList(context) val fileList = getLogFileList()
if (!fileList.isNullOrEmpty()) { if (!fileList.isNullOrEmpty()) {
fileList.sortByDescending { t -> t.name } fileList.sortByDescending { t -> t.name }
@ -94,7 +93,7 @@ class FileLoggerTree(val context: Context) : Timber.DebugTree() {
if (next) fileNum++ if (next) fileNum++
file = File( file = File(
FileUtil.getUltrasonicDirectory(context), FileUtil.getUltrasonicDirectory(),
FILENAME.replace("*", fileNum.toString()) FILENAME.replace("*", fileNum.toString())
) )
} }
@ -124,9 +123,9 @@ class FileLoggerTree(val context: Context) : Timber.DebugTree() {
const val MAX_LOGFILE_LENGTH = 10000000 const val MAX_LOGFILE_LENGTH = 10000000
var callNum = 0 var callNum = 0
fun plantToTimberForest(context: Context) { fun plantToTimberForest() {
if (!Timber.forest().any { t -> t is FileLoggerTree }) { if (!Timber.forest().any { t -> t is FileLoggerTree }) {
Timber.plant(FileLoggerTree(context)) Timber.plant(FileLoggerTree())
} }
} }
@ -137,15 +136,15 @@ class FileLoggerTree(val context: Context) : Timber.DebugTree() {
file = null file = null
} }
fun getLogFileNumber(context: Context): Int { fun getLogFileNumber(): Int {
val fileList = getLogFileList(context) val fileList = getLogFileList()
if (!fileList.isNullOrEmpty()) return fileList.size if (!fileList.isNullOrEmpty()) return fileList.size
return 0 return 0
} }
fun getLogFileSizes(context: Context): Long { fun getLogFileSizes(): Long {
var sizeSum: Long = 0 var sizeSum: Long = 0
val fileList = getLogFileList(context) val fileList = getLogFileList()
if (fileList.isNullOrEmpty()) return sizeSum if (fileList.isNullOrEmpty()) return sizeSum
for (file in fileList) { for (file in fileList) {
sizeSum += file.length() sizeSum += file.length()
@ -153,16 +152,16 @@ class FileLoggerTree(val context: Context) : Timber.DebugTree() {
return sizeSum return sizeSum
} }
fun deleteLogFiles(context: Context) { fun deleteLogFiles() {
val fileList = getLogFileList(context) val fileList = getLogFileList()
if (fileList.isNullOrEmpty()) return if (fileList.isNullOrEmpty()) return
for (file in fileList) { for (file in fileList) {
file.delete() file.delete()
} }
} }
private fun getLogFileList(context: Context): Array<File> { private fun getLogFileList(): Array<File> {
val directory = FileUtil.getUltrasonicDirectory(context) val directory = FileUtil.getUltrasonicDirectory()
return directory.listFiles { t -> t.name.matches(fileNameRegex) } return directory.listFiles { t -> t.name.matches(fileNameRegex) }
} }
} }

View File

@ -25,7 +25,7 @@ class AudioFocusHandler(private val context: Context) {
} }
private val preferences by lazy { private val preferences by lazy {
Util.getPreferences(context) Util.getPreferences()
} }
private val lossPref: Int private val lossPref: Int

View File

@ -41,7 +41,7 @@ class DownloadFile(
) { ) {
val partialFile: File val partialFile: File
val completeFile: File val completeFile: File
private val saveFile: File = FileUtil.getSongFile(context, song) private val saveFile: File = FileUtil.getSongFile(song)
private var downloadTask: CancellableTask? = null private var downloadTask: CancellableTask? = null
var isFailed = false var isFailed = false
private var retryCount = MAX_RETRIES private var retryCount = MAX_RETRIES
@ -228,7 +228,7 @@ class DownloadFile(
return return
} }
val musicService = getMusicService(context) val musicService = getMusicService()
// Some devices seem to throw error on partial file which doesn't exist // Some devices seem to throw error on partial file which doesn't exist
val needsDownloading: Boolean val needsDownloading: Boolean
@ -312,7 +312,7 @@ class DownloadFile(
private fun acquireWakeLock(wakeLock: WakeLock?): WakeLock? { private fun acquireWakeLock(wakeLock: WakeLock?): WakeLock? {
var wakeLock1 = wakeLock var wakeLock1 = wakeLock
if (Util.isScreenLitOnDownload(context)) { if (Util.isScreenLitOnDownload()) {
val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
val flags = PowerManager.SCREEN_DIM_WAKE_LOCK or PowerManager.ON_AFTER_RELEASE val flags = PowerManager.SCREEN_DIM_WAKE_LOCK or PowerManager.ON_AFTER_RELEASE
wakeLock1 = pm.newWakeLock(flags, toString()) wakeLock1 = pm.newWakeLock(flags, toString())

View File

@ -472,7 +472,7 @@ class LocalMediaPlayer(
nextMediaPlayer!!.setOnPreparedListener { nextMediaPlayer!!.setOnPreparedListener {
try { try {
setNextPlayerState(PlayerState.PREPARED) setNextPlayerState(PlayerState.PREPARED)
if (Util.getGaplessPlaybackPreference(context) && if (Util.getGaplessPlaybackPreference() &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN &&
( (
playerState === PlayerState.STARTED || playerState === PlayerState.STARTED ||
@ -526,7 +526,7 @@ class LocalMediaPlayer(
Timber.i("Ending position %d of %d", pos, duration) Timber.i("Ending position %d of %d", pos, duration)
if (!isPartial || downloadFile.isWorkDone && abs(duration - pos) < 1000) { if (!isPartial || downloadFile.isWorkDone && abs(duration - pos) < 1000) {
setPlayerState(PlayerState.COMPLETED) setPlayerState(PlayerState.COMPLETED)
if (Util.getGaplessPlaybackPreference(context) && if (Util.getGaplessPlaybackPreference() &&
nextPlaying != null && nextPlaying != null &&
nextPlayerState === PlayerState.PREPARED nextPlayerState === PlayerState.PREPARED
) { ) {
@ -601,7 +601,7 @@ class LocalMediaPlayer(
override fun execute() { override fun execute() {
setPlayerState(PlayerState.DOWNLOADING) setPlayerState(PlayerState.DOWNLOADING)
while (!bufferComplete() && !isOffline(context)) { while (!bufferComplete() && !isOffline()) {
Util.sleepQuietly(1000L) Util.sleepQuietly(1000L)
if (isCancelled) { if (isCancelled) {
return return
@ -628,7 +628,7 @@ class LocalMediaPlayer(
} }
init { init {
var bufferLength = Util.getBufferLength(context).toLong() var bufferLength = Util.getBufferLength().toLong()
if (bufferLength == 0L) { if (bufferLength == 0L) {
// Set to seconds in a day, basically infinity // Set to seconds in a day, basically infinity
bufferLength = 86400L bufferLength = 86400L

View File

@ -65,7 +65,7 @@ class MediaPlayerService : Service() {
private var notificationBuilder: NotificationCompat.Builder? = null private var notificationBuilder: NotificationCompat.Builder? = null
private val repeatMode: RepeatMode private val repeatMode: RepeatMode
get() = Util.getRepeatMode(this) get() = Util.getRepeatMode()
override fun onBind(intent: Intent): IBinder { override fun onBind(intent: Intent): IBinder {
return binder return binder
@ -176,7 +176,7 @@ class MediaPlayerService : Service() {
@Synchronized @Synchronized
fun setNextPlaying() { fun setNextPlaying() {
val gaplessPlayback = Util.getGaplessPlaybackPreference(this) val gaplessPlayback = Util.getGaplessPlaybackPreference()
if (!gaplessPlayback) { if (!gaplessPlayback) {
localMediaPlayer.clearNextPlaying(true) localMediaPlayer.clearNextPlaying(true)
@ -376,7 +376,7 @@ class MediaPlayerService : Service() {
} }
val showWhenPaused = playerState !== PlayerState.STOPPED && val showWhenPaused = playerState !== PlayerState.STOPPED &&
Util.isNotificationAlwaysEnabled(context) Util.isNotificationAlwaysEnabled()
val show = playerState === PlayerState.STARTED || showWhenPaused val show = playerState === PlayerState.STARTED || showWhenPaused
val song = currentPlaying?.song val song = currentPlaying?.song
@ -421,8 +421,8 @@ class MediaPlayerService : Service() {
if (currentPlaying != null) { if (currentPlaying != null) {
val song = currentPlaying.song val song = currentPlaying.song
if (song.bookmarkPosition > 0 && Util.getShouldClearBookmark(context)) { if (song.bookmarkPosition > 0 && Util.getShouldClearBookmark()) {
val musicService = getMusicService(context) val musicService = getMusicService()
try { try {
musicService.deleteBookmark(song.id, context) musicService.deleteBookmark(song.id, context)
} catch (ignored: Exception) { } catch (ignored: Exception) {
@ -433,7 +433,7 @@ class MediaPlayerService : Service() {
when (repeatMode) { when (repeatMode) {
RepeatMode.OFF -> { RepeatMode.OFF -> {
if (index + 1 < 0 || index + 1 >= downloader.downloadList.size) { if (index + 1 < 0 || index + 1 >= downloader.downloadList.size) {
if (Util.getShouldClearPlaylist(context)) { if (Util.getShouldClearPlaylist()) {
clear(true) clear(true)
jukeboxMediaPlayer.updatePlaylist() jukeboxMediaPlayer.updatePlaylist()
} }
@ -576,7 +576,7 @@ class MediaPlayerService : Service() {
fun updateNotification(playerState: PlayerState, currentPlaying: DownloadFile?) { fun updateNotification(playerState: PlayerState, currentPlaying: DownloadFile?) {
val notification = buildForegroundNotification(playerState, currentPlaying) val notification = buildForegroundNotification(playerState, currentPlaying)
if (Util.isNotificationEnabled(this)) { if (Util.isNotificationEnabled()) {
if (isInForeground) { if (isInForeground) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
@ -868,7 +868,7 @@ class MediaPlayerService : Service() {
} }
fun updateMediaButtonReceiver() { fun updateMediaButtonReceiver() {
if (Util.getMediaButtonsEnabled(applicationContext)) { if (Util.getMediaButtonsEnabled()) {
registerMediaButtonEventReceiver() registerMediaButtonEventReceiver()
} else { } else {
unregisterMediaButtonEventReceiver() unregisterMediaButtonEventReceiver()

View File

@ -18,7 +18,7 @@
*/ */
package org.moire.ultrasonic.service package org.moire.ultrasonic.service
import android.content.Context import org.koin.core.component.KoinApiExtension
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import org.koin.core.component.get import org.koin.core.component.get
import org.koin.core.context.loadKoinModules import org.koin.core.context.loadKoinModules
@ -30,10 +30,11 @@ import org.moire.ultrasonic.di.ONLINE_MUSIC_SERVICE
import org.moire.ultrasonic.di.musicServiceModule import org.moire.ultrasonic.di.musicServiceModule
// TODO Refactor everywhere to use DI way to get MusicService, and then remove this class // TODO Refactor everywhere to use DI way to get MusicService, and then remove this class
@KoinApiExtension
object MusicServiceFactory : KoinComponent { object MusicServiceFactory : KoinComponent {
@JvmStatic @JvmStatic
fun getMusicService(context: Context): MusicService { fun getMusicService(): MusicService {
return if (ActiveServerProvider.isOffline(context)) { return if (ActiveServerProvider.isOffline()) {
get(named(OFFLINE_MUSIC_SERVICE)) get(named(OFFLINE_MUSIC_SERVICE))
} else { } else {
get(named(ONLINE_MUSIC_SERVICE)) get(named(ONLINE_MUSIC_SERVICE))

View File

@ -75,12 +75,12 @@ open class RESTMusicService(
) : MusicService { ) : MusicService {
@Throws(Exception::class) @Throws(Exception::class)
override fun ping(context: Context) { override fun ping() {
responseChecker.callWithResponseCheck { api -> api.ping().execute() } responseChecker.callWithResponseCheck { api -> api.ping().execute() }
} }
@Throws(Exception::class) @Throws(Exception::class)
override fun isLicenseValid(context: Context): Boolean { override fun isLicenseValid(): Boolean {
val response = responseChecker.callWithResponseCheck { api -> api.getLicense().execute() } val response = responseChecker.callWithResponseCheck { api -> api.getLicense().execute() }
return response.body()!!.license.valid return response.body()!!.license.valid
@ -88,8 +88,7 @@ open class RESTMusicService(
@Throws(Exception::class) @Throws(Exception::class)
override fun getMusicFolders( override fun getMusicFolders(
refresh: Boolean, refresh: Boolean
context: Context
): List<MusicFolder> { ): List<MusicFolder> {
val cachedMusicFolders = fileStorage.load( val cachedMusicFolders = fileStorage.load(
MUSIC_FOLDER_STORAGE_NAME, getMusicFolderListSerializer() MUSIC_FOLDER_STORAGE_NAME, getMusicFolderListSerializer()
@ -110,9 +109,8 @@ open class RESTMusicService(
@Throws(Exception::class) @Throws(Exception::class)
override fun getIndexes( override fun getIndexes(
musicFolderId: String?, musicFolderId: String?,
refresh: Boolean, refresh: Boolean
context: Context ): Indexes? {
): Indexes {
val indexName = INDEXES_STORAGE_NAME + (musicFolderId ?: "") val indexName = INDEXES_STORAGE_NAME + (musicFolderId ?: "")
val cachedIndexes = fileStorage.load(indexName, getIndexesSerializer()) val cachedIndexes = fileStorage.load(indexName, getIndexesSerializer())
@ -129,8 +127,7 @@ open class RESTMusicService(
@Throws(Exception::class) @Throws(Exception::class)
override fun getArtists( override fun getArtists(
refresh: Boolean, refresh: Boolean
context: Context
): Indexes { ): Indexes {
val cachedArtists = fileStorage.load(ARTISTS_STORAGE_NAME, getIndexesSerializer()) val cachedArtists = fileStorage.load(ARTISTS_STORAGE_NAME, getIndexesSerializer())
if (cachedArtists != null && !refresh) return cachedArtists if (cachedArtists != null && !refresh) return cachedArtists
@ -148,8 +145,7 @@ open class RESTMusicService(
override fun star( override fun star(
id: String?, id: String?,
albumId: String?, albumId: String?,
artistId: String?, artistId: String?
context: Context
) { ) {
responseChecker.callWithResponseCheck { api -> api.star(id, albumId, artistId).execute() } responseChecker.callWithResponseCheck { api -> api.star(id, albumId, artistId).execute() }
} }
@ -158,8 +154,7 @@ open class RESTMusicService(
override fun unstar( override fun unstar(
id: String?, id: String?,
albumId: String?, albumId: String?,
artistId: String?, artistId: String?
context: Context
) { ) {
responseChecker.callWithResponseCheck { api -> api.unstar(id, albumId, artistId).execute() } responseChecker.callWithResponseCheck { api -> api.unstar(id, albumId, artistId).execute() }
} }
@ -167,8 +162,7 @@ open class RESTMusicService(
@Throws(Exception::class) @Throws(Exception::class)
override fun setRating( override fun setRating(
id: String, id: String,
rating: Int, rating: Int
context: Context
) { ) {
responseChecker.callWithResponseCheck { api -> api.setRating(id, rating).execute() } responseChecker.callWithResponseCheck { api -> api.setRating(id, rating).execute() }
} }
@ -177,9 +171,8 @@ open class RESTMusicService(
override fun getMusicDirectory( override fun getMusicDirectory(
id: String, id: String,
name: String?, name: String?,
refresh: Boolean, refresh: Boolean
context: Context ): MusicDirectory? {
): MusicDirectory {
val response = responseChecker.callWithResponseCheck { api -> val response = responseChecker.callWithResponseCheck { api ->
api.getMusicDirectory(id).execute() api.getMusicDirectory(id).execute()
} }
@ -191,8 +184,7 @@ open class RESTMusicService(
override fun getArtist( override fun getArtist(
id: String, id: String,
name: String?, name: String?,
refresh: Boolean, refresh: Boolean
context: Context
): MusicDirectory { ): MusicDirectory {
val response = responseChecker.callWithResponseCheck { api -> api.getArtist(id).execute() } val response = responseChecker.callWithResponseCheck { api -> api.getArtist(id).execute() }
@ -203,8 +195,7 @@ open class RESTMusicService(
override fun getAlbum( override fun getAlbum(
id: String, id: String,
name: String?, name: String?,
refresh: Boolean, refresh: Boolean
context: Context
): MusicDirectory { ): MusicDirectory {
val response = responseChecker.callWithResponseCheck { api -> api.getAlbum(id).execute() } val response = responseChecker.callWithResponseCheck { api -> api.getAlbum(id).execute() }
@ -218,8 +209,8 @@ open class RESTMusicService(
): SearchResult { ): SearchResult {
return try { return try {
if ( if (
!isOffline(context) && !isOffline() &&
Util.getShouldUseId3Tags(context) Util.getShouldUseId3Tags()
) search3(criteria) ) search3(criteria)
else search2(criteria) else search2(criteria)
} catch (ignored: ApiNotSupportedException) { } catch (ignored: ApiNotSupportedException) {
@ -287,7 +278,7 @@ open class RESTMusicService(
} }
val playlist = response.body()!!.playlist.toMusicDirectoryDomainEntity() val playlist = response.body()!!.playlist.toMusicDirectoryDomainEntity()
savePlaylist(name, context, playlist) savePlaylist(name, playlist)
return playlist return playlist
} }
@ -295,11 +286,10 @@ open class RESTMusicService(
@Throws(IOException::class) @Throws(IOException::class)
private fun savePlaylist( private fun savePlaylist(
name: String?, name: String?,
context: Context,
playlist: MusicDirectory playlist: MusicDirectory
) { ) {
val playlistFile = FileUtil.getPlaylistFile( val playlistFile = FileUtil.getPlaylistFile(
context, activeServerProvider.getActiveServer().name, name activeServerProvider.getActiveServer().name, name
) )
val fw = FileWriter(playlistFile) val fw = FileWriter(playlistFile)
@ -308,7 +298,7 @@ open class RESTMusicService(
try { try {
fw.write("#EXTM3U\n") fw.write("#EXTM3U\n")
for (e in playlist.getChildren()) { for (e in playlist.getChildren()) {
var filePath = FileUtil.getSongFile(context, e).absolutePath var filePath = FileUtil.getSongFile(e).absolutePath
if (!File(filePath).exists()) { if (!File(filePath).exists()) {
val ext = FileUtil.getExtension(filePath) val ext = FileUtil.getExtension(filePath)
@ -446,8 +436,7 @@ open class RESTMusicService(
type: String, type: String,
size: Int, size: Int,
offset: Int, offset: Int,
musicFolderId: String?, musicFolderId: String?
context: Context
): MusicDirectory { ): MusicDirectory {
val response = responseChecker.callWithResponseCheck { api -> val response = responseChecker.callWithResponseCheck { api ->
api.getAlbumList(fromName(type), size, offset, null, null, null, musicFolderId) api.getAlbumList(fromName(type), size, offset, null, null, null, musicFolderId)
@ -466,8 +455,7 @@ open class RESTMusicService(
type: String, type: String,
size: Int, size: Int,
offset: Int, offset: Int,
musicFolderId: String?, musicFolderId: String?
context: Context
): MusicDirectory { ): MusicDirectory {
val response = responseChecker.callWithResponseCheck { api -> val response = responseChecker.callWithResponseCheck { api ->
api.getAlbumList2( api.getAlbumList2(
@ -509,9 +497,7 @@ open class RESTMusicService(
} }
@Throws(Exception::class) @Throws(Exception::class)
override fun getStarred( override fun getStarred(): SearchResult {
context: Context
): SearchResult {
val response = responseChecker.callWithResponseCheck { api -> val response = responseChecker.callWithResponseCheck { api ->
api.getStarred(null).execute() api.getStarred(null).execute()
} }
@ -520,9 +506,7 @@ open class RESTMusicService(
} }
@Throws(Exception::class) @Throws(Exception::class)
override fun getStarred2( override fun getStarred2(): SearchResult {
context: Context
): SearchResult {
val response = responseChecker.callWithResponseCheck { api -> val response = responseChecker.callWithResponseCheck { api ->
api.getStarred2(null).execute() api.getStarred2(null).execute()
} }
@ -547,7 +531,7 @@ open class RESTMusicService(
synchronized(entry) { synchronized(entry) {
// Use cached file, if existing. // Use cached file, if existing.
var bitmap = FileUtil.getAlbumArtBitmap(context, entry, size, highQuality) var bitmap = FileUtil.getAlbumArtBitmap(context, entry, size, highQuality)
val serverScaling = isServerScalingEnabled(context) val serverScaling = isServerScalingEnabled()
if (bitmap == null) { if (bitmap == null) {
Timber.d("Loading cover art for: %s", entry) Timber.d("Loading cover art for: %s", entry)
@ -576,7 +560,7 @@ open class RESTMusicService(
var outputStream: OutputStream? = null var outputStream: OutputStream? = null
try { try {
outputStream = FileOutputStream( outputStream = FileOutputStream(
FileUtil.getAlbumArtFile(context, entry) FileUtil.getAlbumArtFile(entry)
) )
outputStream.write(bytes) outputStream.write(bytes)
} finally { } finally {
@ -743,8 +727,7 @@ open class RESTMusicService(
@Throws(Exception::class) @Throws(Exception::class)
override fun getGenres( override fun getGenres(
refresh: Boolean, refresh: Boolean
context: Context
): List<Genre> { ): List<Genre> {
val response = responseChecker.callWithResponseCheck { api -> api.getGenres().execute() } val response = responseChecker.callWithResponseCheck { api -> api.getGenres().execute() }
@ -896,7 +879,7 @@ open class RESTMusicService(
synchronized(username) { synchronized(username) {
// Use cached file, if existing. // Use cached file, if existing.
var bitmap = FileUtil.getAvatarBitmap(context, username, size, highQuality) var bitmap = FileUtil.getAvatarBitmap(username, size, highQuality)
if (bitmap == null) { if (bitmap == null) {
var inputStream: InputStream? = null var inputStream: InputStream? = null
@ -915,7 +898,7 @@ open class RESTMusicService(
try { try {
outputStream = FileOutputStream( outputStream = FileOutputStream(
FileUtil.getAvatarFile(context, username) FileUtil.getAvatarFile(username)
) )
outputStream.write(bytes) outputStream.write(bytes)
} finally { } finally {

View File

@ -5,6 +5,7 @@ import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import java.util.Collections import java.util.Collections
import java.util.LinkedList import java.util.LinkedList
import org.koin.core.component.KoinApiExtension
import org.moire.ultrasonic.R import org.moire.ultrasonic.R
import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline
import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.domain.MusicDirectory
@ -18,6 +19,7 @@ import org.moire.ultrasonic.util.Util
/** /**
* Retrieves a list of songs and adds them to the now playing list * Retrieves a list of songs and adds them to the now playing list
*/ */
@KoinApiExtension
class DownloadHandler( class DownloadHandler(
val mediaPlayerController: MediaPlayerController, val mediaPlayerController: MediaPlayerController,
val networkAndStorageChecker: NetworkAndStorageChecker val networkAndStorageChecker: NetworkAndStorageChecker
@ -53,7 +55,7 @@ class DownloadHandler(
mediaPlayerController.suggestedPlaylistName = playlistName mediaPlayerController.suggestedPlaylistName = playlistName
} }
if (autoPlay) { if (autoPlay) {
if (Util.getShouldTransitionOnPlaybackPreference(fragment.activity)) { if (Util.getShouldTransitionOnPlaybackPreference()) {
fragment.findNavController().popBackStack(R.id.playerFragment, true) fragment.findNavController().popBackStack(R.id.playerFragment, true)
fragment.findNavController().navigate(R.id.playerFragment) fragment.findNavController().navigate(R.id.playerFragment)
} }
@ -200,17 +202,17 @@ class DownloadHandler(
@Throws(Throwable::class) @Throws(Throwable::class)
override fun doInBackground(): List<MusicDirectory.Entry> { override fun doInBackground(): List<MusicDirectory.Entry> {
val musicService = getMusicService(activity) val musicService = getMusicService()
val songs: MutableList<MusicDirectory.Entry> = LinkedList() val songs: MutableList<MusicDirectory.Entry> = LinkedList()
val root: MusicDirectory val root: MusicDirectory
if (!isOffline(activity) && isArtist && Util.getShouldUseId3Tags(activity)) { if (!isOffline() && isArtist && Util.getShouldUseId3Tags()) {
getSongsForArtist(id, songs) getSongsForArtist(id, songs)
} else { } else {
if (isDirectory) { if (isDirectory) {
root = if (!isOffline(activity) && Util.getShouldUseId3Tags(activity)) root = if (!isOffline() && Util.getShouldUseId3Tags())
musicService.getAlbum(id, name, false, activity) musicService.getAlbum(id, name, false)
else else
musicService.getMusicDirectory(id, name, false, activity) musicService.getMusicDirectory(id, name, false)
} else if (isShare) { } else if (isShare) {
root = MusicDirectory() root = MusicDirectory()
val shares = musicService.getShares(true, activity) val shares = musicService.getShares(true, activity)
@ -243,7 +245,7 @@ class DownloadHandler(
songs.add(song) songs.add(song)
} }
} }
val musicService = getMusicService(activity) val musicService = getMusicService()
for ( for (
(id1, _, _, title) in parent.getChildren( (id1, _, _, title) in parent.getChildren(
includeDirs = true, includeDirs = true,
@ -251,10 +253,10 @@ class DownloadHandler(
) )
) { ) {
val root: MusicDirectory = if ( val root: MusicDirectory = if (
!isOffline(activity) && !isOffline() &&
Util.getShouldUseId3Tags(activity) Util.getShouldUseId3Tags()
) musicService.getAlbum(id1, title, false, activity) ) musicService.getAlbum(id1, title, false)
else musicService.getMusicDirectory(id1, title, false, activity) else musicService.getMusicDirectory(id1, title, false)
getSongsRecursively(root, songs) getSongsRecursively(root, songs)
} }
} }
@ -267,14 +269,13 @@ class DownloadHandler(
if (songs.size > maxSongs) { if (songs.size > maxSongs) {
return return
} }
val musicService = getMusicService(activity) val musicService = getMusicService()
val artist = musicService.getArtist(id, "", false, activity) val artist = musicService.getArtist(id, "", false)
for ((id1) in artist.getChildren()) { for ((id1) in artist.getChildren()) {
val albumDirectory = musicService.getAlbum( val albumDirectory = musicService.getAlbum(
id1, id1,
"", "",
false, false
activity
) )
for (song in albumDirectory.getChildren()) { for (song in albumDirectory.getChildren()) {
if (!song.isVideo) { if (!song.isVideo) {
@ -285,7 +286,7 @@ class DownloadHandler(
} }
override fun done(songs: List<MusicDirectory.Entry>) { override fun done(songs: List<MusicDirectory.Entry>) {
if (Util.getShouldSortByDisc(activity)) { if (Util.getShouldSortByDisc()) {
Collections.sort(songs, EntryByDiscAndTrackComparator()) Collections.sort(songs, EntryByDiscAndTrackComparator())
} }
if (songs.isNotEmpty()) { if (songs.isNotEmpty()) {
@ -307,7 +308,7 @@ class DownloadHandler(
) )
if ( if (
!append && !append &&
Util.getShouldTransitionOnPlaybackPreference(activity) Util.getShouldTransitionOnPlaybackPreference()
) { ) {
fragment.findNavController().popBackStack( fragment.findNavController().popBackStack(
R.id.playerFragment, R.id.playerFragment,

View File

@ -31,7 +31,7 @@ class ImageLoaderProvider(val context: Context) {
if (imageLoader == null || !imageLoader!!.isRunning) { if (imageLoader == null || !imageLoader!!.isRunning) {
val legacyImageLoader = LegacyImageLoader( val legacyImageLoader = LegacyImageLoader(
context, context,
Util.getImageLoaderConcurrency(context) Util.getImageLoaderConcurrency()
) )
val isNewImageLoaderEnabled = get(FeatureStorage::class.java) val isNewImageLoaderEnabled = get(FeatureStorage::class.java)
.isFeatureEnabled(Feature.NEW_IMAGE_DOWNLOADER) .isFeatureEnabled(Feature.NEW_IMAGE_DOWNLOADER)

View File

@ -12,7 +12,7 @@ class NetworkAndStorageChecker(val context: Context) {
fun warnIfNetworkOrStorageUnavailable() { fun warnIfNetworkOrStorageUnavailable() {
if (!Util.isExternalStoragePresent()) { if (!Util.isExternalStoragePresent()) {
Util.toast(context, R.string.select_album_no_sdcard) Util.toast(context, R.string.select_album_no_sdcard)
} else if (!isOffline(context) && !Util.isNetworkConnected(context)) { } else if (!isOffline() && !Util.isNetworkConnected(context)) {
Util.toast(context, R.string.select_album_no_network) Util.toast(context, R.string.select_album_no_network)
} }
} }

View File

@ -40,13 +40,13 @@ class ShareHandler(val context: Context) {
swipe: SwipeRefreshLayout?, swipe: SwipeRefreshLayout?,
cancellationToken: CancellationToken cancellationToken: CancellationToken
) { ) {
val askForDetails = Util.getShouldAskForShareDetails(context) val askForDetails = Util.getShouldAskForShareDetails()
val shareDetails = ShareDetails() val shareDetails = ShareDetails()
shareDetails.Entries = entries shareDetails.Entries = entries
if (askForDetails) { if (askForDetails) {
showDialog(fragment, shareDetails, swipe, cancellationToken) showDialog(fragment, shareDetails, swipe, cancellationToken)
} else { } else {
shareDetails.Description = Util.getDefaultShareDescription(context) shareDetails.Description = Util.getDefaultShareDescription()
shareDetails.Expiration = TimeSpan.getCurrentTime().add( shareDetails.Expiration = TimeSpan.getCurrentTime().add(
Util.getDefaultShareExpirationInMillis(context) Util.getDefaultShareExpirationInMillis(context)
).totalMilliseconds ).totalMilliseconds
@ -76,7 +76,7 @@ class ShareHandler(val context: Context) {
ids.add(id) ids.add(id)
} }
} }
val musicService = getMusicService(context) val musicService = getMusicService()
var timeInMillis: Long = 0 var timeInMillis: Long = 0
if (shareDetails.Expiration != 0L) { if (shareDetails.Expiration != 0L) {
timeInMillis = shareDetails.Expiration timeInMillis = shareDetails.Expiration
@ -131,17 +131,16 @@ class ShareHandler(val context: Context) {
} }
shareDetails.Description = shareDescription!!.text.toString() shareDetails.Description = shareDescription!!.text.toString()
if (hideDialogCheckBox!!.isChecked) { if (hideDialogCheckBox!!.isChecked) {
Util.setShouldAskForShareDetails(context, false) Util.setShouldAskForShareDetails(false)
} }
if (saveAsDefaultsCheckBox!!.isChecked) { if (saveAsDefaultsCheckBox!!.isChecked) {
val timeSpanType: String = timeSpanPicker!!.timeSpanType val timeSpanType: String = timeSpanPicker!!.timeSpanType
val timeSpanAmount: Int = timeSpanPicker!!.timeSpanAmount val timeSpanAmount: Int = timeSpanPicker!!.timeSpanAmount
Util.setDefaultShareExpiration( Util.setDefaultShareExpiration(
context,
if (!noExpirationCheckBox!!.isChecked && timeSpanAmount > 0) if (!noExpirationCheckBox!!.isChecked && timeSpanAmount > 0)
String.format("%d:%s", timeSpanAmount, timeSpanType) else "" String.format("%d:%s", timeSpanAmount, timeSpanType) else ""
) )
Util.setDefaultShareDescription(context, shareDetails.Description) Util.setDefaultShareDescription(shareDetails.Description)
} }
share(fragment, shareDetails, swipe, cancellationToken) share(fragment, shareDetails, swipe, cancellationToken)
} }
@ -156,8 +155,8 @@ class ShareHandler(val context: Context) {
b -> b ->
timeSpanPicker!!.isEnabled = !b timeSpanPicker!!.isEnabled = !b
} }
val defaultDescription = Util.getDefaultShareDescription(context) val defaultDescription = Util.getDefaultShareDescription()
val timeSpan = Util.getDefaultShareExpiration(context) val timeSpan = Util.getDefaultShareExpiration()
val split = pattern.split(timeSpan) val split = pattern.split(timeSpan)
if (split.size == 2) { if (split.size == 2) {
val timeSpanAmount = split[0].toInt() val timeSpanAmount = split[0].toInt()

View File

@ -14,7 +14,7 @@ class VideoPlayer() {
Util.toast(context, R.string.select_album_no_network) Util.toast(context, R.string.select_album_no_network)
return return
} }
val player = Util.getVideoPlayerType(context) val player = Util.getVideoPlayerType()
try { try {
player.playVideo(context, entry) player.playVideo(context, entry)
} catch (e: Exception) { } catch (e: Exception) {

View File

@ -22,7 +22,7 @@ class SubsonicUncaughtExceptionHandler(
var printWriter: PrintWriter? = null var printWriter: PrintWriter? = null
try { try {
file = File(FileUtil.getUltrasonicDirectory(context), filename) file = File(FileUtil.getUltrasonicDirectory(), filename)
printWriter = PrintWriter(file) printWriter = PrintWriter(file)
val logMessage = String.format( val logMessage = String.format(
"Android API level: %s\nUltrasonic version name: %s\n" + "Android API level: %s\nUltrasonic version name: %s\n" +

View File

@ -112,13 +112,13 @@ class SongView(context: Context) : UpdateView(context), Checkable {
fileFormat = if ( fileFormat = if (
TextUtils.isEmpty(transcodedSuffix) || transcodedSuffix == suffix || TextUtils.isEmpty(transcodedSuffix) || transcodedSuffix == suffix ||
song.isVideo && Util.getVideoPlayerType(this.context) !== VideoPlayerType.FLASH song.isVideo && Util.getVideoPlayerType() !== VideoPlayerType.FLASH
) suffix else String.format("%s > %s", suffix, transcodedSuffix) ) suffix else String.format("%s > %s", suffix, transcodedSuffix)
val artistName = song.artist val artistName = song.artist
if (artistName != null) { if (artistName != null) {
if (Util.shouldDisplayBitrateWithArtist(this.context)) { if (Util.shouldDisplayBitrateWithArtist()) {
artist.append(artistName).append(" (").append( artist.append(artistName).append(" (").append(
String.format( String.format(
this.context.getString(R.string.song_details_all), this.context.getString(R.string.song_details_all),
@ -132,7 +132,7 @@ class SongView(context: Context) : UpdateView(context), Checkable {
val trackNumber = song.track ?: 0 val trackNumber = song.track ?: 0
if (Util.shouldShowTrackNumber(this.context) && trackNumber != 0) { if (Util.shouldShowTrackNumber() && trackNumber != 0) {
viewHolder?.track?.text = String.format("%02d.", trackNumber) viewHolder?.track?.text = String.format("%02d.", trackNumber)
} else { } else {
viewHolder?.track?.visibility = GONE viewHolder?.track?.visibility = GONE
@ -141,7 +141,7 @@ class SongView(context: Context) : UpdateView(context), Checkable {
val title = StringBuilder(60) val title = StringBuilder(60)
title.append(song.title) title.append(song.title)
if (song.isVideo && Util.shouldDisplayBitrateWithArtist(this.context)) { if (song.isVideo && Util.shouldDisplayBitrateWithArtist()) {
title.append(" (").append( title.append(" (").append(
String.format( String.format(
this.context.getString(R.string.song_details_all), this.context.getString(R.string.song_details_all),
@ -161,7 +161,7 @@ class SongView(context: Context) : UpdateView(context), Checkable {
viewHolder?.check?.visibility = if (checkable && !song.isVideo) VISIBLE else GONE viewHolder?.check?.visibility = if (checkable && !song.isVideo) VISIBLE else GONE
viewHolder?.drag?.visibility = if (draggable) VISIBLE else GONE viewHolder?.drag?.visibility = if (draggable) VISIBLE else GONE
if (isOffline(this.context)) { if (isOffline()) {
viewHolder?.star?.visibility = GONE viewHolder?.star?.visibility = GONE
viewHolder?.rating?.visibility = GONE viewHolder?.rating?.visibility = GONE
} else { } else {
@ -201,12 +201,12 @@ class SongView(context: Context) : UpdateView(context), Checkable {
song.starred = false song.starred = false
} }
Thread { Thread {
val musicService = getMusicService(this@SongView.context) val musicService = getMusicService()
try { try {
if (!isStarred) { if (!isStarred) {
musicService.star(id, null, null, this@SongView.context) musicService.star(id, null, null)
} else { } else {
musicService.unstar(id, null, null, this@SongView.context) musicService.unstar(id, null, null)
} }
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Timber.e(e)
@ -358,7 +358,7 @@ class SongView(context: Context) : UpdateView(context), Checkable {
} }
init { init {
val theme = Util.getTheme(context) val theme = Util.getTheme()
val themesMatch = theme == Companion.theme val themesMatch = theme == Companion.theme
inflater = LayoutInflater.from(this.context) inflater = LayoutInflater.from(this.context)