From 33f4f31066cd728a77a2fd2a6e06ceb9efba825b Mon Sep 17 00:00:00 2001 From: Hemanth S Date: Fri, 9 Oct 2020 23:14:02 +0530 Subject: [PATCH] Updated Playlist refresh Bottom navigation shows when coming from notification Removed animation for lyrics page Added playlist reorder Added refresh for album & artist details when update Fix when scan to update library Added sort for playlist Fix album art not showing in lockscreen --- app/src/main/ic_launcher-playstore.png | Bin 22855 -> 14330 bytes .../code/name/monkey/retromusic/Constants.kt | 1 + .../retromusic/activities/LyricsActivity.kt | 13 +- .../retromusic/activities/MainActivity.kt | 30 +- .../base/AbsSlidingMusicPanelActivity.kt | 10 +- .../adapter/album/AlbumCoverPagerAdapter.kt | 15 +- .../adapter/playlist/PlaylistAdapter.kt | 14 +- .../dialogs/RemoveSongFromPlaylistDialog.kt | 2 - .../retromusic/fragments/LibraryViewModel.kt | 7 +- .../fragments/albums/AlbumDetailsViewModel.kt | 17 +- .../artists/ArtistDetailsFragment.kt | 4 +- .../artists/ArtistDetailsViewModel.kt | 19 +- .../AbsRecyclerViewCustomGridSizeFragment.kt | 1 + .../fragments/base/AbsRecyclerViewFragment.kt | 1 + .../fragments/folder/FoldersFragment.java | 1420 ++++----- .../retromusic/fragments/home/HomeFragment.kt | 1 + .../playlists/PlaylistDetailsFragment.kt | 20 +- .../playlists/PlaylistDetailsViewModel.kt | 21 +- .../fragments/playlists/PlaylistsFragment.kt | 140 +- .../monkey/retromusic/helper/SortOrder.kt | 21 + .../interfaces/IPlaylistClickListener.kt | 8 + .../retromusic/repository/GenreRepository.kt | 39 +- .../retromusic/repository/RoomRepository.kt | 35 +- .../retromusic/service/MusicService.java | 2640 ++++++++--------- .../monkey/retromusic/util/PreferenceUtil.kt | 90 +- .../drawable-night/ic_launcher_background.xml | 10 + .../drawable-v24/ic_launcher_foreground.xml | 133 +- .../res/drawable/ic_launcher_background.xml | 2 +- app/src/main/res/layout/activity_lyrics.xml | 1 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 2 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 2 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3517 -> 3323 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 14004 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 2256 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 3517 -> 3323 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2205 -> 2204 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 8211 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 1394 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2205 -> 2204 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 5189 -> 4613 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 20448 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 3273 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 5189 -> 4613 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 8281 -> 7157 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 34620 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 5716 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 8281 -> 7157 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 11968 -> 10135 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 50987 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 8527 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 11968 -> 10135 bytes .../res/values/ic_launcher_background.xml | 2 +- app/src/main/res/values/ids.xml | 3 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/xml/pref_ui.xml | 4 +- 55 files changed, 2532 insertions(+), 2199 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/interfaces/IPlaylistClickListener.kt create mode 100644 app/src/main/res/drawable-night/ic_launcher_background.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png index 9fdd702524da1c8b0b57e5f44cef3f4892fa3908..7730a4738f55a5fe35ff37680595e35a3e07d6d6 100644 GIT binary patch literal 14330 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 V3dS@_LI#w)9B}u+J=zm`@n59HOz!{y diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.kt b/app/src/main/java/code/name/monkey/retromusic/Constants.kt index 452b2fa3..ae1f1da7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt +++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt @@ -108,6 +108,7 @@ const val INITIALIZED_BLACKLIST = "initialized_blacklist" const val ARTIST_SORT_ORDER = "artist_sort_order" const val ARTIST_ALBUM_SORT_ORDER = "artist_album_sort_order" const val ALBUM_SORT_ORDER = "album_sort_order" +const val PLAYLIST_SORT_ORDER = "playlist_sort_order" const val ALBUM_SONG_SORT_ORDER = "album_song_sort_order" const val ARTIST_SONG_SORT_ORDER = "artist_song_sort_order" const val ALBUM_GRID_SIZE = "album_grid_size" diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt index 25300b92..ac434622 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt @@ -17,8 +17,8 @@ package code.name.monkey.retromusic.activities import android.os.Bundle import android.view.Menu import android.view.MenuItem -import android.view.View import android.view.WindowManager +import androidx.core.view.ViewCompat import androidx.interpolator.view.animation.FastOutSlowInInterpolator import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper @@ -54,22 +54,17 @@ class LyricsActivity : AbsMusicServiceActivity(), MusicProgressViewUpdateHelper. private fun buildContainerTransform(): MaterialContainerTransform { val transform = MaterialContainerTransform() transform.setAllContainerColors( - MaterialColors.getColor(findViewById(android.R.id.content), R.attr.colorSurface) + MaterialColors.getColor(findViewById(R.id.container), R.attr.colorSurface) ) - transform.addTarget(android.R.id.content) + transform.addTarget(R.id.container) transform.duration = 300 - transform.interpolator = FastOutSlowInInterpolator() - transform.pathMotion = MaterialArcMotion() return transform } override fun onCreate(savedInstanceState: Bundle?) { - findViewById(android.R.id.content).transitionName = "lyrics" - setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback()) - window.sharedElementEnterTransition = buildContainerTransform() - window.sharedElementReturnTransition = buildContainerTransform() super.onCreate(savedInstanceState) setContentView(R.layout.activity_lyrics) + ViewCompat.setTransitionName(container, "lyrics") setStatusbarColorAuto() setTaskDescriptionColorAuto() setNavigationbarColorAuto() diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt index eeb6426e..aaf52166 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt @@ -23,7 +23,32 @@ import android.provider.MediaStore import android.view.View import androidx.lifecycle.lifecycleScope import androidx.navigation.ui.NavigationUI -import code.name.monkey.retromusic.* +import code.name.monkey.retromusic.ADAPTIVE_COLOR_APP +import code.name.monkey.retromusic.ALBUM_COVER_STYLE +import code.name.monkey.retromusic.ALBUM_COVER_TRANSFORM +import code.name.monkey.retromusic.BANNER_IMAGE_PATH +import code.name.monkey.retromusic.BLACK_THEME +import code.name.monkey.retromusic.CAROUSEL_EFFECT +import code.name.monkey.retromusic.CIRCULAR_ALBUM_ART +import code.name.monkey.retromusic.DESATURATED_COLOR +import code.name.monkey.retromusic.EXTRA_SONG_INFO +import code.name.monkey.retromusic.GENERAL_THEME +import code.name.monkey.retromusic.HOME_ARTIST_GRID_STYLE +import code.name.monkey.retromusic.KEEP_SCREEN_ON +import code.name.monkey.retromusic.LANGUAGE_NAME +import code.name.monkey.retromusic.LIBRARY_CATEGORIES +import code.name.monkey.retromusic.NOW_PLAYING_SCREEN_ID +import code.name.monkey.retromusic.PROFILE_IMAGE_PATH +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.ROUND_CORNERS +import code.name.monkey.retromusic.TAB_TEXT_MODE +import code.name.monkey.retromusic.TOGGLE_ADD_CONTROLS +import code.name.monkey.retromusic.TOGGLE_FULL_SCREEN +import code.name.monkey.retromusic.TOGGLE_GENRE +import code.name.monkey.retromusic.TOGGLE_HOME_BANNER +import code.name.monkey.retromusic.TOGGLE_SEPARATE_LINE +import code.name.monkey.retromusic.TOGGLE_VOLUME +import code.name.monkey.retromusic.USER_NAME import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity import code.name.monkey.retromusic.extensions.findNavController import code.name.monkey.retromusic.helper.MusicPlayerRemote @@ -32,6 +57,7 @@ import code.name.monkey.retromusic.model.CategoryInfo import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.repository.PlaylistSongsLoader import code.name.monkey.retromusic.service.MusicService +import code.name.monkey.retromusic.state.NowPlayingPanelState import code.name.monkey.retromusic.util.AppRater import code.name.monkey.retromusic.util.PreferenceUtil import kotlinx.coroutines.Dispatchers.IO @@ -94,7 +120,7 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis intent.getBooleanExtra(EXPAND_PANEL, false) && PreferenceUtil.isExpandPanel ) { - expandPanel() + libraryViewModel.setPanelState(NowPlayingPanelState.EXPAND) intent.removeExtra(EXPAND_PANEL) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt index 009912af..c6d7e501 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt @@ -29,7 +29,11 @@ import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.retromusic.R import code.name.monkey.retromusic.RetroBottomSheetBehavior -import code.name.monkey.retromusic.extensions.* +import code.name.monkey.retromusic.extensions.hide +import code.name.monkey.retromusic.extensions.peekHeightAnimate +import code.name.monkey.retromusic.extensions.show +import code.name.monkey.retromusic.extensions.translateXAnimate +import code.name.monkey.retromusic.extensions.whichFragment import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.MiniPlayerFragment import code.name.monkey.retromusic.fragments.NowPlayingScreen @@ -118,6 +122,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { val themeColor = ATHUtil.resolveColor(this, android.R.attr.windowBackground, Color.GRAY) dimBackground.setBackgroundColor(ColorUtil.withAlpha(themeColor, 0.5f)) dimBackground.setOnClickListener { + println("dimBackground") libraryViewModel.setPanelState(COLLAPSED_WITH) } } @@ -209,6 +214,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this) + println("onServiceConnected") if (bottomNavigationView.isVisible) { libraryViewModel.setPanelState(COLLAPSED_WITH) } else { @@ -225,6 +231,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { libraryViewModel.setPanelState(HIDE) } else { if (bottomNavigationView.isVisible) { + println("onQueueChanged") libraryViewModel.setPanelState(COLLAPSED_WITH) } else { libraryViewModel.setPanelState(COLLAPSED_WITHOUT) @@ -339,6 +346,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { EXPAND -> { println("EXPAND") expandPanel() + bottomNavigationView.translateXAnimate(150f) } HIDE -> { println("HIDE") diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt index d994c824..f6ca4179 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt @@ -14,18 +14,16 @@ */ package code.name.monkey.retromusic.adapter.album -import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView -import androidx.core.app.ActivityOptionsCompat +import androidx.core.view.ViewCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.lifecycle.lifecycleScope import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.activities.LyricsActivity import code.name.monkey.retromusic.fragments.AlbumCoverStyle import code.name.monkey.retromusic.fragments.NowPlayingScreen.* import code.name.monkey.retromusic.glide.RetroMusicColoredTarget @@ -105,15 +103,10 @@ class AlbumCoverPagerAdapter( savedInstanceState: Bundle? ): View? { val view = inflater.inflate(getLayoutWithPlayerTheme(), container, false) + ViewCompat.setTransitionName(view, "lyrics") albumCover = view.findViewById(R.id.player_image) - albumCover.setOnClickListener { - val intent = Intent(requireContext(), LyricsActivity::class.java) - val activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation( - requireActivity(), - it, - "lyrics" - ) - startActivity(intent, activityOptions.toBundle()) + view.setOnClickListener { + showLyricsDialog() } return view } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt index ddfe8c0c..df14d37d 100755 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt @@ -24,12 +24,10 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.PopupMenu -import androidx.core.os.bundleOf +import androidx.core.view.ViewCompat import androidx.fragment.app.FragmentActivity -import androidx.navigation.findNavController import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.TintHelper -import code.name.monkey.retromusic.EXTRA_PLAYLIST import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder @@ -42,6 +40,7 @@ import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper import code.name.monkey.retromusic.helper.menu.SongsMenuHelper import code.name.monkey.retromusic.interfaces.ICabHolder +import code.name.monkey.retromusic.interfaces.IPlaylistClickListener import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.repository.PlaylistSongsLoader @@ -53,7 +52,8 @@ class PlaylistAdapter( private val activity: FragmentActivity, var dataSet: List, private var itemLayoutRes: Int, - ICabHolder: ICabHolder? + ICabHolder: ICabHolder?, + private val listener: IPlaylistClickListener ) : AbsMultiSelectAdapter( activity, ICabHolder, @@ -172,10 +172,8 @@ class PlaylistAdapter( if (isInQuickSelectMode) { toggleChecked(layoutPosition) } else { - activity.findNavController(R.id.fragment_container).navigate( - R.id.playlistDetailsFragment, - bundleOf(EXTRA_PLAYLIST to dataSet[layoutPosition]) - ) + ViewCompat.setTransitionName(itemView, "playlist") + listener.onPlaylistClick(dataSet[layoutPosition], itemView) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt index 93ac92f8..a480c7a3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt @@ -26,7 +26,6 @@ import code.name.monkey.retromusic.extensions.colorButtons import code.name.monkey.retromusic.extensions.extraNotNull import code.name.monkey.retromusic.extensions.materialDialog import code.name.monkey.retromusic.fragments.LibraryViewModel -import code.name.monkey.retromusic.fragments.ReloadType.Playlists import org.koin.androidx.viewmodel.ext.android.sharedViewModel class RemoveSongFromPlaylistDialog : DialogFragment() { @@ -74,7 +73,6 @@ class RemoveSongFromPlaylistDialog : DialogFragment() { .setMessage(pair.second) .setPositiveButton(R.string.remove_action) { _, _ -> libraryViewModel.deleteSongsInPlaylist(songs) - libraryViewModel.forceReload(Playlists) } .setNegativeButton(android.R.string.cancel, null) .create() diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt index 5854a750..96b28733 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt @@ -222,8 +222,11 @@ class LibraryViewModel( repository.renameRoomPlaylist(playListId, name) } - fun deleteSongsInPlaylist(songs: List) = viewModelScope.launch(IO) { - repository.deleteSongsInPlaylist(songs) + fun deleteSongsInPlaylist(songs: List) { + viewModelScope.launch(IO) { + repository.deleteSongsInPlaylist(songs) + forceReload(Playlists) + } } fun deleteSongsFromPlaylist(playlists: List) = viewModelScope.launch(IO) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt index c3f85d72..0dfa0ba7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt @@ -15,8 +15,10 @@ package code.name.monkey.retromusic.fragments.albums import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.liveData +import androidx.lifecycle.viewModelScope import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Artist @@ -24,16 +26,26 @@ import code.name.monkey.retromusic.network.Result import code.name.monkey.retromusic.network.model.LastFmAlbum import code.name.monkey.retromusic.repository.RealRepository import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.launch class AlbumDetailsViewModel( private val repository: RealRepository, private val albumId: Long ) : ViewModel(), IMusicServiceEventListener { + private val albumDetails = MutableLiveData() - fun getAlbum(): LiveData = liveData(IO) { - emit(repository.albumByIdAsync(albumId)) + init { + fetchAlbum() } + private fun fetchAlbum() { + viewModelScope.launch(IO) { + albumDetails.postValue(repository.albumByIdAsync(albumId)) + } + } + + fun getAlbum(): LiveData = albumDetails + fun getArtist(artistId: Long): LiveData = liveData(IO) { val artist = repository.artistById(artistId) emit(artist) @@ -51,6 +63,7 @@ class AlbumDetailsViewModel( } override fun onMediaStoreChanged() { + fetchAlbum() } override fun onServiceConnected() {} diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt index d63b0e1b..c9f12a70 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt @@ -94,16 +94,14 @@ class ArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_d override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) setHasOptionsMenu(true) - libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT) - mainActivity.setSupportActionBar(toolbar) + libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT) toolbar.title = null setupRecyclerView() ViewCompat.setTransitionName(container, "artist") - postponeEnterTransition() detailsViewModel.getArtist().observe(viewLifecycleOwner, Observer { startPostponedEnterTransition() diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsViewModel.kt index a871069f..dbb59866 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsViewModel.kt @@ -15,25 +15,36 @@ package code.name.monkey.retromusic.fragments.artists import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.liveData +import androidx.lifecycle.viewModelScope import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.network.Result import code.name.monkey.retromusic.network.model.LastFmArtist import code.name.monkey.retromusic.repository.RealRepository import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.launch class ArtistDetailsViewModel( private val realRepository: RealRepository, private val artistId: Long ) : ViewModel(), IMusicServiceEventListener { + private val artistDetails = MutableLiveData() - fun getArtist(): LiveData = liveData(IO) { - val artist = realRepository.artistById(artistId) - emit(artist) + init { + fetchArtist() } + private fun fetchArtist() { + viewModelScope.launch(IO) { + artistDetails.postValue(realRepository.artistById(artistId)) + } + } + + fun getArtist(): LiveData = artistDetails + fun getArtistInfo( name: String, lang: String?, @@ -45,7 +56,7 @@ class ArtistDetailsViewModel( } override fun onMediaStoreChanged() { - getArtist() + fetchArtist() } override fun onServiceConnected() {} diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt index cf46337d..7a03ab2a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt @@ -73,6 +73,7 @@ abstract class AbsRecyclerViewCustomGridSizeFragment fun setAndSaveSortOrder(sortOrder: String) { this.sortOrder = sortOrder + println(sortOrder) saveSortOrder(sortOrder) setSortOrder(sortOrder) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt index 1d06263b..86243a13 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt @@ -61,6 +61,7 @@ abstract class AbsRecyclerViewFragment, LM : Recycle override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + println("AbsRecyclerViewFragment") libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITH) mainActivity.setSupportActionBar(toolbar) mainActivity.supportActionBar?.title = null diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java index e0769e8f..5e03ad76 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java @@ -14,8 +14,6 @@ package code.name.monkey.retromusic.fragments.folder; -import static code.name.monkey.appthemehelper.common.ATHToolbarActivity.getToolbarBackgroundColor; - import android.app.Dialog; import android.content.Context; import android.media.MediaScannerConnection; @@ -34,6 +32,7 @@ import android.webkit.MimeTypeMap; import android.widget.PopupMenu; import android.widget.TextView; import android.widget.Toast; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.Toolbar; @@ -43,6 +42,23 @@ import androidx.loader.content.Loader; import androidx.navigation.Navigation; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; + +import com.afollestad.materialcab.MaterialCab; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import com.google.android.material.snackbar.Snackbar; + +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; + import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.util.ATHUtil; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; @@ -67,754 +83,744 @@ import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.ThemedFastScroller; import code.name.monkey.retromusic.views.BreadCrumbLayout; import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListener; -import com.afollestad.materialcab.MaterialCab; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.google.android.material.snackbar.Snackbar; -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; import me.zhanghai.android.fastscroll.FastScroller; -import org.jetbrains.annotations.NotNull; + +import static code.name.monkey.appthemehelper.common.ATHToolbarActivity.getToolbarBackgroundColor; public class FoldersFragment extends AbsMainActivityFragment - implements IMainActivityFragmentCallbacks, + implements IMainActivityFragmentCallbacks, ICabHolder, BreadCrumbLayout.SelectionCallback, ICallbacks, LoaderManager.LoaderCallbacks> { - public static final String TAG = FoldersFragment.class.getSimpleName(); - public static final FileFilter AUDIO_FILE_FILTER = - file -> - !file.isHidden() - && (file.isDirectory() - || FileUtil.fileIsMimeType(file, "audio/*", MimeTypeMap.getSingleton()) - || FileUtil.fileIsMimeType(file, "application/opus", MimeTypeMap.getSingleton()) - || FileUtil.fileIsMimeType(file, "application/ogg", MimeTypeMap.getSingleton())); + public static final String TAG = FoldersFragment.class.getSimpleName(); + public static final FileFilter AUDIO_FILE_FILTER = + file -> + !file.isHidden() + && (file.isDirectory() + || FileUtil.fileIsMimeType(file, "audio/*", MimeTypeMap.getSingleton()) + || FileUtil.fileIsMimeType(file, "application/opus", MimeTypeMap.getSingleton()) + || FileUtil.fileIsMimeType(file, "application/ogg", MimeTypeMap.getSingleton())); - private static final String CRUMBS = "crumbs"; - private static final int LOADER_ID = 5; - private SongFileAdapter adapter; - private Toolbar toolbar; - private TextView appNameText; - private BreadCrumbLayout breadCrumbs; - private MaterialCab cab; - private View coordinatorLayout; - private View empty; - private TextView emojiText; - private Comparator fileComparator = - (lhs, rhs) -> { - if (lhs.isDirectory() && !rhs.isDirectory()) { - return -1; - } else if (!lhs.isDirectory() && rhs.isDirectory()) { - return 1; - } else { - return lhs.getName().compareToIgnoreCase(rhs.getName()); - } - }; - private RecyclerView recyclerView; - - public FoldersFragment() { - super(R.layout.fragment_folder); - } - - public static File getDefaultStartDirectory() { - File musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); - File startFolder; - if (musicDir.exists() && musicDir.isDirectory()) { - startFolder = musicDir; - } else { - File externalStorage = Environment.getExternalStorageDirectory(); - if (externalStorage.exists() && externalStorage.isDirectory()) { - startFolder = externalStorage; - } else { - startFolder = new File("/"); // root - } - } - return startFolder; - } - - private static File tryGetCanonicalFile(File file) { - try { - return file.getCanonicalFile(); - } catch (IOException e) { - e.printStackTrace(); - return file; - } - } - - @NonNull - @Override - public View onCreateView( - @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_folder, container, false); - initViews(view); - return view; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - getLibraryViewModel().setPanelState(NowPlayingPanelState.COLLAPSED_WITH); - getMainActivity().setSupportActionBar(toolbar); - getMainActivity().getSupportActionBar().setTitle(null); - setStatusBarColorAuto(view); - setUpAppbarColor(); - setUpBreadCrumbs(); - setUpRecyclerView(); - setUpAdapter(); - setUpTitle(); - } - - private void setUpTitle() { - toolbar.setNavigationOnClickListener( - v -> Navigation.findNavController(v).navigate(R.id.searchFragment, null, getNavOptions())); - int color = ThemeStore.Companion.accentColor(requireContext()); - String hexColor = String.format("#%06X", 0xFFFFFF & color); - Spanned appName = - HtmlCompat.fromHtml( - "Retro Music", - HtmlCompat.FROM_HTML_MODE_COMPACT); - appNameText.setText(appName); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - setHasOptionsMenu(true); - if (savedInstanceState == null) { - setCrumb( - new BreadCrumbLayout.Crumb( - FileUtil.safeGetCanonicalFile(PreferenceUtil.INSTANCE.getStartDirectory())), - true); - } else { - breadCrumbs.restoreFromStateWrapper(savedInstanceState.getParcelable(CRUMBS)); - LoaderManager.getInstance(this).initLoader(LOADER_ID, null, this); - } - } - - @Override - public void onPause() { - super.onPause(); - saveScrollPosition(); - } - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - if (breadCrumbs != null) { - outState.putParcelable(CRUMBS, breadCrumbs.getStateWrapper()); - } - } - - @Override - public boolean handleBackPress() { - if (cab != null && cab.isActive()) { - cab.finish(); - return true; - } - if (breadCrumbs != null && breadCrumbs.popHistory()) { - setCrumb(breadCrumbs.lastHistory(), false); - return true; - } - return false; - } - - @NonNull - @Override - public Loader> onCreateLoader(int id, Bundle args) { - return new AsyncFileLoader(this); - } - - @Override - public void onCrumbSelection(BreadCrumbLayout.Crumb crumb, int index) { - setCrumb(crumb, true); - } - - @Override - public void onFileMenuClicked(final File file, @NotNull View view) { - PopupMenu popupMenu = new PopupMenu(getActivity(), view); - if (file.isDirectory()) { - popupMenu.inflate(R.menu.menu_item_directory); - popupMenu.setOnMenuItemClickListener( - item -> { - final int itemId = item.getItemId(); - switch (itemId) { - case R.id.action_play_next: - case R.id.action_add_to_current_playing: - case R.id.action_add_to_playlist: - case R.id.action_delete_from_device: - new ListSongsAsyncTask( - getActivity(), - null, - (songs, extra) -> { - if (!songs.isEmpty()) { - SongsMenuHelper.INSTANCE.handleMenuClick( - requireActivity(), songs, itemId); - } - }) - .execute( - new ListSongsAsyncTask.LoadingInfo( - toList(file), AUDIO_FILE_FILTER, getFileComparator())); - return true; - case R.id.action_set_as_start_directory: - PreferenceUtil.INSTANCE.setStartDirectory(file); - Toast.makeText( - getActivity(), - String.format(getString(R.string.new_start_directory), file.getPath()), - Toast.LENGTH_SHORT) - .show(); - return true; - case R.id.action_scan: - new ListPathsAsyncTask(getActivity(), this::scanPaths) - .execute(new ListPathsAsyncTask.LoadingInfo(file, AUDIO_FILE_FILTER)); - return true; - } - return false; - }); - } else { - popupMenu.inflate(R.menu.menu_item_file); - popupMenu.setOnMenuItemClickListener( - item -> { - final int itemId = item.getItemId(); - switch (itemId) { - case R.id.action_play_next: - case R.id.action_add_to_current_playing: - case R.id.action_add_to_playlist: - case R.id.action_go_to_album: - case R.id.action_go_to_artist: - case R.id.action_share: - case R.id.action_tag_editor: - case R.id.action_details: - case R.id.action_set_as_ringtone: - case R.id.action_delete_from_device: - new ListSongsAsyncTask( - getActivity(), - null, - (songs, extra) -> - SongMenuHelper.INSTANCE.handleMenuClick( - requireActivity(), songs.get(0), itemId)) - .execute( - new ListSongsAsyncTask.LoadingInfo( - toList(file), AUDIO_FILE_FILTER, getFileComparator())); - return true; - case R.id.action_scan: - new ListPathsAsyncTask(getActivity(), this::scanPaths) - .execute(new ListPathsAsyncTask.LoadingInfo(file, AUDIO_FILE_FILTER)); - return true; - } - return false; - }); - } - popupMenu.show(); - } - - @Override - public void onFileSelected(@NotNull File file) { - file = tryGetCanonicalFile(file); // important as we compare the path value later - if (file.isDirectory()) { - setCrumb(new BreadCrumbLayout.Crumb(file), true); - } else { - FileFilter fileFilter = - pathname -> !pathname.isDirectory() && AUDIO_FILE_FILTER.accept(pathname); - new ListSongsAsyncTask( - getActivity(), - file, - (songs, extra) -> { - File file1 = (File) extra; - int startIndex = -1; - for (int i = 0; i < songs.size(); i++) { - if (file1 - .getPath() - .equals(songs.get(i).getData())) { // path is already canonical here - startIndex = i; - break; - } - } - if (startIndex > -1) { - MusicPlayerRemote.openQueue(songs, startIndex, true); + private static final String CRUMBS = "crumbs"; + private static final int LOADER_ID = 5; + private SongFileAdapter adapter; + private Toolbar toolbar; + private TextView appNameText; + private BreadCrumbLayout breadCrumbs; + private MaterialCab cab; + private View coordinatorLayout; + private View empty; + private TextView emojiText; + private Comparator fileComparator = + (lhs, rhs) -> { + if (lhs.isDirectory() && !rhs.isDirectory()) { + return -1; + } else if (!lhs.isDirectory() && rhs.isDirectory()) { + return 1; } else { - final File finalFile = file1; - Snackbar.make( - coordinatorLayout, - Html.fromHtml( - String.format( - getString(R.string.not_listed_in_media_store), file1.getName())), - Snackbar.LENGTH_LONG) - .setAction( - R.string.action_scan, - v -> - new ListPathsAsyncTask(requireActivity(), this::scanPaths) - .execute( - new ListPathsAsyncTask.LoadingInfo( - finalFile, AUDIO_FILE_FILTER))) - .setActionTextColor(ThemeStore.Companion.accentColor(requireActivity())) - .show(); + return lhs.getName().compareToIgnoreCase(rhs.getName()); } - }) - .execute( - new ListSongsAsyncTask.LoadingInfo( - toList(file.getParentFile()), fileFilter, getFileComparator())); + }; + private RecyclerView recyclerView; + + public FoldersFragment() { + super(R.layout.fragment_folder); } - } - @Override - public void onLoadFinished(@NonNull Loader> loader, List data) { - updateAdapter(data); - } + public static File getDefaultStartDirectory() { + File musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); + File startFolder; + if (musicDir.exists() && musicDir.isDirectory()) { + startFolder = musicDir; + } else { + File externalStorage = Environment.getExternalStorageDirectory(); + if (externalStorage.exists() && externalStorage.isDirectory()) { + startFolder = externalStorage; + } else { + startFolder = new File("/"); // root + } + } + return startFolder; + } - @Override - public void onLoaderReset(@NonNull Loader> loader) { - updateAdapter(new LinkedList()); - } + private static File tryGetCanonicalFile(File file) { + try { + return file.getCanonicalFile(); + } catch (IOException e) { + e.printStackTrace(); + return file; + } + } - @Override - public void onMultipleItemAction(MenuItem item, @NotNull ArrayList files) { - final int itemId = item.getItemId(); - new ListSongsAsyncTask( - getActivity(), - null, - (songs, extra) -> - SongsMenuHelper.INSTANCE.handleMenuClick(requireActivity(), songs, itemId)) - .execute(new ListSongsAsyncTask.LoadingInfo(files, AUDIO_FILE_FILTER, getFileComparator())); - } + @NonNull + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_folder, container, false); + initViews(view); + return view; + } - @Override - public void onPrepareOptionsMenu(@NonNull Menu menu) { - super.onPrepareOptionsMenu(menu); - ToolbarContentTintHelper.handleOnPrepareOptionsMenu(requireActivity(), toolbar); - } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + getMainActivity().addMusicServiceEventListener(getLibraryViewModel()); + getLibraryViewModel().setPanelState(NowPlayingPanelState.COLLAPSED_WITH); + getMainActivity().setSupportActionBar(toolbar); + getMainActivity().getSupportActionBar().setTitle(null); + setStatusBarColorAuto(view); + setUpAppbarColor(); + setUpBreadCrumbs(); + setUpRecyclerView(); + setUpAdapter(); + setUpTitle(); + } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - menu.add(0, R.id.action_scan, 0, R.string.scan_media) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - menu.add(0, R.id.action_go_to_start_directory, 1, R.string.action_go_to_start_directory) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - menu.removeItem(R.id.action_grid_size); - menu.removeItem(R.id.action_layout_type); - menu.removeItem(R.id.action_sort_order); - ToolbarContentTintHelper.handleOnCreateOptionsMenu( - requireContext(), toolbar, menu, getToolbarBackgroundColor(toolbar)); - } + private void setUpTitle() { + toolbar.setNavigationOnClickListener( + v -> Navigation.findNavController(v).navigate(R.id.searchFragment, null, getNavOptions())); + int color = ThemeStore.Companion.accentColor(requireContext()); + String hexColor = String.format("#%06X", 0xFFFFFF & color); + Spanned appName = + HtmlCompat.fromHtml( + "Retro Music", + HtmlCompat.FROM_HTML_MODE_COMPACT); + appNameText.setText(appName); + } - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - switch (item.getItemId()) { - case R.id.action_go_to_start_directory: - setCrumb( - new BreadCrumbLayout.Crumb( - tryGetCanonicalFile(PreferenceUtil.INSTANCE.getStartDirectory())), - true); - return true; - case R.id.action_scan: + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + setHasOptionsMenu(true); + if (savedInstanceState == null) { + setCrumb( + new BreadCrumbLayout.Crumb( + FileUtil.safeGetCanonicalFile(PreferenceUtil.INSTANCE.getStartDirectory())), + true); + } else { + breadCrumbs.restoreFromStateWrapper(savedInstanceState.getParcelable(CRUMBS)); + LoaderManager.getInstance(this).initLoader(LOADER_ID, null, this); + } + } + + @Override + public void onPause() { + super.onPause(); + saveScrollPosition(); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + if (breadCrumbs != null) { + outState.putParcelable(CRUMBS, breadCrumbs.getStateWrapper()); + } + } + + @Override + public boolean handleBackPress() { + if (cab != null && cab.isActive()) { + cab.finish(); + return true; + } + if (breadCrumbs != null && breadCrumbs.popHistory()) { + setCrumb(breadCrumbs.lastHistory(), false); + return true; + } + return false; + } + + @NonNull + @Override + public Loader> onCreateLoader(int id, Bundle args) { + return new AsyncFileLoader(this); + } + + @Override + public void onCrumbSelection(BreadCrumbLayout.Crumb crumb, int index) { + setCrumb(crumb, true); + } + + @Override + public void onFileMenuClicked(final File file, @NotNull View view) { + PopupMenu popupMenu = new PopupMenu(getActivity(), view); + if (file.isDirectory()) { + popupMenu.inflate(R.menu.menu_item_directory); + popupMenu.setOnMenuItemClickListener( + item -> { + final int itemId = item.getItemId(); + switch (itemId) { + case R.id.action_play_next: + case R.id.action_add_to_current_playing: + case R.id.action_add_to_playlist: + case R.id.action_delete_from_device: + new ListSongsAsyncTask( + getActivity(), + null, + (songs, extra) -> { + if (!songs.isEmpty()) { + SongsMenuHelper.INSTANCE.handleMenuClick( + requireActivity(), songs, itemId); + } + }) + .execute( + new ListSongsAsyncTask.LoadingInfo( + toList(file), AUDIO_FILE_FILTER, getFileComparator())); + return true; + case R.id.action_set_as_start_directory: + PreferenceUtil.INSTANCE.setStartDirectory(file); + Toast.makeText( + getActivity(), + String.format(getString(R.string.new_start_directory), file.getPath()), + Toast.LENGTH_SHORT) + .show(); + return true; + case R.id.action_scan: + new ListPathsAsyncTask(getActivity(), this::scanPaths) + .execute(new ListPathsAsyncTask.LoadingInfo(file, AUDIO_FILE_FILTER)); + return true; + } + return false; + }); + } else { + popupMenu.inflate(R.menu.menu_item_file); + popupMenu.setOnMenuItemClickListener( + item -> { + final int itemId = item.getItemId(); + switch (itemId) { + case R.id.action_play_next: + case R.id.action_add_to_current_playing: + case R.id.action_add_to_playlist: + case R.id.action_go_to_album: + case R.id.action_go_to_artist: + case R.id.action_share: + case R.id.action_tag_editor: + case R.id.action_details: + case R.id.action_set_as_ringtone: + case R.id.action_delete_from_device: + new ListSongsAsyncTask( + getActivity(), + null, + (songs, extra) -> + SongMenuHelper.INSTANCE.handleMenuClick( + requireActivity(), songs.get(0), itemId)) + .execute( + new ListSongsAsyncTask.LoadingInfo( + toList(file), AUDIO_FILE_FILTER, getFileComparator())); + return true; + case R.id.action_scan: + new ListPathsAsyncTask(getActivity(), this::scanPaths) + .execute(new ListPathsAsyncTask.LoadingInfo(file, AUDIO_FILE_FILTER)); + return true; + } + return false; + }); + } + popupMenu.show(); + } + + @Override + public void onFileSelected(@NotNull File file) { + file = tryGetCanonicalFile(file); // important as we compare the path value later + if (file.isDirectory()) { + setCrumb(new BreadCrumbLayout.Crumb(file), true); + } else { + FileFilter fileFilter = + pathname -> !pathname.isDirectory() && AUDIO_FILE_FILTER.accept(pathname); + new ListSongsAsyncTask( + getActivity(), + file, + (songs, extra) -> { + File file1 = (File) extra; + int startIndex = -1; + for (int i = 0; i < songs.size(); i++) { + if (file1 + .getPath() + .equals(songs.get(i).getData())) { // path is already canonical here + startIndex = i; + break; + } + } + if (startIndex > -1) { + MusicPlayerRemote.openQueue(songs, startIndex, true); + } else { + final File finalFile = file1; + Snackbar.make( + coordinatorLayout, + Html.fromHtml( + String.format( + getString(R.string.not_listed_in_media_store), file1.getName())), + Snackbar.LENGTH_LONG) + .setAction( + R.string.action_scan, + v -> + new ListPathsAsyncTask(requireActivity(), this::scanPaths) + .execute( + new ListPathsAsyncTask.LoadingInfo( + finalFile, AUDIO_FILE_FILTER))) + .setActionTextColor(ThemeStore.Companion.accentColor(requireActivity())) + .show(); + } + }) + .execute( + new ListSongsAsyncTask.LoadingInfo( + toList(file.getParentFile()), fileFilter, getFileComparator())); + } + } + + @Override + public void onLoadFinished(@NonNull Loader> loader, List data) { + updateAdapter(data); + } + + @Override + public void onLoaderReset(@NonNull Loader> loader) { + updateAdapter(new LinkedList()); + } + + @Override + public void onMultipleItemAction(MenuItem item, @NotNull ArrayList files) { + final int itemId = item.getItemId(); + new ListSongsAsyncTask( + getActivity(), + null, + (songs, extra) -> + SongsMenuHelper.INSTANCE.handleMenuClick(requireActivity(), songs, itemId)) + .execute(new ListSongsAsyncTask.LoadingInfo(files, AUDIO_FILE_FILTER, getFileComparator())); + } + + @Override + public void onPrepareOptionsMenu(@NonNull Menu menu) { + super.onPrepareOptionsMenu(menu); + ToolbarContentTintHelper.handleOnPrepareOptionsMenu(requireActivity(), toolbar); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + menu.add(0, R.id.action_scan, 0, R.string.scan_media) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + menu.add(0, R.id.action_go_to_start_directory, 1, R.string.action_go_to_start_directory) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + menu.removeItem(R.id.action_grid_size); + menu.removeItem(R.id.action_layout_type); + menu.removeItem(R.id.action_sort_order); + ToolbarContentTintHelper.handleOnCreateOptionsMenu( + requireContext(), toolbar, menu, getToolbarBackgroundColor(toolbar)); + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.action_go_to_start_directory: + setCrumb( + new BreadCrumbLayout.Crumb( + tryGetCanonicalFile(PreferenceUtil.INSTANCE.getStartDirectory())), + true); + return true; + case R.id.action_scan: + BreadCrumbLayout.Crumb crumb = getActiveCrumb(); + if (crumb != null) { + //noinspection Convert2MethodRef + new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) + .execute(new ListPathsAsyncTask.LoadingInfo(crumb.getFile(), AUDIO_FILE_FILTER)); + } + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onQueueChanged() { + super.onQueueChanged(); + checkForPadding(); + } + + @Override + public void onServiceConnected() { + super.onServiceConnected(); + checkForPadding(); + } + + @NonNull + @Override + public MaterialCab openCab(int menuRes, @NotNull MaterialCab.Callback callback) { + if (cab != null && cab.isActive()) { + cab.finish(); + } + cab = + new MaterialCab(getMainActivity(), R.id.cab_stub) + .setMenu(menuRes) + .setCloseDrawableRes(R.drawable.ic_close) + .setBackgroundColor( + RetroColorUtil.shiftBackgroundColorForLightText( + ATHUtil.INSTANCE.resolveColor(requireContext(), R.attr.colorSurface))) + .start(callback); + return cab; + } + + private void checkForPadding() { + final int count = adapter.getItemCount(); + final MarginLayoutParams params = (MarginLayoutParams) coordinatorLayout.getLayoutParams(); + params.bottomMargin = + count > 0 && !MusicPlayerRemote.getPlayingQueue().isEmpty() + ? DensityUtil.dip2px(requireContext(), 104f) + : DensityUtil.dip2px(requireContext(), 54f); + } + + private void checkIsEmpty() { + emojiText.setText(getEmojiByUnicode(0x1F631)); + if (empty != null) { + empty.setVisibility( + adapter == null || adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE); + } + } + + @Nullable + private BreadCrumbLayout.Crumb getActiveCrumb() { + return breadCrumbs != null && breadCrumbs.size() > 0 + ? breadCrumbs.getCrumb(breadCrumbs.getActiveIndex()) + : null; + } + + private String getEmojiByUnicode(int unicode) { + return new String(Character.toChars(unicode)); + } + + private Comparator getFileComparator() { + return fileComparator; + } + + private void initViews(View view) { + coordinatorLayout = view.findViewById(R.id.coordinatorLayout); + recyclerView = view.findViewById(R.id.recyclerView); + breadCrumbs = view.findViewById(R.id.breadCrumbs); + empty = view.findViewById(android.R.id.empty); + emojiText = view.findViewById(R.id.emptyEmoji); + toolbar = view.findViewById(R.id.toolbar); + appNameText = view.findViewById(R.id.appNameText); + } + + private void saveScrollPosition() { BreadCrumbLayout.Crumb crumb = getActiveCrumb(); if (crumb != null) { - //noinspection Convert2MethodRef - new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) - .execute(new ListPathsAsyncTask.LoadingInfo(crumb.getFile(), AUDIO_FILE_FILTER)); + crumb.setScrollPosition( + ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition()); } - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onQueueChanged() { - super.onQueueChanged(); - checkForPadding(); - } - - @Override - public void onServiceConnected() { - super.onServiceConnected(); - checkForPadding(); - } - - @NonNull - @Override - public MaterialCab openCab(int menuRes, @NotNull MaterialCab.Callback callback) { - if (cab != null && cab.isActive()) { - cab.finish(); - } - cab = - new MaterialCab(getMainActivity(), R.id.cab_stub) - .setMenu(menuRes) - .setCloseDrawableRes(R.drawable.ic_close) - .setBackgroundColor( - RetroColorUtil.shiftBackgroundColorForLightText( - ATHUtil.INSTANCE.resolveColor(requireContext(), R.attr.colorSurface))) - .start(callback); - return cab; - } - - private void checkForPadding() { - final int count = adapter.getItemCount(); - final MarginLayoutParams params = (MarginLayoutParams) coordinatorLayout.getLayoutParams(); - params.bottomMargin = - count > 0 && !MusicPlayerRemote.getPlayingQueue().isEmpty() - ? DensityUtil.dip2px(requireContext(), 104f) - : DensityUtil.dip2px(requireContext(), 54f); - } - - private void checkIsEmpty() { - emojiText.setText(getEmojiByUnicode(0x1F631)); - if (empty != null) { - empty.setVisibility( - adapter == null || adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE); - } - } - - @Nullable - private BreadCrumbLayout.Crumb getActiveCrumb() { - return breadCrumbs != null && breadCrumbs.size() > 0 - ? breadCrumbs.getCrumb(breadCrumbs.getActiveIndex()) - : null; - } - - private String getEmojiByUnicode(int unicode) { - return new String(Character.toChars(unicode)); - } - - private Comparator getFileComparator() { - return fileComparator; - } - - private void initViews(View view) { - coordinatorLayout = view.findViewById(R.id.coordinatorLayout); - recyclerView = view.findViewById(R.id.recyclerView); - breadCrumbs = view.findViewById(R.id.breadCrumbs); - empty = view.findViewById(android.R.id.empty); - emojiText = view.findViewById(R.id.emptyEmoji); - toolbar = view.findViewById(R.id.toolbar); - appNameText = view.findViewById(R.id.appNameText); - } - - private void saveScrollPosition() { - BreadCrumbLayout.Crumb crumb = getActiveCrumb(); - if (crumb != null) { - crumb.setScrollPosition( - ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition()); - } - } - - private void scanPaths(@Nullable String[] toBeScanned) { - if (getActivity() == null) { - return; - } - if (toBeScanned == null || toBeScanned.length < 1) { - Toast.makeText(getActivity(), R.string.nothing_to_scan, Toast.LENGTH_SHORT).show(); - } else { - MediaScannerConnection.scanFile( - getActivity().getApplicationContext(), - toBeScanned, - null, - new UpdateToastMediaScannerCompletionListener(getActivity(), toBeScanned)); - } - } - - private void setCrumb(BreadCrumbLayout.Crumb crumb, boolean addToHistory) { - if (crumb == null) { - return; - } - saveScrollPosition(); - breadCrumbs.setActiveOrAdd(crumb, false); - if (addToHistory) { - breadCrumbs.addHistory(crumb); - } - LoaderManager.getInstance(this).restartLoader(LOADER_ID, null, this); - } - - private void setUpAdapter() { - adapter = - new SongFileAdapter(getMainActivity(), new LinkedList<>(), R.layout.item_list, this, this); - adapter.registerAdapterDataObserver( - new RecyclerView.AdapterDataObserver() { - @Override - public void onChanged() { - super.onChanged(); - checkIsEmpty(); - checkForPadding(); - } - }); - recyclerView.setAdapter(adapter); - checkIsEmpty(); - } - - private void setUpAppbarColor() { - breadCrumbs.setActivatedContentColor( - ATHUtil.INSTANCE.resolveColor(requireContext(), android.R.attr.textColorPrimary)); - breadCrumbs.setDeactivatedContentColor( - ATHUtil.INSTANCE.resolveColor(requireContext(), android.R.attr.textColorSecondary)); - } - - private void setUpBreadCrumbs() { - breadCrumbs.setCallback(this); - } - - private void setUpRecyclerView() { - recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); - FastScroller fastScroller = ThemedFastScroller.INSTANCE.create(recyclerView); - recyclerView.setOnApplyWindowInsetsListener( - new ScrollingViewOnApplyWindowInsetsListener(recyclerView, fastScroller)); - } - - private ArrayList toList(File file) { - ArrayList files = new ArrayList<>(1); - files.add(file); - return files; - } - - private void updateAdapter(@NonNull List files) { - adapter.swapDataSet(files); - BreadCrumbLayout.Crumb crumb = getActiveCrumb(); - if (crumb != null && recyclerView != null) { - ((LinearLayoutManager) recyclerView.getLayoutManager()) - .scrollToPositionWithOffset(crumb.getScrollPosition(), 0); - } - } - - public static class ListPathsAsyncTask - extends ListingFilesDialogAsyncTask { - - private WeakReference onPathsListedCallbackWeakReference; - - public ListPathsAsyncTask(Context context, OnPathsListedCallback callback) { - super(context); - onPathsListedCallbackWeakReference = new WeakReference<>(callback); } - @Override - protected String[] doInBackground(LoadingInfo... params) { - try { - if (isCancelled() || checkCallbackReference() == null) { - return null; + private void scanPaths(@Nullable String[] toBeScanned) { + if (getActivity() == null) { + return; } - - LoadingInfo info = params[0]; - - final String[] paths; - - if (info.file.isDirectory()) { - List files = FileUtil.listFilesDeep(info.file, info.fileFilter); - - if (isCancelled() || checkCallbackReference() == null) { - return null; - } - - paths = new String[files.size()]; - for (int i = 0; i < files.size(); i++) { - File f = files.get(i); - paths[i] = FileUtil.safeGetCanonicalPath(f); - - if (isCancelled() || checkCallbackReference() == null) { - return null; - } - } + if (toBeScanned == null || toBeScanned.length < 1) { + Toast.makeText(getActivity(), R.string.nothing_to_scan, Toast.LENGTH_SHORT).show(); } else { - paths = new String[1]; - paths[0] = info.file.getPath(); + MediaScannerConnection.scanFile( + getActivity().getApplicationContext(), + toBeScanned, + null, + new UpdateToastMediaScannerCompletionListener(getActivity(), toBeScanned)); } - - return paths; - } catch (Exception e) { - e.printStackTrace(); - cancel(false); - return null; - } } - @Override - protected void onPostExecute(String[] paths) { - super.onPostExecute(paths); - OnPathsListedCallback callback = checkCallbackReference(); - if (callback != null && paths != null) { - callback.onPathsListed(paths); - } - } - - @Override - protected void onPreExecute() { - super.onPreExecute(); - checkCallbackReference(); - } - - private OnPathsListedCallback checkCallbackReference() { - OnPathsListedCallback callback = onPathsListedCallbackWeakReference.get(); - if (callback == null) { - cancel(false); - } - return callback; - } - - public interface OnPathsListedCallback { - - void onPathsListed(@NonNull String[] paths); - } - - public static class LoadingInfo { - - public final File file; - - final FileFilter fileFilter; - - public LoadingInfo(File file, FileFilter fileFilter) { - this.file = file; - this.fileFilter = fileFilter; - } - } - } - - private static class AsyncFileLoader extends WrappedAsyncTaskLoader> { - - private WeakReference fragmentWeakReference; - - AsyncFileLoader(FoldersFragment foldersFragment) { - super(foldersFragment.requireActivity()); - fragmentWeakReference = new WeakReference<>(foldersFragment); - } - - @Override - public List loadInBackground() { - FoldersFragment foldersFragment = fragmentWeakReference.get(); - File directory = null; - if (foldersFragment != null) { - BreadCrumbLayout.Crumb crumb = foldersFragment.getActiveCrumb(); - if (crumb != null) { - directory = crumb.getFile(); + private void setCrumb(BreadCrumbLayout.Crumb crumb, boolean addToHistory) { + if (crumb == null) { + return; } - } - if (directory != null) { - List files = FileUtil.listFiles(directory, AUDIO_FILE_FILTER); - Collections.sort(files, foldersFragment.getFileComparator()); + saveScrollPosition(); + breadCrumbs.setActiveOrAdd(crumb, false); + if (addToHistory) { + breadCrumbs.addHistory(crumb); + } + LoaderManager.getInstance(this).restartLoader(LOADER_ID, null, this); + } + + private void setUpAdapter() { + adapter = + new SongFileAdapter(getMainActivity(), new LinkedList<>(), R.layout.item_list, this, this); + adapter.registerAdapterDataObserver( + new RecyclerView.AdapterDataObserver() { + @Override + public void onChanged() { + super.onChanged(); + checkIsEmpty(); + checkForPadding(); + } + }); + recyclerView.setAdapter(adapter); + checkIsEmpty(); + } + + private void setUpAppbarColor() { + breadCrumbs.setActivatedContentColor( + ATHUtil.INSTANCE.resolveColor(requireContext(), android.R.attr.textColorPrimary)); + breadCrumbs.setDeactivatedContentColor( + ATHUtil.INSTANCE.resolveColor(requireContext(), android.R.attr.textColorSecondary)); + } + + private void setUpBreadCrumbs() { + breadCrumbs.setCallback(this); + } + + private void setUpRecyclerView() { + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + FastScroller fastScroller = ThemedFastScroller.INSTANCE.create(recyclerView); + recyclerView.setOnApplyWindowInsetsListener( + new ScrollingViewOnApplyWindowInsetsListener(recyclerView, fastScroller)); + } + + private ArrayList toList(File file) { + ArrayList files = new ArrayList<>(1); + files.add(file); return files; - } else { - return new LinkedList<>(); - } - } - } - - private static class ListSongsAsyncTask - extends ListingFilesDialogAsyncTask> { - - private final Object extra; - private WeakReference callbackWeakReference; - private WeakReference contextWeakReference; - - ListSongsAsyncTask(Context context, Object extra, OnSongsListedCallback callback) { - super(context); - this.extra = extra; - contextWeakReference = new WeakReference<>(context); - callbackWeakReference = new WeakReference<>(callback); } - @Override - protected List doInBackground(LoadingInfo... params) { - try { - LoadingInfo info = params[0]; - List files = FileUtil.listFilesDeep(info.files, info.fileFilter); + private void updateAdapter(@NonNull List files) { + adapter.swapDataSet(files); + BreadCrumbLayout.Crumb crumb = getActiveCrumb(); + if (crumb != null && recyclerView != null) { + ((LinearLayoutManager) recyclerView.getLayoutManager()) + .scrollToPositionWithOffset(crumb.getScrollPosition(), 0); + } + } - if (isCancelled() || checkContextReference() == null || checkCallbackReference() == null) { - return null; + public static class ListPathsAsyncTask + extends ListingFilesDialogAsyncTask { + + private WeakReference onPathsListedCallbackWeakReference; + + public ListPathsAsyncTask(Context context, OnPathsListedCallback callback) { + super(context); + onPathsListedCallbackWeakReference = new WeakReference<>(callback); } - Collections.sort(files, info.fileComparator); + @Override + protected String[] doInBackground(LoadingInfo... params) { + try { + if (isCancelled() || checkCallbackReference() == null) { + return null; + } - Context context = checkContextReference(); - if (isCancelled() || context == null || checkCallbackReference() == null) { - return null; + LoadingInfo info = params[0]; + + final String[] paths; + + if (info.file.isDirectory()) { + List files = FileUtil.listFilesDeep(info.file, info.fileFilter); + + if (isCancelled() || checkCallbackReference() == null) { + return null; + } + + paths = new String[files.size()]; + for (int i = 0; i < files.size(); i++) { + File f = files.get(i); + paths[i] = FileUtil.safeGetCanonicalPath(f); + + if (isCancelled() || checkCallbackReference() == null) { + return null; + } + } + } else { + paths = new String[1]; + paths[0] = info.file.getPath(); + } + + return paths; + } catch (Exception e) { + e.printStackTrace(); + cancel(false); + return null; + } } - return FileUtil.matchFilesWithMediaStore(context, files); - } catch (Exception e) { - e.printStackTrace(); - cancel(false); - return null; - } + @Override + protected void onPostExecute(String[] paths) { + super.onPostExecute(paths); + OnPathsListedCallback callback = checkCallbackReference(); + if (callback != null && paths != null) { + callback.onPathsListed(paths); + } + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + checkCallbackReference(); + } + + private OnPathsListedCallback checkCallbackReference() { + OnPathsListedCallback callback = onPathsListedCallbackWeakReference.get(); + if (callback == null) { + cancel(false); + } + return callback; + } + + public interface OnPathsListedCallback { + + void onPathsListed(@NonNull String[] paths); + } + + public static class LoadingInfo { + + public final File file; + + final FileFilter fileFilter; + + public LoadingInfo(File file, FileFilter fileFilter) { + this.file = file; + this.fileFilter = fileFilter; + } + } } - @Override - protected void onPostExecute(List songs) { - super.onPostExecute(songs); - OnSongsListedCallback callback = checkCallbackReference(); - if (songs != null && callback != null) { - callback.onSongsListed(songs, extra); - } + private static class AsyncFileLoader extends WrappedAsyncTaskLoader> { + + private WeakReference fragmentWeakReference; + + AsyncFileLoader(FoldersFragment foldersFragment) { + super(foldersFragment.requireActivity()); + fragmentWeakReference = new WeakReference<>(foldersFragment); + } + + @Override + public List loadInBackground() { + FoldersFragment foldersFragment = fragmentWeakReference.get(); + File directory = null; + if (foldersFragment != null) { + BreadCrumbLayout.Crumb crumb = foldersFragment.getActiveCrumb(); + if (crumb != null) { + directory = crumb.getFile(); + } + } + if (directory != null) { + List files = FileUtil.listFiles(directory, AUDIO_FILE_FILTER); + Collections.sort(files, foldersFragment.getFileComparator()); + return files; + } else { + return new LinkedList<>(); + } + } } - @Override - protected void onPreExecute() { - super.onPreExecute(); - checkCallbackReference(); - checkContextReference(); + private static class ListSongsAsyncTask + extends ListingFilesDialogAsyncTask> { + + private final Object extra; + private WeakReference callbackWeakReference; + private WeakReference contextWeakReference; + + ListSongsAsyncTask(Context context, Object extra, OnSongsListedCallback callback) { + super(context); + this.extra = extra; + contextWeakReference = new WeakReference<>(context); + callbackWeakReference = new WeakReference<>(callback); + } + + @Override + protected List doInBackground(LoadingInfo... params) { + try { + LoadingInfo info = params[0]; + List files = FileUtil.listFilesDeep(info.files, info.fileFilter); + + if (isCancelled() || checkContextReference() == null || checkCallbackReference() == null) { + return null; + } + + Collections.sort(files, info.fileComparator); + + Context context = checkContextReference(); + if (isCancelled() || context == null || checkCallbackReference() == null) { + return null; + } + + return FileUtil.matchFilesWithMediaStore(context, files); + } catch (Exception e) { + e.printStackTrace(); + cancel(false); + return null; + } + } + + @Override + protected void onPostExecute(List songs) { + super.onPostExecute(songs); + OnSongsListedCallback callback = checkCallbackReference(); + if (songs != null && callback != null) { + callback.onSongsListed(songs, extra); + } + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + checkCallbackReference(); + checkContextReference(); + } + + private OnSongsListedCallback checkCallbackReference() { + OnSongsListedCallback callback = callbackWeakReference.get(); + if (callback == null) { + cancel(false); + } + return callback; + } + + private Context checkContextReference() { + Context context = contextWeakReference.get(); + if (context == null) { + cancel(false); + } + return context; + } + + public interface OnSongsListedCallback { + + void onSongsListed(@NonNull List songs, Object extra); + } + + static class LoadingInfo { + + final Comparator fileComparator; + + final FileFilter fileFilter; + + final List files; + + LoadingInfo( + @NonNull List files, + @NonNull FileFilter fileFilter, + @NonNull Comparator fileComparator) { + this.fileComparator = fileComparator; + this.fileFilter = fileFilter; + this.files = files; + } + } } - private OnSongsListedCallback checkCallbackReference() { - OnSongsListedCallback callback = callbackWeakReference.get(); - if (callback == null) { - cancel(false); - } - return callback; + private abstract static class ListingFilesDialogAsyncTask + extends DialogAsyncTask { + + ListingFilesDialogAsyncTask(Context context) { + super(context); + } + + public ListingFilesDialogAsyncTask(Context context, int showDelay) { + super(context, showDelay); + } + + @Override + protected Dialog createDialog(@NonNull Context context) { + return new MaterialAlertDialogBuilder(context) + .setTitle(R.string.listing_files) + .setCancelable(false) + .setView(R.layout.loading) + .setOnCancelListener(dialog -> cancel(false)) + .setOnDismissListener(dialog -> cancel(false)) + .create(); + } } - - private Context checkContextReference() { - Context context = contextWeakReference.get(); - if (context == null) { - cancel(false); - } - return context; - } - - public interface OnSongsListedCallback { - - void onSongsListed(@NonNull List songs, Object extra); - } - - static class LoadingInfo { - - final Comparator fileComparator; - - final FileFilter fileFilter; - - final List files; - - LoadingInfo( - @NonNull List files, - @NonNull FileFilter fileFilter, - @NonNull Comparator fileComparator) { - this.fileComparator = fileComparator; - this.fileFilter = fileFilter; - this.files = files; - } - } - } - - private abstract static class ListingFilesDialogAsyncTask - extends DialogAsyncTask { - - ListingFilesDialogAsyncTask(Context context) { - super(context); - } - - public ListingFilesDialogAsyncTask(Context context, int showDelay) { - super(context, showDelay); - } - - @Override - protected Dialog createDialog(@NonNull Context context) { - return new MaterialAlertDialogBuilder(context) - .setTitle(R.string.listing_files) - .setCancelable(false) - .setView(R.layout.loading) - .setOnCancelListener(dialog -> cancel(false)) - .setOnDismissListener(dialog -> cancel(false)) - .create(); - } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt index 3868665c..520d0836 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt @@ -52,6 +52,7 @@ class HomeFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + println("AbsMainActivityFragment") libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITH) mainActivity.setSupportActionBar(toolbar) mainActivity.supportActionBar?.title = null diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt index dc3e874c..35d4f292 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt @@ -5,10 +5,12 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import androidx.core.view.ViewCompat import androidx.core.view.isVisible import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.song.PlaylistSongAdapter import code.name.monkey.retromusic.db.PlaylistWithSongs @@ -18,6 +20,7 @@ import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.state.NowPlayingPanelState +import com.google.android.material.transition.MaterialContainerTransform import kotlinx.android.synthetic.main.fragment_playlist_detail.* import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf @@ -31,18 +34,29 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli private lateinit var playlist: PlaylistWithSongs private lateinit var playlistSongAdapter: PlaylistSongAdapter - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) + private fun setUpTransitions() { + val transform = MaterialContainerTransform() + transform.setAllContainerColors(ATHUtil.resolveColor(requireContext(), R.attr.colorSurface)) + sharedElementEnterTransition = transform + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setUpTransitions() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) setHasOptionsMenu(true) libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT) mainActivity.addMusicServiceEventListener(viewModel) mainActivity.setSupportActionBar(toolbar) + ViewCompat.setTransitionName(container, "playlist") playlist = arguments.extraPlaylist toolbar.title = playlist.playlistEntity.playlistName setUpRecyclerView() - viewModel.getSongs().observe(viewLifecycleOwner, { songs(it.toSongs()) }) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt index bb97538d..3f6f874e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt @@ -33,26 +33,7 @@ class PlaylistDetailsViewModel( fun getSongs(): LiveData> = realRepository.playlistSongs(playlist.playlistEntity.playListId) - override fun onMediaStoreChanged() { - /*if (playlist !is AbsCustomPlaylist) { - // Playlist deleted - if (!PlaylistsUtil.doesPlaylistExist(App.getContext(), playlist.id)) { - //TODO Finish the page - return - } - // Playlist renamed - val playlistName = - PlaylistsUtil.getNameForPlaylist(App.getContext(), playlist.id.toLong()) - if (playlistName != playlist.name) { - viewModelScope.launch { - playlist = realRepository.playlist(playlist.id) - _playlist.postValue(playlist) - } - } - } - loadPlaylistSongs(playlist)*/ - } - + override fun onMediaStoreChanged() {} override fun onServiceConnected() {} override fun onServiceDisconnected() {} override fun onQueueChanged() {} diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt index 27592935..cc5ef0fc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt @@ -18,19 +18,31 @@ import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem +import android.view.SubMenu import android.view.View -import androidx.lifecycle.Observer -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.core.os.bundleOf +import androidx.core.view.MenuCompat +import androidx.navigation.fragment.FragmentNavigatorExtras +import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.GridLayoutManager import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper +import code.name.monkey.retromusic.EXTRA_PLAYLIST import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.playlist.PlaylistAdapter -import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewFragment +import code.name.monkey.retromusic.db.PlaylistWithSongs +import code.name.monkey.retromusic.fragments.ReloadType +import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment +import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder +import code.name.monkey.retromusic.interfaces.IPlaylistClickListener +import code.name.monkey.retromusic.util.PreferenceUtil import kotlinx.android.synthetic.main.fragment_library.* -class PlaylistsFragment : AbsRecyclerViewFragment() { +class PlaylistsFragment : + AbsRecyclerViewCustomGridSizeFragment(), + IPlaylistClickListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - libraryViewModel.getPlaylists().observe(viewLifecycleOwner, Observer { + libraryViewModel.getPlaylists().observe(viewLifecycleOwner, { if (it.isNotEmpty()) adapter?.swapDataSet(it) else @@ -41,8 +53,8 @@ class PlaylistsFragment : AbsRecyclerViewFragment PlaylistSortOrder.PLAYLIST_A_Z + R.id.action_song_sort_order_desc -> PlaylistSortOrder.PLAYLIST_Z_A + R.id.action_playlist_sort_order -> PlaylistSortOrder.PLAYLIST_SONG_COUNT + R.id.action_playlist_sort_order_desc -> PlaylistSortOrder.PLAYLIST_SONG_COUNT_DESC + else -> PreferenceUtil.playlistSortOrder + } + if (sortOrder != PreferenceUtil.playlistSortOrder) { + item.isChecked = true + setAndSaveSortOrder(sortOrder) + return true + } + return false + } + + private fun createId(menu: SubMenu, id: Int, title: Int, checked: Boolean) { + menu.add(0, id, 0, title).isChecked = checked + } + + + override fun setGridSize(gridSize: Int) { + TODO("Not yet implemented") + } + + override fun setSortOrder(sortOrder: String) { + libraryViewModel.forceReload(ReloadType.Playlists) + } + + override fun loadSortOrder(): String { + return PreferenceUtil.playlistSortOrder + } + + override fun saveSortOrder(sortOrder: String) { + PreferenceUtil.playlistSortOrder = sortOrder + } + + override fun loadGridSize(): Int { + return 1 + } + + override fun saveGridSize(gridColumns: Int) { + //Add grid save + } + + override fun loadGridSizeLand(): Int { + return 2 + } + + override fun saveGridSizeLand(gridColumns: Int) { + //Add land grid save + } + + override fun loadLayoutRes(): Int { + return R.layout.item_list + } + + override fun saveLayoutRes(layoutRes: Int) { + //Save layout + } + + override fun onPlaylistClick(playlistWithSongs: PlaylistWithSongs, view: View) { + findNavController().navigate( + R.id.playlistDetailsFragment, + bundleOf(EXTRA_PLAYLIST to playlistWithSongs), + null, + FragmentNavigatorExtras(view to "playlist") + ) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt b/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt index b02ded2a..22f92a09 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt @@ -184,4 +184,25 @@ class SortOrder { const val ALBUM_Z_A = "$GENRE_A_Z DESC" } } + + /** + * Playlist sort order entries. + */ + interface PlaylistSortOrder { + + companion object { + + /* Playlist sort order A-Z */ + const val PLAYLIST_A_Z = MediaStore.Audio.Playlists.DEFAULT_SORT_ORDER + + /* Playlist sort order Z-A */ + const val PLAYLIST_Z_A = "$PLAYLIST_A_Z DESC" + + /* Playlist sort order number of songs */ + const val PLAYLIST_SONG_COUNT = "playlist_song_count" + + /* Playlist sort order number of songs */ + const val PLAYLIST_SONG_COUNT_DESC = "$PLAYLIST_SONG_COUNT DESC" + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/IPlaylistClickListener.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/IPlaylistClickListener.kt new file mode 100644 index 00000000..3b0eb141 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/interfaces/IPlaylistClickListener.kt @@ -0,0 +1,8 @@ +package code.name.monkey.retromusic.interfaces + +import android.view.View +import code.name.monkey.retromusic.db.PlaylistWithSongs + +interface IPlaylistClickListener { + fun onPlaylistClick(playlistWithSongs: PlaylistWithSongs, view: View) +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt index 94819043..ca7c822a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt @@ -95,13 +95,17 @@ class RealGenreRepository( } private fun makeGenreSongCursor(genreId: Long): Cursor? { - return contentResolver.query( - Genres.Members.getContentUri("external", genreId), - baseProjection, - IS_MUSIC, - null, - PreferenceUtil.songSortOrder - ) + return try { + contentResolver.query( + Genres.Members.getContentUri("external", genreId), + baseProjection, + IS_MUSIC, + null, + PreferenceUtil.songSortOrder + ) + } catch (e: SecurityException) { + return null + } } private fun getGenresFromCursor(cursor: Cursor?): ArrayList { @@ -143,17 +147,18 @@ class RealGenreRepository( return genres } - private fun makeGenreCursor(): Cursor? { val projection = arrayOf(Genres._ID, Genres.NAME) - return contentResolver.query( - Genres.EXTERNAL_CONTENT_URI, - projection, - null, - null, - PreferenceUtil.genreSortOrder - ) + return try { + contentResolver.query( + Genres.EXTERNAL_CONTENT_URI, + projection, + null, + null, + PreferenceUtil.genreSortOrder + ) + } catch (e: SecurityException) { + return null + } } - - } diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt index ca8a9833..e57c5c57 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt @@ -2,8 +2,24 @@ package code.name.monkey.retromusic.repository import androidx.annotation.WorkerThread import androidx.lifecycle.LiveData -import code.name.monkey.retromusic.db.* +import code.name.monkey.retromusic.db.BlackListStoreDao +import code.name.monkey.retromusic.db.BlackListStoreEntity +import code.name.monkey.retromusic.db.HistoryDao +import code.name.monkey.retromusic.db.HistoryEntity +import code.name.monkey.retromusic.db.LyricsDao +import code.name.monkey.retromusic.db.PlayCountDao +import code.name.monkey.retromusic.db.PlayCountEntity +import code.name.monkey.retromusic.db.PlaylistDao +import code.name.monkey.retromusic.db.PlaylistEntity +import code.name.monkey.retromusic.db.PlaylistWithSongs +import code.name.monkey.retromusic.db.SongEntity +import code.name.monkey.retromusic.db.toHistoryEntity +import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder.Companion.PLAYLIST_A_Z +import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder.Companion.PLAYLIST_SONG_COUNT +import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder.Companion.PLAYLIST_SONG_COUNT_DESC +import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder.Companion.PLAYLIST_Z_A import code.name.monkey.retromusic.model.Song +import code.name.monkey.retromusic.util.PreferenceUtil interface RoomRepository { @@ -61,7 +77,22 @@ class RealRoomRepository( @WorkerThread override suspend fun playlistWithSongs(): List = - playlistDao.playlistsWithSongs() + when (PreferenceUtil.playlistSortOrder) { + PLAYLIST_A_Z -> + playlistDao.playlistsWithSongs().sortedBy { + it.playlistEntity.playlistName + } + PLAYLIST_Z_A -> playlistDao.playlistsWithSongs() + .sortedByDescending { + it.playlistEntity.playlistName + } + PLAYLIST_SONG_COUNT -> playlistDao.playlistsWithSongs().sortedBy { it.songs.size } + PLAYLIST_SONG_COUNT_DESC -> playlistDao.playlistsWithSongs() + .sortedByDescending { it.songs.size } + else -> playlistDao.playlistsWithSongs().sortedBy { + it.playlistEntity.playlistName + } + } @WorkerThread override suspend fun insertSongs(songs: List) { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java index f9abe7d6..b7d39972 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java @@ -14,13 +14,6 @@ package code.name.monkey.retromusic.service; -import static code.name.monkey.retromusic.ConstantsKt.ALBUM_ART_ON_LOCK_SCREEN; -import static code.name.monkey.retromusic.ConstantsKt.BLURRED_ALBUM_ART; -import static code.name.monkey.retromusic.ConstantsKt.CLASSIC_NOTIFICATION; -import static code.name.monkey.retromusic.ConstantsKt.COLORED_NOTIFICATION; -import static code.name.monkey.retromusic.ConstantsKt.GAP_LESS_PLAYBACK; -import static code.name.monkey.retromusic.ConstantsKt.TOGGLE_HEADSET; - import android.app.PendingIntent; import android.app.Service; import android.appwidget.AppWidgetManager; @@ -54,9 +47,21 @@ import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; import android.widget.Toast; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.preference.PreferenceManager; + +import com.bumptech.glide.BitmapRequestBuilder; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.request.target.SimpleTarget; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Random; + import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.activities.LockScreenActivity; import code.name.monkey.retromusic.appwidgets.AppWidgetBig; @@ -79,1368 +84,1359 @@ import code.name.monkey.retromusic.service.playback.Playback; import code.name.monkey.retromusic.util.MusicUtil; import code.name.monkey.retromusic.util.PreferenceUtil; import code.name.monkey.retromusic.util.RetroUtil; -import com.bumptech.glide.BitmapRequestBuilder; -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.animation.GlideAnimation; -import com.bumptech.glide.request.target.SimpleTarget; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Random; -/** @author Karim Abou Zeid (kabouzeid), Andrew Neal */ +import static code.name.monkey.retromusic.ConstantsKt.ALBUM_ART_ON_LOCK_SCREEN; +import static code.name.monkey.retromusic.ConstantsKt.BLURRED_ALBUM_ART; +import static code.name.monkey.retromusic.ConstantsKt.CLASSIC_NOTIFICATION; +import static code.name.monkey.retromusic.ConstantsKt.COLORED_NOTIFICATION; +import static code.name.monkey.retromusic.ConstantsKt.GAP_LESS_PLAYBACK; +import static code.name.monkey.retromusic.ConstantsKt.TOGGLE_HEADSET; + +/** + * @author Karim Abou Zeid (kabouzeid), Andrew Neal + */ public class MusicService extends Service - implements SharedPreferences.OnSharedPreferenceChangeListener, Playback.PlaybackCallbacks { + implements SharedPreferences.OnSharedPreferenceChangeListener, Playback.PlaybackCallbacks { - public static final String TAG = MusicService.class.getSimpleName(); - public static final String RETRO_MUSIC_PACKAGE_NAME = "code.name.monkey.retromusic"; - public static final String MUSIC_PACKAGE_NAME = "com.android.music"; - public static final String ACTION_TOGGLE_PAUSE = RETRO_MUSIC_PACKAGE_NAME + ".togglepause"; - public static final String ACTION_PLAY = RETRO_MUSIC_PACKAGE_NAME + ".play"; - public static final String ACTION_PLAY_PLAYLIST = RETRO_MUSIC_PACKAGE_NAME + ".play.playlist"; - public static final String ACTION_PAUSE = RETRO_MUSIC_PACKAGE_NAME + ".pause"; - public static final String ACTION_STOP = RETRO_MUSIC_PACKAGE_NAME + ".stop"; - public static final String ACTION_SKIP = RETRO_MUSIC_PACKAGE_NAME + ".skip"; - public static final String ACTION_REWIND = RETRO_MUSIC_PACKAGE_NAME + ".rewind"; - public static final String ACTION_QUIT = RETRO_MUSIC_PACKAGE_NAME + ".quitservice"; - public static final String ACTION_PENDING_QUIT = RETRO_MUSIC_PACKAGE_NAME + ".pendingquitservice"; - public static final String INTENT_EXTRA_PLAYLIST = - RETRO_MUSIC_PACKAGE_NAME + "intentextra.playlist"; - public static final String INTENT_EXTRA_SHUFFLE_MODE = - RETRO_MUSIC_PACKAGE_NAME + ".intentextra.shufflemode"; - public static final String APP_WIDGET_UPDATE = RETRO_MUSIC_PACKAGE_NAME + ".appwidgetupdate"; - public static final String EXTRA_APP_WIDGET_NAME = RETRO_MUSIC_PACKAGE_NAME + "app_widget_name"; - // Do not change these three strings as it will break support with other apps (e.g. last.fm - // scrobbling) - public static final String META_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".metachanged"; - public static final String QUEUE_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".queuechanged"; - public static final String PLAY_STATE_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".playstatechanged"; - public static final String FAVORITE_STATE_CHANGED = - RETRO_MUSIC_PACKAGE_NAME + "favoritestatechanged"; - public static final String REPEAT_MODE_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".repeatmodechanged"; - public static final String SHUFFLE_MODE_CHANGED = - RETRO_MUSIC_PACKAGE_NAME + ".shufflemodechanged"; - public static final String MEDIA_STORE_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".mediastorechanged"; - public static final String CYCLE_REPEAT = RETRO_MUSIC_PACKAGE_NAME + ".cyclerepeat"; - public static final String TOGGLE_SHUFFLE = RETRO_MUSIC_PACKAGE_NAME + ".toggleshuffle"; - public static final String TOGGLE_FAVORITE = RETRO_MUSIC_PACKAGE_NAME + ".togglefavorite"; - public static final String SAVED_POSITION = "POSITION"; - public static final String SAVED_POSITION_IN_TRACK = "POSITION_IN_TRACK"; - public static final String SAVED_SHUFFLE_MODE = "SHUFFLE_MODE"; - public static final String SAVED_REPEAT_MODE = "REPEAT_MODE"; - public static final int RELEASE_WAKELOCK = 0; - public static final int TRACK_ENDED = 1; - public static final int TRACK_WENT_TO_NEXT = 2; - public static final int PLAY_SONG = 3; - public static final int PREPARE_NEXT = 4; - public static final int SET_POSITION = 5; - public static final int FOCUS_CHANGE = 6; - public static final int DUCK = 7; - public static final int UNDUCK = 8; - public static final int RESTORE_QUEUES = 9; - public static final int SHUFFLE_MODE_NONE = 0; - public static final int SHUFFLE_MODE_SHUFFLE = 1; - public static final int REPEAT_MODE_NONE = 0; - public static final int REPEAT_MODE_ALL = 1; - public static final int REPEAT_MODE_THIS = 2; - public static final int SAVE_QUEUES = 0; - private static final long MEDIA_SESSION_ACTIONS = - PlaybackStateCompat.ACTION_PLAY - | PlaybackStateCompat.ACTION_PAUSE - | PlaybackStateCompat.ACTION_PLAY_PAUSE - | PlaybackStateCompat.ACTION_SKIP_TO_NEXT - | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS - | PlaybackStateCompat.ACTION_STOP - | PlaybackStateCompat.ACTION_SEEK_TO; - private final IBinder musicBind = new MusicBinder(); - public int nextPosition = -1; + public static final String TAG = MusicService.class.getSimpleName(); + public static final String RETRO_MUSIC_PACKAGE_NAME = "code.name.monkey.retromusic"; + public static final String MUSIC_PACKAGE_NAME = "com.android.music"; + public static final String ACTION_TOGGLE_PAUSE = RETRO_MUSIC_PACKAGE_NAME + ".togglepause"; + public static final String ACTION_PLAY = RETRO_MUSIC_PACKAGE_NAME + ".play"; + public static final String ACTION_PLAY_PLAYLIST = RETRO_MUSIC_PACKAGE_NAME + ".play.playlist"; + public static final String ACTION_PAUSE = RETRO_MUSIC_PACKAGE_NAME + ".pause"; + public static final String ACTION_STOP = RETRO_MUSIC_PACKAGE_NAME + ".stop"; + public static final String ACTION_SKIP = RETRO_MUSIC_PACKAGE_NAME + ".skip"; + public static final String ACTION_REWIND = RETRO_MUSIC_PACKAGE_NAME + ".rewind"; + public static final String ACTION_QUIT = RETRO_MUSIC_PACKAGE_NAME + ".quitservice"; + public static final String ACTION_PENDING_QUIT = RETRO_MUSIC_PACKAGE_NAME + ".pendingquitservice"; + public static final String INTENT_EXTRA_PLAYLIST = + RETRO_MUSIC_PACKAGE_NAME + "intentextra.playlist"; + public static final String INTENT_EXTRA_SHUFFLE_MODE = + RETRO_MUSIC_PACKAGE_NAME + ".intentextra.shufflemode"; + public static final String APP_WIDGET_UPDATE = RETRO_MUSIC_PACKAGE_NAME + ".appwidgetupdate"; + public static final String EXTRA_APP_WIDGET_NAME = RETRO_MUSIC_PACKAGE_NAME + "app_widget_name"; + // Do not change these three strings as it will break support with other apps (e.g. last.fm + // scrobbling) + public static final String META_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".metachanged"; + public static final String QUEUE_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".queuechanged"; + public static final String PLAY_STATE_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".playstatechanged"; + public static final String FAVORITE_STATE_CHANGED = + RETRO_MUSIC_PACKAGE_NAME + "favoritestatechanged"; + public static final String REPEAT_MODE_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".repeatmodechanged"; + public static final String SHUFFLE_MODE_CHANGED = + RETRO_MUSIC_PACKAGE_NAME + ".shufflemodechanged"; + public static final String MEDIA_STORE_CHANGED = RETRO_MUSIC_PACKAGE_NAME + ".mediastorechanged"; + public static final String CYCLE_REPEAT = RETRO_MUSIC_PACKAGE_NAME + ".cyclerepeat"; + public static final String TOGGLE_SHUFFLE = RETRO_MUSIC_PACKAGE_NAME + ".toggleshuffle"; + public static final String TOGGLE_FAVORITE = RETRO_MUSIC_PACKAGE_NAME + ".togglefavorite"; + public static final String SAVED_POSITION = "POSITION"; + public static final String SAVED_POSITION_IN_TRACK = "POSITION_IN_TRACK"; + public static final String SAVED_SHUFFLE_MODE = "SHUFFLE_MODE"; + public static final String SAVED_REPEAT_MODE = "REPEAT_MODE"; + public static final int RELEASE_WAKELOCK = 0; + public static final int TRACK_ENDED = 1; + public static final int TRACK_WENT_TO_NEXT = 2; + public static final int PLAY_SONG = 3; + public static final int PREPARE_NEXT = 4; + public static final int SET_POSITION = 5; + public static final int FOCUS_CHANGE = 6; + public static final int DUCK = 7; + public static final int UNDUCK = 8; + public static final int RESTORE_QUEUES = 9; + public static final int SHUFFLE_MODE_NONE = 0; + public static final int SHUFFLE_MODE_SHUFFLE = 1; + public static final int REPEAT_MODE_NONE = 0; + public static final int REPEAT_MODE_ALL = 1; + public static final int REPEAT_MODE_THIS = 2; + public static final int SAVE_QUEUES = 0; + private static final long MEDIA_SESSION_ACTIONS = + PlaybackStateCompat.ACTION_PLAY + | PlaybackStateCompat.ACTION_PAUSE + | PlaybackStateCompat.ACTION_PLAY_PAUSE + | PlaybackStateCompat.ACTION_SKIP_TO_NEXT + | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS + | PlaybackStateCompat.ACTION_STOP + | PlaybackStateCompat.ACTION_SEEK_TO; + private final IBinder musicBind = new MusicBinder(); + public int nextPosition = -1; - public boolean pendingQuit = false; + public boolean pendingQuit = false; - @Nullable public Playback playback; + @Nullable + public Playback playback; - public int position = -1; + public int position = -1; - private AppWidgetBig appWidgetBig = AppWidgetBig.Companion.getInstance(); + private AppWidgetBig appWidgetBig = AppWidgetBig.Companion.getInstance(); - private AppWidgetCard appWidgetCard = AppWidgetCard.Companion.getInstance(); + private AppWidgetCard appWidgetCard = AppWidgetCard.Companion.getInstance(); - private AppWidgetClassic appWidgetClassic = AppWidgetClassic.Companion.getInstance(); + private AppWidgetClassic appWidgetClassic = AppWidgetClassic.Companion.getInstance(); - private AppWidgetSmall appWidgetSmall = AppWidgetSmall.Companion.getInstance(); + private AppWidgetSmall appWidgetSmall = AppWidgetSmall.Companion.getInstance(); - private AppWidgetText appWidgetText = AppWidgetText.Companion.getInstance(); + private AppWidgetText appWidgetText = AppWidgetText.Companion.getInstance(); - private final BroadcastReceiver widgetIntentReceiver = - new BroadcastReceiver() { - @Override - public void onReceive(final Context context, final Intent intent) { - final String command = intent.getStringExtra(EXTRA_APP_WIDGET_NAME); - final int[] ids = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); - if (command != null) { - switch (command) { - case AppWidgetClassic.NAME: - { - appWidgetClassic.performUpdate(MusicService.this, ids); - break; + private final BroadcastReceiver widgetIntentReceiver = + new BroadcastReceiver() { + @Override + public void onReceive(final Context context, final Intent intent) { + final String command = intent.getStringExtra(EXTRA_APP_WIDGET_NAME); + final int[] ids = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); + if (command != null) { + switch (command) { + case AppWidgetClassic.NAME: { + appWidgetClassic.performUpdate(MusicService.this, ids); + break; + } + case AppWidgetSmall.NAME: { + appWidgetSmall.performUpdate(MusicService.this, ids); + break; + } + case AppWidgetBig.NAME: { + appWidgetBig.performUpdate(MusicService.this, ids); + break; + } + case AppWidgetCard.NAME: { + appWidgetCard.performUpdate(MusicService.this, ids); + break; + } + case AppWidgetText.NAME: { + appWidgetText.performUpdate(MusicService.this, ids); + break; + } + } + } } - case AppWidgetSmall.NAME: - { - appWidgetSmall.performUpdate(MusicService.this, ids); - break; + }; + private AudioManager audioManager; + private IntentFilter becomingNoisyReceiverIntentFilter = + new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); + private boolean becomingNoisyReceiverRegistered; + private IntentFilter bluetoothConnectedIntentFilter = + new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED); + private boolean bluetoothConnectedRegistered = false; + private IntentFilter headsetReceiverIntentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); + private boolean headsetReceiverRegistered = false; + private MediaSessionCompat mediaSession; + private ContentObserver mediaStoreObserver; + private HandlerThread musicPlayerHandlerThread; + private boolean notHandledMetaChangedForCurrentTrack; + private List originalPlayingQueue = new ArrayList<>(); + private List playingQueue = new ArrayList<>(); + private boolean pausedByTransientLossOfFocus; + + private final BroadcastReceiver becomingNoisyReceiver = + new BroadcastReceiver() { + @Override + public void onReceive(Context context, @NonNull Intent intent) { + if (intent.getAction() != null + && intent.getAction().equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) { + pause(); + } } - case AppWidgetBig.NAME: - { - appWidgetBig.performUpdate(MusicService.this, ids); - break; + }; + + private PlaybackHandler playerHandler; + + private final AudioManager.OnAudioFocusChangeListener audioFocusListener = + new AudioManager.OnAudioFocusChangeListener() { + @Override + public void onAudioFocusChange(final int focusChange) { + playerHandler.obtainMessage(FOCUS_CHANGE, focusChange, 0).sendToTarget(); } - case AppWidgetCard.NAME: - { - appWidgetCard.performUpdate(MusicService.this, ids); - break; + }; + + private PlayingNotification playingNotification; + private final BroadcastReceiver updateFavoriteReceiver = + new BroadcastReceiver() { + @Override + public void onReceive(final Context context, final Intent intent) { + updateNotification(); } - case AppWidgetText.NAME: - { - appWidgetText.performUpdate(MusicService.this, ids); - break; + }; + private final BroadcastReceiver lockScreenReceiver = + new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (PreferenceUtil.INSTANCE.isLockScreen() && isPlaying()) { + Intent lockIntent = new Intent(context, LockScreenActivity.class); + lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(lockIntent); + } } - } - } - } - }; - private AudioManager audioManager; - private IntentFilter becomingNoisyReceiverIntentFilter = - new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); - private boolean becomingNoisyReceiverRegistered; - private IntentFilter bluetoothConnectedIntentFilter = - new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED); - private boolean bluetoothConnectedRegistered = false; - private IntentFilter headsetReceiverIntentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); - private boolean headsetReceiverRegistered = false; - private MediaSessionCompat mediaSession; - private ContentObserver mediaStoreObserver; - private HandlerThread musicPlayerHandlerThread; - private boolean notHandledMetaChangedForCurrentTrack; - private List originalPlayingQueue = new ArrayList<>(); - private List playingQueue = new ArrayList<>(); - private boolean pausedByTransientLossOfFocus; - - private final BroadcastReceiver becomingNoisyReceiver = - new BroadcastReceiver() { - @Override - public void onReceive(Context context, @NonNull Intent intent) { - if (intent.getAction() != null - && intent.getAction().equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) { - pause(); - } - } - }; - - private PlaybackHandler playerHandler; - - private final AudioManager.OnAudioFocusChangeListener audioFocusListener = - new AudioManager.OnAudioFocusChangeListener() { - @Override - public void onAudioFocusChange(final int focusChange) { - playerHandler.obtainMessage(FOCUS_CHANGE, focusChange, 0).sendToTarget(); - } - }; - - private PlayingNotification playingNotification; - private final BroadcastReceiver updateFavoriteReceiver = - new BroadcastReceiver() { - @Override - public void onReceive(final Context context, final Intent intent) { - updateNotification(); - } - }; - private final BroadcastReceiver lockScreenReceiver = - new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (PreferenceUtil.INSTANCE.isLockScreen() && isPlaying()) { - Intent lockIntent = new Intent(context, LockScreenActivity.class); - lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(lockIntent); - } - } - }; - private QueueSaveHandler queueSaveHandler; - private HandlerThread queueSaveHandlerThread; - private boolean queuesRestored; - private int repeatMode; - private int shuffleMode; - private SongPlayCountHelper songPlayCountHelper = new SongPlayCountHelper(); - private final BroadcastReceiver bluetoothReceiver = - new BroadcastReceiver() { - @Override - public void onReceive(final Context context, final Intent intent) { - String action = intent.getAction(); - if (action != null) { - if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action) - && PreferenceUtil.INSTANCE.isBluetoothSpeaker()) { - if (VERSION.SDK_INT >= VERSION_CODES.M) { - if (getAudioManager().getDevices(AudioManager.GET_DEVICES_OUTPUTS).length > 0) { - play(); + }; + private QueueSaveHandler queueSaveHandler; + private HandlerThread queueSaveHandlerThread; + private boolean queuesRestored; + private int repeatMode; + private int shuffleMode; + private SongPlayCountHelper songPlayCountHelper = new SongPlayCountHelper(); + private final BroadcastReceiver bluetoothReceiver = + new BroadcastReceiver() { + @Override + public void onReceive(final Context context, final Intent intent) { + String action = intent.getAction(); + if (action != null) { + if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action) + && PreferenceUtil.INSTANCE.isBluetoothSpeaker()) { + if (VERSION.SDK_INT >= VERSION_CODES.M) { + if (getAudioManager().getDevices(AudioManager.GET_DEVICES_OUTPUTS).length > 0) { + play(); + } + } else { + if (getAudioManager().isBluetoothA2dpOn()) { + play(); + } + } + } + } } - } else { - if (getAudioManager().isBluetoothA2dpOn()) { - play(); + }; + private PhoneStateListener phoneStateListener = + new PhoneStateListener() { + @Override + public void onCallStateChanged(int state, String incomingNumber) { + switch (state) { + case TelephonyManager.CALL_STATE_IDLE: + // Not in call: Play music + play(); + break; + case TelephonyManager.CALL_STATE_RINGING: + case TelephonyManager.CALL_STATE_OFFHOOK: + // A call is dialing, active or on hold + pause(); + break; + default: + } + super.onCallStateChanged(state, incomingNumber); } - } - } - } + }; + private BroadcastReceiver headsetReceiver = + new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action != null) { + if (Intent.ACTION_HEADSET_PLUG.equals(action)) { + int state = intent.getIntExtra("state", -1); + switch (state) { + case 0: + pause(); + break; + case 1: + play(); + break; + } + } + } + } + }; + private ThrottledSeekHandler throttledSeekHandler; + private Handler uiThreadHandler; + private PowerManager.WakeLock wakeLock; + + private static Bitmap copy(Bitmap bitmap) { + Bitmap.Config config = bitmap.getConfig(); + if (config == null) { + config = Bitmap.Config.RGB_565; } - }; - private PhoneStateListener phoneStateListener = - new PhoneStateListener() { - @Override - public void onCallStateChanged(int state, String incomingNumber) { - switch (state) { - case TelephonyManager.CALL_STATE_IDLE: - // Not in call: Play music - play(); - break; - case TelephonyManager.CALL_STATE_RINGING: - case TelephonyManager.CALL_STATE_OFFHOOK: - // A call is dialing, active or on hold - pause(); - break; - default: - } - super.onCallStateChanged(state, incomingNumber); + try { + return bitmap.copy(config, false); + } catch (OutOfMemoryError e) { + e.printStackTrace(); + return null; } - }; - private BroadcastReceiver headsetReceiver = - new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (action != null) { - if (Intent.ACTION_HEADSET_PLUG.equals(action)) { - int state = intent.getIntExtra("state", -1); - switch (state) { - case 0: - pause(); - break; - case 1: - play(); - break; - } - } - } + } + + private static String getTrackUri(@NonNull Song song) { + return MusicUtil.INSTANCE.getSongFileUri(song.getId()).toString(); + } + + @Override + public void onCreate() { + super.onCreate(); + final TelephonyManager telephonyManager = + (TelephonyManager) getSystemService(TELEPHONY_SERVICE); + if (telephonyManager != null) { + telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); } - }; - private ThrottledSeekHandler throttledSeekHandler; - private Handler uiThreadHandler; - private PowerManager.WakeLock wakeLock; - private static Bitmap copy(Bitmap bitmap) { - Bitmap.Config config = bitmap.getConfig(); - if (config == null) { - config = Bitmap.Config.RGB_565; - } - try { - return bitmap.copy(config, false); - } catch (OutOfMemoryError e) { - e.printStackTrace(); - return null; - } - } - - private static String getTrackUri(@NonNull Song song) { - return MusicUtil.INSTANCE.getSongFileUri(song.getId()).toString(); - } - - @Override - public void onCreate() { - super.onCreate(); - final TelephonyManager telephonyManager = - (TelephonyManager) getSystemService(TELEPHONY_SERVICE); - if (telephonyManager != null) { - telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); - } - - final PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); - if (powerManager != null) { - wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName()); - } - wakeLock.setReferenceCounted(false); - - musicPlayerHandlerThread = new HandlerThread("PlaybackHandler"); - musicPlayerHandlerThread.start(); - playerHandler = new PlaybackHandler(this, musicPlayerHandlerThread.getLooper()); - - playback = new MultiPlayer(this); - playback.setCallbacks(this); - - setupMediaSession(); - - // queue saving needs to run on a separate thread so that it doesn't block the playback handler - // events - queueSaveHandlerThread = - new HandlerThread("QueueSaveHandler", Process.THREAD_PRIORITY_BACKGROUND); - queueSaveHandlerThread.start(); - queueSaveHandler = new QueueSaveHandler(this, queueSaveHandlerThread.getLooper()); - - uiThreadHandler = new Handler(); - - registerReceiver(widgetIntentReceiver, new IntentFilter(APP_WIDGET_UPDATE)); - registerReceiver(updateFavoriteReceiver, new IntentFilter(FAVORITE_STATE_CHANGED)); - registerReceiver(lockScreenReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); - - initNotification(); - - mediaStoreObserver = new MediaStoreObserver(this, playerHandler); - throttledSeekHandler = new ThrottledSeekHandler(this, playerHandler); - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); - - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Media.INTERNAL_CONTENT_URI, true, mediaStoreObserver); - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Albums.INTERNAL_CONTENT_URI, true, mediaStoreObserver); - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Artists.INTERNAL_CONTENT_URI, true, mediaStoreObserver); - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Genres.INTERNAL_CONTENT_URI, true, mediaStoreObserver); - getContentResolver() - .registerContentObserver( - MediaStore.Audio.Playlists.INTERNAL_CONTENT_URI, true, mediaStoreObserver); - - PreferenceUtil.INSTANCE.registerOnSharedPreferenceChangedListener(this); - - restoreState(); - - sendBroadcast(new Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_CREATED")); - - registerHeadsetEvents(); - registerBluetoothConnected(); - } - - @Override - public void onDestroy() { - unregisterReceiver(widgetIntentReceiver); - unregisterReceiver(updateFavoriteReceiver); - unregisterReceiver(lockScreenReceiver); - if (becomingNoisyReceiverRegistered) { - unregisterReceiver(becomingNoisyReceiver); - becomingNoisyReceiverRegistered = false; - } - if (headsetReceiverRegistered) { - unregisterReceiver(headsetReceiver); - headsetReceiverRegistered = false; - } - if (bluetoothConnectedRegistered) { - unregisterReceiver(bluetoothReceiver); - bluetoothConnectedRegistered = false; - } - mediaSession.setActive(false); - quit(); - releaseResources(); - getContentResolver().unregisterContentObserver(mediaStoreObserver); - PreferenceUtil.INSTANCE.unregisterOnSharedPreferenceChangedListener(this); - wakeLock.release(); - - sendBroadcast(new Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_DESTROYED")); - } - - public void acquireWakeLock(long milli) { - wakeLock.acquire(milli); - } - - public void addSong(int position, Song song) { - playingQueue.add(position, song); - originalPlayingQueue.add(position, song); - notifyChange(QUEUE_CHANGED); - } - - public void addSong(Song song) { - playingQueue.add(song); - originalPlayingQueue.add(song); - notifyChange(QUEUE_CHANGED); - } - - public void addSongs(int position, List songs) { - playingQueue.addAll(position, songs); - originalPlayingQueue.addAll(position, songs); - notifyChange(QUEUE_CHANGED); - } - - public void addSongs(List songs) { - playingQueue.addAll(songs); - originalPlayingQueue.addAll(songs); - notifyChange(QUEUE_CHANGED); - } - - public void back(boolean force) { - if (getSongProgressMillis() > 2000) { - seek(0); - } else { - playPreviousSong(force); - } - } - - public void clearQueue() { - playingQueue.clear(); - originalPlayingQueue.clear(); - - setPosition(-1); - notifyChange(QUEUE_CHANGED); - } - - public void cycleRepeatMode() { - switch (getRepeatMode()) { - case REPEAT_MODE_NONE: - setRepeatMode(REPEAT_MODE_ALL); - break; - case REPEAT_MODE_ALL: - setRepeatMode(REPEAT_MODE_THIS); - break; - default: - setRepeatMode(REPEAT_MODE_NONE); - break; - } - } - - public int getAudioSessionId() { - if (playback != null) { - return playback.getAudioSessionId(); - } - return -1; - } - - @NonNull - public Song getCurrentSong() { - return getSongAt(getPosition()); - } - - @NonNull - public MediaSessionCompat getMediaSession() { - return mediaSession; - } - - public int getNextPosition(boolean force) { - int position = getPosition() + 1; - switch (getRepeatMode()) { - case REPEAT_MODE_ALL: - if (isLastTrack()) { - position = 0; + final PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); + if (powerManager != null) { + wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName()); } - break; - case REPEAT_MODE_THIS: - if (force) { - if (isLastTrack()) { - position = 0; - } - } else { - position -= 1; - } - break; - default: - case REPEAT_MODE_NONE: - if (isLastTrack()) { - position -= 1; - } - break; - } - return position; - } + wakeLock.setReferenceCounted(false); - @Nullable - public List getPlayingQueue() { - return playingQueue; - } + musicPlayerHandlerThread = new HandlerThread("PlaybackHandler"); + musicPlayerHandlerThread.start(); + playerHandler = new PlaybackHandler(this, musicPlayerHandlerThread.getLooper()); - public int getPosition() { - return position; - } + playback = new MultiPlayer(this); + playback.setCallbacks(this); - public void setPosition(final int position) { - // handle this on the handlers thread to avoid blocking the ui thread - playerHandler.removeMessages(SET_POSITION); - playerHandler.obtainMessage(SET_POSITION, position, 0).sendToTarget(); - } + setupMediaSession(); - public int getPreviousPosition(boolean force) { - int newPosition = getPosition() - 1; - switch (repeatMode) { - case REPEAT_MODE_ALL: - if (newPosition < 0) { - if (getPlayingQueue() != null) { - newPosition = getPlayingQueue().size() - 1; - } - } - break; - case REPEAT_MODE_THIS: - if (force) { - if (newPosition < 0) { - if (getPlayingQueue() != null) { - newPosition = getPlayingQueue().size() - 1; - } - } - } else { - newPosition = getPosition(); - } - break; - default: - case REPEAT_MODE_NONE: - if (newPosition < 0) { - newPosition = 0; - } - break; - } - return newPosition; - } + // queue saving needs to run on a separate thread so that it doesn't block the playback handler + // events + queueSaveHandlerThread = + new HandlerThread("QueueSaveHandler", Process.THREAD_PRIORITY_BACKGROUND); + queueSaveHandlerThread.start(); + queueSaveHandler = new QueueSaveHandler(this, queueSaveHandlerThread.getLooper()); - public long getQueueDurationMillis(int position) { - long duration = 0; - for (int i = position + 1; i < playingQueue.size(); i++) { - duration += playingQueue.get(i).getDuration(); - } - return duration; - } + uiThreadHandler = new Handler(); - public int getRepeatMode() { - return repeatMode; - } + registerReceiver(widgetIntentReceiver, new IntentFilter(APP_WIDGET_UPDATE)); + registerReceiver(updateFavoriteReceiver, new IntentFilter(FAVORITE_STATE_CHANGED)); + registerReceiver(lockScreenReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); - public void setRepeatMode(final int repeatMode) { - switch (repeatMode) { - case REPEAT_MODE_NONE: - case REPEAT_MODE_ALL: - case REPEAT_MODE_THIS: - this.repeatMode = repeatMode; - PreferenceManager.getDefaultSharedPreferences(this) - .edit() - .putInt(SAVED_REPEAT_MODE, repeatMode) - .apply(); - prepareNext(); - handleAndSendChangeInternal(REPEAT_MODE_CHANGED); - break; - } - } - - public int getShuffleMode() { - return shuffleMode; - } - - public void setShuffleMode(final int shuffleMode) { - PreferenceManager.getDefaultSharedPreferences(this) - .edit() - .putInt(SAVED_SHUFFLE_MODE, shuffleMode) - .apply(); - switch (shuffleMode) { - case SHUFFLE_MODE_SHUFFLE: - this.shuffleMode = shuffleMode; - if (this.getPlayingQueue() != null) { - ShuffleHelper.INSTANCE.makeShuffleList(this.getPlayingQueue(), getPosition()); - } - position = 0; - break; - case SHUFFLE_MODE_NONE: - this.shuffleMode = shuffleMode; - long currentSongId = Objects.requireNonNull(getCurrentSong()).getId(); - playingQueue = new ArrayList<>(originalPlayingQueue); - int newPosition = 0; - if (getPlayingQueue() != null) { - for (Song song : getPlayingQueue()) { - if (song.getId() == currentSongId) { - newPosition = getPlayingQueue().indexOf(song); - } - } - } - position = newPosition; - break; - } - handleAndSendChangeInternal(SHUFFLE_MODE_CHANGED); - notifyChange(QUEUE_CHANGED); - } - - @NonNull - public Song getSongAt(int position) { - if (position >= 0 && getPlayingQueue() != null && position < getPlayingQueue().size()) { - return getPlayingQueue().get(position); - } else { - return Song.Companion.getEmptySong(); - } - } - - public int getSongDurationMillis() { - if (playback != null) { - return playback.duration(); - } - return -1; - } - - public int getSongProgressMillis() { - if (playback != null) { - return playback.position(); - } - return -1; - } - - public void handleAndSendChangeInternal(@NonNull final String what) { - handleChangeInternal(what); - sendChangeInternal(what); - } - - public void initNotification() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N - && !PreferenceUtil.INSTANCE.isClassicNotification()) { - playingNotification = new PlayingNotificationImpl(); - } else { - playingNotification = new PlayingNotificationOreo(); - } - playingNotification.init(this); - } - - public boolean isLastTrack() { - if (getPlayingQueue() != null) { - return getPosition() == getPlayingQueue().size() - 1; - } - return false; - } - - public boolean isPausedByTransientLossOfFocus() { - return pausedByTransientLossOfFocus; - } - - public void setPausedByTransientLossOfFocus(boolean pausedByTransientLossOfFocus) { - this.pausedByTransientLossOfFocus = pausedByTransientLossOfFocus; - } - - public boolean isPlaying() { - return playback != null && playback.isPlaying(); - } - - public void moveSong(int from, int to) { - if (from == to) { - return; - } - final int currentPosition = getPosition(); - Song songToMove = playingQueue.remove(from); - playingQueue.add(to, songToMove); - if (getShuffleMode() == SHUFFLE_MODE_NONE) { - Song tmpSong = originalPlayingQueue.remove(from); - originalPlayingQueue.add(to, tmpSong); - } - if (from > currentPosition && to <= currentPosition) { - position = currentPosition + 1; - } else if (from < currentPosition && to >= currentPosition) { - position = currentPosition - 1; - } else if (from == currentPosition) { - position = to; - } - notifyChange(QUEUE_CHANGED); - } - - public void notifyChange(@NonNull final String what) { - handleAndSendChangeInternal(what); - sendPublicIntent(what); - } - - @NonNull - @Override - public IBinder onBind(Intent intent) { - return musicBind; - } - - @Override - public void onSharedPreferenceChanged( - @NonNull SharedPreferences sharedPreferences, @NonNull String key) { - switch (key) { - case GAP_LESS_PLAYBACK: - if (sharedPreferences.getBoolean(key, false)) { - prepareNext(); - } else { - if (playback != null) { - playback.setNextDataSource(null); - } - } - break; - case ALBUM_ART_ON_LOCK_SCREEN: - case BLURRED_ALBUM_ART: - updateMediaSessionMetaData(); - break; - case COLORED_NOTIFICATION: - updateNotification(); - break; - case CLASSIC_NOTIFICATION: initNotification(); - updateNotification(); - break; - case TOGGLE_HEADSET: + + mediaStoreObserver = new MediaStoreObserver(this, playerHandler); + throttledSeekHandler = new ThrottledSeekHandler(this, playerHandler); + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); + + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Media.INTERNAL_CONTENT_URI, true, mediaStoreObserver); + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Albums.INTERNAL_CONTENT_URI, true, mediaStoreObserver); + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Artists.INTERNAL_CONTENT_URI, true, mediaStoreObserver); + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Genres.INTERNAL_CONTENT_URI, true, mediaStoreObserver); + getContentResolver() + .registerContentObserver( + MediaStore.Audio.Playlists.INTERNAL_CONTENT_URI, true, mediaStoreObserver); + + PreferenceUtil.INSTANCE.registerOnSharedPreferenceChangedListener(this); + + restoreState(); + + sendBroadcast(new Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_CREATED")); + registerHeadsetEvents(); - break; - } - } - - @Override - public int onStartCommand(@Nullable Intent intent, int flags, int startId) { - if (intent != null && intent.getAction() != null) { - restoreQueuesAndPositionIfNecessary(); - String action = intent.getAction(); - switch (action) { - case ACTION_TOGGLE_PAUSE: - if (isPlaying()) { - pause(); - } else { - play(); - } - break; - case ACTION_PAUSE: - pause(); - break; - case ACTION_PLAY: - play(); - break; - case ACTION_PLAY_PLAYLIST: - playFromPlaylist(intent); - break; - case ACTION_REWIND: - back(true); - break; - case ACTION_SKIP: - playNextSong(true); - break; - case ACTION_STOP: - case ACTION_QUIT: - pendingQuit = false; - quit(); - break; - case ACTION_PENDING_QUIT: - pendingQuit = true; - break; - case TOGGLE_FAVORITE: - MusicUtil.INSTANCE.toggleFavorite(getApplicationContext(), getCurrentSong()); - break; - } + registerBluetoothConnected(); } - return START_NOT_STICKY; - } - - @Override - public void onTrackEnded() { - acquireWakeLock(30000); - playerHandler.sendEmptyMessage(TRACK_ENDED); - } - - @Override - public void onTrackWentToNext() { - playerHandler.sendEmptyMessage(TRACK_WENT_TO_NEXT); - } - - @Override - public boolean onUnbind(Intent intent) { - if (!isPlaying()) { - stopSelf(); - } - return true; - } - - public void openQueue( - @Nullable final List playingQueue, - final int startPosition, - final boolean startPlaying) { - if (playingQueue != null - && !playingQueue.isEmpty() - && startPosition >= 0 - && startPosition < playingQueue.size()) { - // it is important to copy the playing queue here first as we might add/remove songs later - originalPlayingQueue = new ArrayList<>(playingQueue); - this.playingQueue = new ArrayList<>(originalPlayingQueue); - - int position = startPosition; - if (shuffleMode == SHUFFLE_MODE_SHUFFLE) { - ShuffleHelper.INSTANCE.makeShuffleList(this.playingQueue, startPosition); - position = 0; - } - if (startPlaying) { - playSongAt(position); - } else { - setPosition(position); - } - notifyChange(QUEUE_CHANGED); - } - } - - public boolean openTrackAndPrepareNextAt(int position) { - synchronized (this) { - this.position = position; - boolean prepared = openCurrent(); - if (prepared) { - prepareNextImpl(); - } - notifyChange(META_CHANGED); - notHandledMetaChangedForCurrentTrack = false; - return prepared; - } - } - - public void pause() { - pausedByTransientLossOfFocus = false; - if (playback != null && playback.isPlaying()) { - playback.pause(); - notifyChange(PLAY_STATE_CHANGED); - } - } - - public void play() { - synchronized (this) { - if (requestFocus()) { - if (playback != null && !playback.isPlaying()) { - if (!playback.isInitialized()) { - playSongAt(getPosition()); - } else { - playback.start(); - if (!becomingNoisyReceiverRegistered) { - registerReceiver(becomingNoisyReceiver, becomingNoisyReceiverIntentFilter); - becomingNoisyReceiverRegistered = true; - } - if (notHandledMetaChangedForCurrentTrack) { - handleChangeInternal(META_CHANGED); - notHandledMetaChangedForCurrentTrack = false; - } - notifyChange(PLAY_STATE_CHANGED); - - // fixes a bug where the volume would stay ducked because the - // AudioManager.AUDIOFOCUS_GAIN event is not sent - playerHandler.removeMessages(DUCK); - playerHandler.sendEmptyMessage(UNDUCK); - } + @Override + public void onDestroy() { + unregisterReceiver(widgetIntentReceiver); + unregisterReceiver(updateFavoriteReceiver); + unregisterReceiver(lockScreenReceiver); + if (becomingNoisyReceiverRegistered) { + unregisterReceiver(becomingNoisyReceiver); + becomingNoisyReceiverRegistered = false; } - } else { - Toast.makeText( - this, getResources().getString(R.string.audio_focus_denied), Toast.LENGTH_SHORT) - .show(); - } + if (headsetReceiverRegistered) { + unregisterReceiver(headsetReceiver); + headsetReceiverRegistered = false; + } + if (bluetoothConnectedRegistered) { + unregisterReceiver(bluetoothReceiver); + bluetoothConnectedRegistered = false; + } + mediaSession.setActive(false); + quit(); + releaseResources(); + getContentResolver().unregisterContentObserver(mediaStoreObserver); + PreferenceUtil.INSTANCE.unregisterOnSharedPreferenceChangedListener(this); + wakeLock.release(); + + sendBroadcast(new Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_DESTROYED")); } - } - public void playNextSong(boolean force) { - playSongAt(getNextPosition(force)); - } - - public void playPreviousSong(boolean force) { - playSongAt(getPreviousPosition(force)); - } - - public void playSongAt(final int position) { - // handle this on the handlers thread to avoid blocking the ui thread - playerHandler.removeMessages(PLAY_SONG); - playerHandler.obtainMessage(PLAY_SONG, position, 0).sendToTarget(); - } - - public void playSongAtImpl(int position) { - if (openTrackAndPrepareNextAt(position)) { - play(); - } else { - Toast.makeText(this, getResources().getString(R.string.unplayable_file), Toast.LENGTH_SHORT) - .show(); + public void acquireWakeLock(long milli) { + wakeLock.acquire(milli); } - } - public void playSongs(ArrayList songs, int shuffleMode) { - if (songs != null && !songs.isEmpty()) { - if (shuffleMode == SHUFFLE_MODE_SHUFFLE) { - int startPosition = new Random().nextInt(songs.size()); - openQueue(songs, startPosition, false); - setShuffleMode(shuffleMode); - } else { - openQueue(songs, 0, false); - } - play(); - } else { - Toast.makeText(getApplicationContext(), R.string.playlist_is_empty, Toast.LENGTH_LONG).show(); + public void addSong(int position, Song song) { + playingQueue.add(position, song); + originalPlayingQueue.add(position, song); + notifyChange(QUEUE_CHANGED); } - } - public boolean prepareNextImpl() { - synchronized (this) { - try { - int nextPosition = getNextPosition(false); + public void addSong(Song song) { + playingQueue.add(song); + originalPlayingQueue.add(song); + notifyChange(QUEUE_CHANGED); + } + + public void addSongs(int position, List songs) { + playingQueue.addAll(position, songs); + originalPlayingQueue.addAll(position, songs); + notifyChange(QUEUE_CHANGED); + } + + public void addSongs(List songs) { + playingQueue.addAll(songs); + originalPlayingQueue.addAll(songs); + notifyChange(QUEUE_CHANGED); + } + + public void back(boolean force) { + if (getSongProgressMillis() > 2000) { + seek(0); + } else { + playPreviousSong(force); + } + } + + public void clearQueue() { + playingQueue.clear(); + originalPlayingQueue.clear(); + + setPosition(-1); + notifyChange(QUEUE_CHANGED); + } + + public void cycleRepeatMode() { + switch (getRepeatMode()) { + case REPEAT_MODE_NONE: + setRepeatMode(REPEAT_MODE_ALL); + break; + case REPEAT_MODE_ALL: + setRepeatMode(REPEAT_MODE_THIS); + break; + default: + setRepeatMode(REPEAT_MODE_NONE); + break; + } + } + + public int getAudioSessionId() { if (playback != null) { - playback.setNextDataSource(getTrackUri(Objects.requireNonNull(getSongAt(nextPosition)))); + return playback.getAudioSessionId(); } - this.nextPosition = nextPosition; - return true; - } catch (Exception e) { - return false; - } - } - } - - public void quit() { - pause(); - playingNotification.stop(); - - closeAudioEffectSession(); - getAudioManager().abandonAudioFocus(audioFocusListener); - stopSelf(); - } - - public void releaseWakeLock() { - if (wakeLock.isHeld()) { - wakeLock.release(); - } - } - - public void removeSong(int position) { - if (getShuffleMode() == SHUFFLE_MODE_NONE) { - playingQueue.remove(position); - originalPlayingQueue.remove(position); - } else { - originalPlayingQueue.remove(playingQueue.remove(position)); - } - - rePosition(position); - - notifyChange(QUEUE_CHANGED); - } - - public void removeSong(@NonNull Song song) { - for (int i = 0; i < playingQueue.size(); i++) { - if (playingQueue.get(i).getId() == song.getId()) { - playingQueue.remove(i); - rePosition(i); - } - } - for (int i = 0; i < originalPlayingQueue.size(); i++) { - if (originalPlayingQueue.get(i).getId() == song.getId()) { - originalPlayingQueue.remove(i); - } - } - notifyChange(QUEUE_CHANGED); - } - - public synchronized void restoreQueuesAndPositionIfNecessary() { - if (!queuesRestored && playingQueue.isEmpty()) { - List restoredQueue = MusicPlaybackQueueStore.getInstance(this).getSavedPlayingQueue(); - List restoredOriginalQueue = - MusicPlaybackQueueStore.getInstance(this).getSavedOriginalPlayingQueue(); - int restoredPosition = - PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_POSITION, -1); - int restoredPositionInTrack = - PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_POSITION_IN_TRACK, -1); - - if (restoredQueue.size() > 0 - && restoredQueue.size() == restoredOriginalQueue.size() - && restoredPosition != -1) { - this.originalPlayingQueue = restoredOriginalQueue; - this.playingQueue = restoredQueue; - - position = restoredPosition; - openCurrent(); - prepareNext(); - - if (restoredPositionInTrack > 0) { - seek(restoredPositionInTrack); - } - - notHandledMetaChangedForCurrentTrack = true; - sendChangeInternal(META_CHANGED); - sendChangeInternal(QUEUE_CHANGED); - } - } - queuesRestored = true; - } - - public void runOnUiThread(Runnable runnable) { - uiThreadHandler.post(runnable); - } - - public void savePositionInTrack() { - PreferenceManager.getDefaultSharedPreferences(this) - .edit() - .putInt(SAVED_POSITION_IN_TRACK, getSongProgressMillis()) - .apply(); - } - - public void saveQueuesImpl() { - MusicPlaybackQueueStore.getInstance(this).saveQueues(playingQueue, originalPlayingQueue); - } - - public void saveState() { - saveQueues(); - savePosition(); - savePositionInTrack(); - } - - public int seek(int millis) { - synchronized (this) { - try { - int newPosition = 0; - if (playback != null) { - newPosition = playback.seek(millis); - } - throttledSeekHandler.notifySeek(); - return newPosition; - } catch (Exception e) { return -1; - } } - } - - // to let other apps know whats playing. i.E. last.fm (scrobbling) or musixmatch - public void sendPublicIntent(@NonNull final String what) { - final Intent intent = new Intent(what.replace(RETRO_MUSIC_PACKAGE_NAME, MUSIC_PACKAGE_NAME)); - - final Song song = getCurrentSong(); - - if (song != null) { - intent.putExtra("id", song.getId()); - intent.putExtra("artist", song.getArtistName()); - intent.putExtra("album", song.getAlbumName()); - intent.putExtra("track", song.getTitle()); - intent.putExtra("duration", song.getDuration()); - intent.putExtra("position", (long) getSongProgressMillis()); - intent.putExtra("playing", isPlaying()); - intent.putExtra("scrobbling_source", RETRO_MUSIC_PACKAGE_NAME); - sendStickyBroadcast(intent); - } - } - - public void toggleShuffle() { - if (getShuffleMode() == SHUFFLE_MODE_NONE) { - setShuffleMode(SHUFFLE_MODE_SHUFFLE); - } else { - setShuffleMode(SHUFFLE_MODE_NONE); - } - } - - public void updateMediaSessionPlaybackState() { - PlaybackStateCompat.Builder stateBuilder = - new PlaybackStateCompat.Builder() - .setActions(MEDIA_SESSION_ACTIONS) - .setState( - isPlaying() ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED, - getSongProgressMillis(), - 1); - - setCustomAction(stateBuilder); - - mediaSession.setPlaybackState(stateBuilder.build()); - } - - public void updateNotification() { - if (playingNotification != null && getCurrentSong().getId() != -1) { - playingNotification.update(); - } - } - - void updateMediaSessionMetaData() { - final Song song = getCurrentSong(); - - if (song.getId() == -1) { - mediaSession.setMetadata(null); - return; - } - - final MediaMetadataCompat.Builder metaData = - new MediaMetadataCompat.Builder() - .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, song.getArtistName()) - .putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ARTIST, song.getArtistName()) - .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, song.getAlbumName()) - .putString(MediaMetadataCompat.METADATA_KEY_TITLE, song.getTitle()) - .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, song.getDuration()) - .putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, getPosition() + 1) - .putLong(MediaMetadataCompat.METADATA_KEY_YEAR, song.getYear()) - .putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, null) - .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, getPlayingQueue().size()); - - if (PreferenceUtil.INSTANCE.isAlbumArtOnLockScreen()) { - final Point screenSize = RetroUtil.getScreenSize(MusicService.this); - final BitmapRequestBuilder request = - SongGlideRequest.Builder.from(Glide.with(MusicService.this), song) - .checkIgnoreMediaStore(MusicService.this) - .asBitmap() - .build(); - if (PreferenceUtil.INSTANCE.isBlurredAlbumArt()) { - request.transform(new BlurTransformation.Builder(MusicService.this).build()); - } - runOnUiThread( - new Runnable() { - @Override - public void run() { - request.into( - new SimpleTarget(screenSize.x, screenSize.y) { - @Override - public void onLoadFailed(Exception e, Drawable errorDrawable) { - super.onLoadFailed(e, errorDrawable); - mediaSession.setMetadata(metaData.build()); - } - - @Override - public void onResourceReady( - Bitmap resource, GlideAnimation glideAnimation) { - metaData.putBitmap( - MediaMetadataCompat.METADATA_KEY_ALBUM_ART, copy(resource)); - mediaSession.setMetadata(metaData.build()); - } - }); - } - }); - } else { - mediaSession.setMetadata(metaData.build()); - } - } - - private void closeAudioEffectSession() { - final Intent audioEffectsIntent = - new Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION); - if (playback != null) { - audioEffectsIntent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, playback.getAudioSessionId()); - } - audioEffectsIntent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, getPackageName()); - sendBroadcast(audioEffectsIntent); - } - - private AudioManager getAudioManager() { - if (audioManager == null) { - audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); - } - return audioManager; - } - - private void handleChangeInternal(@NonNull final String what) { - switch (what) { - case PLAY_STATE_CHANGED: - updateNotification(); - updateMediaSessionPlaybackState(); - final boolean isPlaying = isPlaying(); - if (!isPlaying && getSongProgressMillis() > 0) { - savePositionInTrack(); - } - songPlayCountHelper.notifyPlayStateChanged(isPlaying); - break; - case FAVORITE_STATE_CHANGED: - case META_CHANGED: - updateNotification(); - updateMediaSessionMetaData(); - savePosition(); - savePositionInTrack(); - final Song currentSong = getCurrentSong(); - if (currentSong != null) { - HistoryStore.getInstance(this).addSongId(currentSong.getId()); - } - if (songPlayCountHelper.shouldBumpPlayCount()) { - SongPlayCountStore.getInstance(this).bumpPlayCount(songPlayCountHelper.getSong().getId()); - } - if (currentSong != null) { - songPlayCountHelper.notifySongChanged(currentSong); - } - break; - case QUEUE_CHANGED: - updateMediaSessionMetaData(); // because playing queue size might have changed - saveState(); - if (playingQueue.size() > 0) { - prepareNext(); - } else { - playingNotification.stop(); - } - break; - } - } - - private boolean openCurrent() { - synchronized (this) { - try { - if (playback != null) { - return playback.setDataSource(getTrackUri(Objects.requireNonNull(getCurrentSong()))); - } - } catch (Exception e) { - return false; - } - } - return false; - } - - private void playFromPlaylist(Intent intent) { - Playlist playlist = intent.getParcelableExtra(INTENT_EXTRA_PLAYLIST); - int shuffleMode = intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode()); - if (playlist != null) { - List playlistSongs = playlist.getSongs(); - if (!playlistSongs.isEmpty()) { - if (shuffleMode == SHUFFLE_MODE_SHUFFLE) { - int startPosition = new Random().nextInt(playlistSongs.size()); - openQueue(playlistSongs, startPosition, true); - setShuffleMode(shuffleMode); - } else { - openQueue(playlistSongs, 0, true); - } - } else { - Toast.makeText(getApplicationContext(), R.string.playlist_is_empty, Toast.LENGTH_LONG) - .show(); - } - } else { - Toast.makeText(getApplicationContext(), R.string.playlist_is_empty, Toast.LENGTH_LONG).show(); - } - } - - private void prepareNext() { - playerHandler.removeMessages(PREPARE_NEXT); - playerHandler.obtainMessage(PREPARE_NEXT).sendToTarget(); - } - - private void rePosition(int deletedPosition) { - int currentPosition = getPosition(); - if (deletedPosition < currentPosition) { - position = currentPosition - 1; - } else if (deletedPosition == currentPosition) { - if (playingQueue.size() > deletedPosition) { - setPosition(position); - } else { - setPosition(position - 1); - } - } - } - - private void registerBluetoothConnected() { - Log.i(TAG, "registerBluetoothConnected: "); - if (!bluetoothConnectedRegistered) { - registerReceiver(bluetoothReceiver, bluetoothConnectedIntentFilter); - bluetoothConnectedRegistered = true; - } - } - - private void registerHeadsetEvents() { - if (!headsetReceiverRegistered && PreferenceUtil.INSTANCE.isHeadsetPlugged()) { - registerReceiver(headsetReceiver, headsetReceiverIntentFilter); - headsetReceiverRegistered = true; - } - } - - private void releaseResources() { - playerHandler.removeCallbacksAndMessages(null); - musicPlayerHandlerThread.quitSafely(); - queueSaveHandler.removeCallbacksAndMessages(null); - queueSaveHandlerThread.quitSafely(); - if (playback != null) { - playback.release(); - } - playback = null; - mediaSession.release(); - } - - private boolean requestFocus() { - return (getAudioManager() - .requestAudioFocus( - audioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN) - == AudioManager.AUDIOFOCUS_REQUEST_GRANTED); - } - - private void restoreState() { - shuffleMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_SHUFFLE_MODE, 0); - repeatMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_REPEAT_MODE, 0); - handleAndSendChangeInternal(SHUFFLE_MODE_CHANGED); - handleAndSendChangeInternal(REPEAT_MODE_CHANGED); - - playerHandler.removeMessages(RESTORE_QUEUES); - playerHandler.sendEmptyMessage(RESTORE_QUEUES); - } - - private void savePosition() { - PreferenceManager.getDefaultSharedPreferences(this) - .edit() - .putInt(SAVED_POSITION, getPosition()) - .apply(); - } - - private void saveQueues() { - queueSaveHandler.removeMessages(SAVE_QUEUES); - queueSaveHandler.sendEmptyMessage(SAVE_QUEUES); - } - - private void sendChangeInternal(final String what) { - sendBroadcast(new Intent(what)); - appWidgetBig.notifyChange(this, what); - appWidgetClassic.notifyChange(this, what); - appWidgetSmall.notifyChange(this, what); - appWidgetCard.notifyChange(this, what); - appWidgetText.notifyChange(this, what); - } - - private void setCustomAction(PlaybackStateCompat.Builder stateBuilder) { - int repeatIcon = R.drawable.ic_repeat; // REPEAT_MODE_NONE - if (getRepeatMode() == REPEAT_MODE_THIS) { - repeatIcon = R.drawable.ic_repeat_one; - } else if (getRepeatMode() == REPEAT_MODE_ALL) { - repeatIcon = R.drawable.ic_repeat_white_circle; - } - stateBuilder.addCustomAction( - new PlaybackStateCompat.CustomAction.Builder( - CYCLE_REPEAT, getString(R.string.action_cycle_repeat), repeatIcon) - .build()); - - final int shuffleIcon = - getShuffleMode() == SHUFFLE_MODE_NONE - ? R.drawable.ic_shuffle_off_circled - : R.drawable.ic_shuffle_on_circled; - stateBuilder.addCustomAction( - new PlaybackStateCompat.CustomAction.Builder( - TOGGLE_SHUFFLE, getString(R.string.action_toggle_shuffle), shuffleIcon) - .build()); - - final int favoriteIcon = - MusicUtil.INSTANCE.isFavorite(getApplicationContext(), getCurrentSong()) - ? R.drawable.ic_favorite - : R.drawable.ic_favorite_border; - stateBuilder.addCustomAction( - new PlaybackStateCompat.CustomAction.Builder( - TOGGLE_FAVORITE, getString(R.string.action_toggle_favorite), favoriteIcon) - .build()); - } - - private void setupMediaSession() { - ComponentName mediaButtonReceiverComponentName = - new ComponentName(getApplicationContext(), MediaButtonIntentReceiver.class); - - Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); - mediaButtonIntent.setComponent(mediaButtonReceiverComponentName); - - PendingIntent mediaButtonReceiverPendingIntent = - PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0); - - mediaSession = - new MediaSessionCompat( - this, - "RetroMusicPlayer", - mediaButtonReceiverComponentName, - mediaButtonReceiverPendingIntent); - MediaSessionCallback mediasessionCallback = - new MediaSessionCallback(getApplicationContext(), this); - mediaSession.setFlags( - MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS - | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); - mediaSession.setCallback(mediasessionCallback); - mediaSession.setActive(true); - mediaSession.setMediaButtonReceiver(mediaButtonReceiverPendingIntent); - } - - public class MusicBinder extends Binder { @NonNull - public MusicService getService() { - return MusicService.this; + public Song getCurrentSong() { + return getSongAt(getPosition()); + } + + @NonNull + public MediaSessionCompat getMediaSession() { + return mediaSession; + } + + public int getNextPosition(boolean force) { + int position = getPosition() + 1; + switch (getRepeatMode()) { + case REPEAT_MODE_ALL: + if (isLastTrack()) { + position = 0; + } + break; + case REPEAT_MODE_THIS: + if (force) { + if (isLastTrack()) { + position = 0; + } + } else { + position -= 1; + } + break; + default: + case REPEAT_MODE_NONE: + if (isLastTrack()) { + position -= 1; + } + break; + } + return position; + } + + @Nullable + public List getPlayingQueue() { + return playingQueue; + } + + public int getPosition() { + return position; + } + + public void setPosition(final int position) { + // handle this on the handlers thread to avoid blocking the ui thread + playerHandler.removeMessages(SET_POSITION); + playerHandler.obtainMessage(SET_POSITION, position, 0).sendToTarget(); + } + + public int getPreviousPosition(boolean force) { + int newPosition = getPosition() - 1; + switch (repeatMode) { + case REPEAT_MODE_ALL: + if (newPosition < 0) { + if (getPlayingQueue() != null) { + newPosition = getPlayingQueue().size() - 1; + } + } + break; + case REPEAT_MODE_THIS: + if (force) { + if (newPosition < 0) { + if (getPlayingQueue() != null) { + newPosition = getPlayingQueue().size() - 1; + } + } + } else { + newPosition = getPosition(); + } + break; + default: + case REPEAT_MODE_NONE: + if (newPosition < 0) { + newPosition = 0; + } + break; + } + return newPosition; + } + + public long getQueueDurationMillis(int position) { + long duration = 0; + for (int i = position + 1; i < playingQueue.size(); i++) { + duration += playingQueue.get(i).getDuration(); + } + return duration; + } + + public int getRepeatMode() { + return repeatMode; + } + + public void setRepeatMode(final int repeatMode) { + switch (repeatMode) { + case REPEAT_MODE_NONE: + case REPEAT_MODE_ALL: + case REPEAT_MODE_THIS: + this.repeatMode = repeatMode; + PreferenceManager.getDefaultSharedPreferences(this) + .edit() + .putInt(SAVED_REPEAT_MODE, repeatMode) + .apply(); + prepareNext(); + handleAndSendChangeInternal(REPEAT_MODE_CHANGED); + break; + } + } + + public int getShuffleMode() { + return shuffleMode; + } + + public void setShuffleMode(final int shuffleMode) { + PreferenceManager.getDefaultSharedPreferences(this) + .edit() + .putInt(SAVED_SHUFFLE_MODE, shuffleMode) + .apply(); + switch (shuffleMode) { + case SHUFFLE_MODE_SHUFFLE: + this.shuffleMode = shuffleMode; + if (this.getPlayingQueue() != null) { + ShuffleHelper.INSTANCE.makeShuffleList(this.getPlayingQueue(), getPosition()); + } + position = 0; + break; + case SHUFFLE_MODE_NONE: + this.shuffleMode = shuffleMode; + long currentSongId = Objects.requireNonNull(getCurrentSong()).getId(); + playingQueue = new ArrayList<>(originalPlayingQueue); + int newPosition = 0; + if (getPlayingQueue() != null) { + for (Song song : getPlayingQueue()) { + if (song.getId() == currentSongId) { + newPosition = getPlayingQueue().indexOf(song); + } + } + } + position = newPosition; + break; + } + handleAndSendChangeInternal(SHUFFLE_MODE_CHANGED); + notifyChange(QUEUE_CHANGED); + } + + @NonNull + public Song getSongAt(int position) { + if (position >= 0 && getPlayingQueue() != null && position < getPlayingQueue().size()) { + return getPlayingQueue().get(position); + } else { + return Song.Companion.getEmptySong(); + } + } + + public int getSongDurationMillis() { + if (playback != null) { + return playback.duration(); + } + return -1; + } + + public int getSongProgressMillis() { + if (playback != null) { + return playback.position(); + } + return -1; + } + + public void handleAndSendChangeInternal(@NonNull final String what) { + handleChangeInternal(what); + sendChangeInternal(what); + } + + public void initNotification() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N + && !PreferenceUtil.INSTANCE.isClassicNotification()) { + playingNotification = new PlayingNotificationImpl(); + } else { + playingNotification = new PlayingNotificationOreo(); + } + playingNotification.init(this); + } + + public boolean isLastTrack() { + if (getPlayingQueue() != null) { + return getPosition() == getPlayingQueue().size() - 1; + } + return false; + } + + public boolean isPausedByTransientLossOfFocus() { + return pausedByTransientLossOfFocus; + } + + public void setPausedByTransientLossOfFocus(boolean pausedByTransientLossOfFocus) { + this.pausedByTransientLossOfFocus = pausedByTransientLossOfFocus; + } + + public boolean isPlaying() { + return playback != null && playback.isPlaying(); + } + + public void moveSong(int from, int to) { + if (from == to) { + return; + } + final int currentPosition = getPosition(); + Song songToMove = playingQueue.remove(from); + playingQueue.add(to, songToMove); + if (getShuffleMode() == SHUFFLE_MODE_NONE) { + Song tmpSong = originalPlayingQueue.remove(from); + originalPlayingQueue.add(to, tmpSong); + } + if (from > currentPosition && to <= currentPosition) { + position = currentPosition + 1; + } else if (from < currentPosition && to >= currentPosition) { + position = currentPosition - 1; + } else if (from == currentPosition) { + position = to; + } + notifyChange(QUEUE_CHANGED); + } + + public void notifyChange(@NonNull final String what) { + handleAndSendChangeInternal(what); + sendPublicIntent(what); + } + + @NonNull + @Override + public IBinder onBind(Intent intent) { + return musicBind; + } + + @Override + public void onSharedPreferenceChanged( + @NonNull SharedPreferences sharedPreferences, @NonNull String key) { + switch (key) { + case GAP_LESS_PLAYBACK: + if (sharedPreferences.getBoolean(key, false)) { + prepareNext(); + } else { + if (playback != null) { + playback.setNextDataSource(null); + } + } + break; + case ALBUM_ART_ON_LOCK_SCREEN: + case BLURRED_ALBUM_ART: + updateMediaSessionMetaData(); + break; + case COLORED_NOTIFICATION: + updateNotification(); + break; + case CLASSIC_NOTIFICATION: + initNotification(); + updateNotification(); + break; + case TOGGLE_HEADSET: + registerHeadsetEvents(); + break; + } + } + + @Override + public int onStartCommand(@Nullable Intent intent, int flags, int startId) { + if (intent != null && intent.getAction() != null) { + restoreQueuesAndPositionIfNecessary(); + String action = intent.getAction(); + switch (action) { + case ACTION_TOGGLE_PAUSE: + if (isPlaying()) { + pause(); + } else { + play(); + } + break; + case ACTION_PAUSE: + pause(); + break; + case ACTION_PLAY: + play(); + break; + case ACTION_PLAY_PLAYLIST: + playFromPlaylist(intent); + break; + case ACTION_REWIND: + back(true); + break; + case ACTION_SKIP: + playNextSong(true); + break; + case ACTION_STOP: + case ACTION_QUIT: + pendingQuit = false; + quit(); + break; + case ACTION_PENDING_QUIT: + pendingQuit = true; + break; + case TOGGLE_FAVORITE: + MusicUtil.INSTANCE.toggleFavorite(getApplicationContext(), getCurrentSong()); + break; + } + } + + return START_NOT_STICKY; + } + + @Override + public void onTrackEnded() { + acquireWakeLock(30000); + playerHandler.sendEmptyMessage(TRACK_ENDED); + } + + @Override + public void onTrackWentToNext() { + playerHandler.sendEmptyMessage(TRACK_WENT_TO_NEXT); + } + + @Override + public boolean onUnbind(Intent intent) { + if (!isPlaying()) { + stopSelf(); + } + return true; + } + + public void openQueue( + @Nullable final List playingQueue, + final int startPosition, + final boolean startPlaying) { + if (playingQueue != null + && !playingQueue.isEmpty() + && startPosition >= 0 + && startPosition < playingQueue.size()) { + // it is important to copy the playing queue here first as we might add/remove songs later + originalPlayingQueue = new ArrayList<>(playingQueue); + this.playingQueue = new ArrayList<>(originalPlayingQueue); + + int position = startPosition; + if (shuffleMode == SHUFFLE_MODE_SHUFFLE) { + ShuffleHelper.INSTANCE.makeShuffleList(this.playingQueue, startPosition); + position = 0; + } + if (startPlaying) { + playSongAt(position); + } else { + setPosition(position); + } + notifyChange(QUEUE_CHANGED); + } + } + + public boolean openTrackAndPrepareNextAt(int position) { + synchronized (this) { + this.position = position; + boolean prepared = openCurrent(); + if (prepared) { + prepareNextImpl(); + } + notifyChange(META_CHANGED); + notHandledMetaChangedForCurrentTrack = false; + return prepared; + } + } + + public void pause() { + pausedByTransientLossOfFocus = false; + if (playback != null && playback.isPlaying()) { + playback.pause(); + notifyChange(PLAY_STATE_CHANGED); + } + } + + public void play() { + synchronized (this) { + if (requestFocus()) { + if (playback != null && !playback.isPlaying()) { + if (!playback.isInitialized()) { + playSongAt(getPosition()); + } else { + playback.start(); + if (!becomingNoisyReceiverRegistered) { + registerReceiver(becomingNoisyReceiver, becomingNoisyReceiverIntentFilter); + becomingNoisyReceiverRegistered = true; + } + if (notHandledMetaChangedForCurrentTrack) { + handleChangeInternal(META_CHANGED); + notHandledMetaChangedForCurrentTrack = false; + } + notifyChange(PLAY_STATE_CHANGED); + + // fixes a bug where the volume would stay ducked because the + // AudioManager.AUDIOFOCUS_GAIN event is not sent + playerHandler.removeMessages(DUCK); + playerHandler.sendEmptyMessage(UNDUCK); + } + } + } else { + Toast.makeText( + this, getResources().getString(R.string.audio_focus_denied), Toast.LENGTH_SHORT) + .show(); + } + } + } + + public void playNextSong(boolean force) { + playSongAt(getNextPosition(force)); + } + + public void playPreviousSong(boolean force) { + playSongAt(getPreviousPosition(force)); + } + + public void playSongAt(final int position) { + // handle this on the handlers thread to avoid blocking the ui thread + playerHandler.removeMessages(PLAY_SONG); + playerHandler.obtainMessage(PLAY_SONG, position, 0).sendToTarget(); + } + + public void playSongAtImpl(int position) { + if (openTrackAndPrepareNextAt(position)) { + play(); + } else { + Toast.makeText(this, getResources().getString(R.string.unplayable_file), Toast.LENGTH_SHORT) + .show(); + } + } + + public void playSongs(ArrayList songs, int shuffleMode) { + if (songs != null && !songs.isEmpty()) { + if (shuffleMode == SHUFFLE_MODE_SHUFFLE) { + int startPosition = new Random().nextInt(songs.size()); + openQueue(songs, startPosition, false); + setShuffleMode(shuffleMode); + } else { + openQueue(songs, 0, false); + } + play(); + } else { + Toast.makeText(getApplicationContext(), R.string.playlist_is_empty, Toast.LENGTH_LONG).show(); + } + } + + public boolean prepareNextImpl() { + synchronized (this) { + try { + int nextPosition = getNextPosition(false); + if (playback != null) { + playback.setNextDataSource(getTrackUri(Objects.requireNonNull(getSongAt(nextPosition)))); + } + this.nextPosition = nextPosition; + return true; + } catch (Exception e) { + return false; + } + } + } + + public void quit() { + pause(); + playingNotification.stop(); + + closeAudioEffectSession(); + getAudioManager().abandonAudioFocus(audioFocusListener); + stopSelf(); + } + + public void releaseWakeLock() { + if (wakeLock.isHeld()) { + wakeLock.release(); + } + } + + public void removeSong(int position) { + if (getShuffleMode() == SHUFFLE_MODE_NONE) { + playingQueue.remove(position); + originalPlayingQueue.remove(position); + } else { + originalPlayingQueue.remove(playingQueue.remove(position)); + } + + rePosition(position); + + notifyChange(QUEUE_CHANGED); + } + + public void removeSong(@NonNull Song song) { + for (int i = 0; i < playingQueue.size(); i++) { + if (playingQueue.get(i).getId() == song.getId()) { + playingQueue.remove(i); + rePosition(i); + } + } + for (int i = 0; i < originalPlayingQueue.size(); i++) { + if (originalPlayingQueue.get(i).getId() == song.getId()) { + originalPlayingQueue.remove(i); + } + } + notifyChange(QUEUE_CHANGED); + } + + public synchronized void restoreQueuesAndPositionIfNecessary() { + if (!queuesRestored && playingQueue.isEmpty()) { + List restoredQueue = MusicPlaybackQueueStore.getInstance(this).getSavedPlayingQueue(); + List restoredOriginalQueue = + MusicPlaybackQueueStore.getInstance(this).getSavedOriginalPlayingQueue(); + int restoredPosition = + PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_POSITION, -1); + int restoredPositionInTrack = + PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_POSITION_IN_TRACK, -1); + + if (restoredQueue.size() > 0 + && restoredQueue.size() == restoredOriginalQueue.size() + && restoredPosition != -1) { + this.originalPlayingQueue = restoredOriginalQueue; + this.playingQueue = restoredQueue; + + position = restoredPosition; + openCurrent(); + prepareNext(); + + if (restoredPositionInTrack > 0) { + seek(restoredPositionInTrack); + } + + notHandledMetaChangedForCurrentTrack = true; + sendChangeInternal(META_CHANGED); + sendChangeInternal(QUEUE_CHANGED); + } + } + queuesRestored = true; + } + + public void runOnUiThread(Runnable runnable) { + uiThreadHandler.post(runnable); + } + + public void savePositionInTrack() { + PreferenceManager.getDefaultSharedPreferences(this) + .edit() + .putInt(SAVED_POSITION_IN_TRACK, getSongProgressMillis()) + .apply(); + } + + public void saveQueuesImpl() { + MusicPlaybackQueueStore.getInstance(this).saveQueues(playingQueue, originalPlayingQueue); + } + + public void saveState() { + saveQueues(); + savePosition(); + savePositionInTrack(); + } + + public int seek(int millis) { + synchronized (this) { + try { + int newPosition = 0; + if (playback != null) { + newPosition = playback.seek(millis); + } + throttledSeekHandler.notifySeek(); + return newPosition; + } catch (Exception e) { + return -1; + } + } + } + + // to let other apps know whats playing. i.E. last.fm (scrobbling) or musixmatch + public void sendPublicIntent(@NonNull final String what) { + final Intent intent = new Intent(what.replace(RETRO_MUSIC_PACKAGE_NAME, MUSIC_PACKAGE_NAME)); + + final Song song = getCurrentSong(); + + if (song != null) { + intent.putExtra("id", song.getId()); + intent.putExtra("artist", song.getArtistName()); + intent.putExtra("album", song.getAlbumName()); + intent.putExtra("track", song.getTitle()); + intent.putExtra("duration", song.getDuration()); + intent.putExtra("position", (long) getSongProgressMillis()); + intent.putExtra("playing", isPlaying()); + intent.putExtra("scrobbling_source", RETRO_MUSIC_PACKAGE_NAME); + sendStickyBroadcast(intent); + } + } + + public void toggleShuffle() { + if (getShuffleMode() == SHUFFLE_MODE_NONE) { + setShuffleMode(SHUFFLE_MODE_SHUFFLE); + } else { + setShuffleMode(SHUFFLE_MODE_NONE); + } + } + + public void updateMediaSessionPlaybackState() { + PlaybackStateCompat.Builder stateBuilder = + new PlaybackStateCompat.Builder() + .setActions(MEDIA_SESSION_ACTIONS) + .setState( + isPlaying() ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED, + getSongProgressMillis(), + 1); + + setCustomAction(stateBuilder); + + mediaSession.setPlaybackState(stateBuilder.build()); + } + + public void updateNotification() { + if (playingNotification != null && getCurrentSong().getId() != -1) { + playingNotification.update(); + } + } + + public void updateMediaSessionMetaData() { + Log.i(TAG, "onResourceReady: "); + final Song song = getCurrentSong(); + + if (song.getId() == -1) { + mediaSession.setMetadata(null); + return; + } + + final MediaMetadataCompat.Builder metaData = new MediaMetadataCompat.Builder() + .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, song.getArtistName()) + .putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ARTIST, song.getArtistName()) + .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, song.getAlbumName()) + .putString(MediaMetadataCompat.METADATA_KEY_TITLE, song.getTitle()) + .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, song.getDuration()) + .putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, getPosition() + 1) + .putLong(MediaMetadataCompat.METADATA_KEY_YEAR, song.getYear()) + .putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, null); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + metaData.putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, getPlayingQueue().size()); + } + + if (PreferenceUtil.INSTANCE.isAlbumArtOnLockScreen()) { + final Point screenSize = RetroUtil.getScreenSize(MusicService.this); + final BitmapRequestBuilder request = SongGlideRequest.Builder.from(Glide.with(MusicService.this), song) + .checkIgnoreMediaStore(MusicService.this) + .asBitmap().build(); + if (PreferenceUtil.INSTANCE.isBlurredAlbumArt()) { + request.transform(new BlurTransformation.Builder(MusicService.this).build()); + } + runOnUiThread(new Runnable() { + @Override + public void run() { + request.into(new SimpleTarget(screenSize.x, screenSize.y) { + @Override + public void onLoadFailed(Exception e, Drawable errorDrawable) { + super.onLoadFailed(e, errorDrawable); + mediaSession.setMetadata(metaData.build()); + } + + @Override + public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { + + metaData.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, copy(resource)); + mediaSession.setMetadata(metaData.build()); + } + }); + } + }); + } else { + mediaSession.setMetadata(metaData.build()); + } + } + + private void closeAudioEffectSession() { + final Intent audioEffectsIntent = + new Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION); + if (playback != null) { + audioEffectsIntent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, playback.getAudioSessionId()); + } + audioEffectsIntent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, getPackageName()); + sendBroadcast(audioEffectsIntent); + } + + private AudioManager getAudioManager() { + if (audioManager == null) { + audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); + } + return audioManager; + } + + private void handleChangeInternal(@NonNull final String what) { + switch (what) { + case PLAY_STATE_CHANGED: + updateNotification(); + updateMediaSessionPlaybackState(); + final boolean isPlaying = isPlaying(); + if (!isPlaying && getSongProgressMillis() > 0) { + savePositionInTrack(); + } + songPlayCountHelper.notifyPlayStateChanged(isPlaying); + break; + case FAVORITE_STATE_CHANGED: + case META_CHANGED: + updateNotification(); + updateMediaSessionMetaData(); + savePosition(); + savePositionInTrack(); + final Song currentSong = getCurrentSong(); + HistoryStore.getInstance(this).addSongId(currentSong.getId()); + if (songPlayCountHelper.shouldBumpPlayCount()) { + SongPlayCountStore.getInstance(this).bumpPlayCount(songPlayCountHelper.getSong().getId()); + } + songPlayCountHelper.notifySongChanged(currentSong); + break; + case QUEUE_CHANGED: + updateMediaSessionMetaData(); // because playing queue size might have changed + saveState(); + if (playingQueue.size() > 0) { + prepareNext(); + } else { + playingNotification.stop(); + } + break; + } + } + + private boolean openCurrent() { + synchronized (this) { + try { + if (playback != null) { + return playback.setDataSource(getTrackUri(Objects.requireNonNull(getCurrentSong()))); + } + } catch (Exception e) { + return false; + } + } + return false; + } + + private void playFromPlaylist(Intent intent) { + Playlist playlist = intent.getParcelableExtra(INTENT_EXTRA_PLAYLIST); + int shuffleMode = intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode()); + if (playlist != null) { + List playlistSongs = playlist.getSongs(); + if (!playlistSongs.isEmpty()) { + if (shuffleMode == SHUFFLE_MODE_SHUFFLE) { + int startPosition = new Random().nextInt(playlistSongs.size()); + openQueue(playlistSongs, startPosition, true); + setShuffleMode(shuffleMode); + } else { + openQueue(playlistSongs, 0, true); + } + } else { + Toast.makeText(getApplicationContext(), R.string.playlist_is_empty, Toast.LENGTH_LONG) + .show(); + } + } else { + Toast.makeText(getApplicationContext(), R.string.playlist_is_empty, Toast.LENGTH_LONG).show(); + } + } + + private void prepareNext() { + playerHandler.removeMessages(PREPARE_NEXT); + playerHandler.obtainMessage(PREPARE_NEXT).sendToTarget(); + } + + private void rePosition(int deletedPosition) { + int currentPosition = getPosition(); + if (deletedPosition < currentPosition) { + position = currentPosition - 1; + } else if (deletedPosition == currentPosition) { + if (playingQueue.size() > deletedPosition) { + setPosition(position); + } else { + setPosition(position - 1); + } + } + } + + private void registerBluetoothConnected() { + Log.i(TAG, "registerBluetoothConnected: "); + if (!bluetoothConnectedRegistered) { + registerReceiver(bluetoothReceiver, bluetoothConnectedIntentFilter); + bluetoothConnectedRegistered = true; + } + } + + private void registerHeadsetEvents() { + if (!headsetReceiverRegistered && PreferenceUtil.INSTANCE.isHeadsetPlugged()) { + registerReceiver(headsetReceiver, headsetReceiverIntentFilter); + headsetReceiverRegistered = true; + } + } + + private void releaseResources() { + playerHandler.removeCallbacksAndMessages(null); + musicPlayerHandlerThread.quitSafely(); + queueSaveHandler.removeCallbacksAndMessages(null); + queueSaveHandlerThread.quitSafely(); + if (playback != null) { + playback.release(); + } + playback = null; + mediaSession.release(); + } + + private boolean requestFocus() { + return (getAudioManager() + .requestAudioFocus( + audioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN) + == AudioManager.AUDIOFOCUS_REQUEST_GRANTED); + } + + private void restoreState() { + shuffleMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_SHUFFLE_MODE, 0); + repeatMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_REPEAT_MODE, 0); + handleAndSendChangeInternal(SHUFFLE_MODE_CHANGED); + handleAndSendChangeInternal(REPEAT_MODE_CHANGED); + + playerHandler.removeMessages(RESTORE_QUEUES); + playerHandler.sendEmptyMessage(RESTORE_QUEUES); + } + + private void savePosition() { + PreferenceManager.getDefaultSharedPreferences(this) + .edit() + .putInt(SAVED_POSITION, getPosition()) + .apply(); + } + + private void saveQueues() { + queueSaveHandler.removeMessages(SAVE_QUEUES); + queueSaveHandler.sendEmptyMessage(SAVE_QUEUES); + } + + private void sendChangeInternal(final String what) { + sendBroadcast(new Intent(what)); + appWidgetBig.notifyChange(this, what); + appWidgetClassic.notifyChange(this, what); + appWidgetSmall.notifyChange(this, what); + appWidgetCard.notifyChange(this, what); + appWidgetText.notifyChange(this, what); + } + + private void setCustomAction(PlaybackStateCompat.Builder stateBuilder) { + int repeatIcon = R.drawable.ic_repeat; // REPEAT_MODE_NONE + if (getRepeatMode() == REPEAT_MODE_THIS) { + repeatIcon = R.drawable.ic_repeat_one; + } else if (getRepeatMode() == REPEAT_MODE_ALL) { + repeatIcon = R.drawable.ic_repeat_white_circle; + } + stateBuilder.addCustomAction( + new PlaybackStateCompat.CustomAction.Builder( + CYCLE_REPEAT, getString(R.string.action_cycle_repeat), repeatIcon) + .build()); + + final int shuffleIcon = + getShuffleMode() == SHUFFLE_MODE_NONE + ? R.drawable.ic_shuffle_off_circled + : R.drawable.ic_shuffle_on_circled; + stateBuilder.addCustomAction( + new PlaybackStateCompat.CustomAction.Builder( + TOGGLE_SHUFFLE, getString(R.string.action_toggle_shuffle), shuffleIcon) + .build()); + + final int favoriteIcon = + MusicUtil.INSTANCE.isFavorite(getApplicationContext(), getCurrentSong()) + ? R.drawable.ic_favorite + : R.drawable.ic_favorite_border; + stateBuilder.addCustomAction( + new PlaybackStateCompat.CustomAction.Builder( + TOGGLE_FAVORITE, getString(R.string.action_toggle_favorite), favoriteIcon) + .build()); + } + + private void setupMediaSession() { + ComponentName mediaButtonReceiverComponentName = + new ComponentName(getApplicationContext(), MediaButtonIntentReceiver.class); + + Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); + mediaButtonIntent.setComponent(mediaButtonReceiverComponentName); + + PendingIntent mediaButtonReceiverPendingIntent = + PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0); + + mediaSession = + new MediaSessionCompat( + this, + "RetroMusicPlayer", + mediaButtonReceiverComponentName, + mediaButtonReceiverPendingIntent); + MediaSessionCallback mediasessionCallback = + new MediaSessionCallback(getApplicationContext(), this); + mediaSession.setFlags( + MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS + | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); + mediaSession.setCallback(mediasessionCallback); + mediaSession.setActive(true); + mediaSession.setMediaButtonReceiver(mediaButtonReceiverPendingIntent); + } + + public class MusicBinder extends Binder { + + @NonNull + public MusicService getService() { + return MusicService.this; + } } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt index 7bcbdfc9..d0dd3beb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt @@ -8,7 +8,75 @@ import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.preference.PreferenceManager import androidx.viewpager.widget.ViewPager -import code.name.monkey.retromusic.* +import code.name.monkey.retromusic.ADAPTIVE_COLOR_APP +import code.name.monkey.retromusic.ALBUM_ARTISTS_ONLY +import code.name.monkey.retromusic.ALBUM_ART_ON_LOCK_SCREEN +import code.name.monkey.retromusic.ALBUM_COVER_STYLE +import code.name.monkey.retromusic.ALBUM_COVER_TRANSFORM +import code.name.monkey.retromusic.ALBUM_DETAIL_SONG_SORT_ORDER +import code.name.monkey.retromusic.ALBUM_GRID_SIZE +import code.name.monkey.retromusic.ALBUM_GRID_SIZE_LAND +import code.name.monkey.retromusic.ALBUM_GRID_STYLE +import code.name.monkey.retromusic.ALBUM_SONG_SORT_ORDER +import code.name.monkey.retromusic.ALBUM_SORT_ORDER +import code.name.monkey.retromusic.ARTIST_ALBUM_SORT_ORDER +import code.name.monkey.retromusic.ARTIST_GRID_SIZE +import code.name.monkey.retromusic.ARTIST_GRID_SIZE_LAND +import code.name.monkey.retromusic.ARTIST_GRID_STYLE +import code.name.monkey.retromusic.ARTIST_SONG_SORT_ORDER +import code.name.monkey.retromusic.ARTIST_SORT_ORDER +import code.name.monkey.retromusic.AUDIO_DUCKING +import code.name.monkey.retromusic.AUTO_DOWNLOAD_IMAGES_POLICY +import code.name.monkey.retromusic.App +import code.name.monkey.retromusic.BLACK_THEME +import code.name.monkey.retromusic.BLUETOOTH_PLAYBACK +import code.name.monkey.retromusic.BLURRED_ALBUM_ART +import code.name.monkey.retromusic.CAROUSEL_EFFECT +import code.name.monkey.retromusic.CHOOSE_EQUALIZER +import code.name.monkey.retromusic.CLASSIC_NOTIFICATION +import code.name.monkey.retromusic.COLORED_APP_SHORTCUTS +import code.name.monkey.retromusic.COLORED_NOTIFICATION +import code.name.monkey.retromusic.DESATURATED_COLOR +import code.name.monkey.retromusic.EXPAND_NOW_PLAYING_PANEL +import code.name.monkey.retromusic.EXTRA_SONG_INFO +import code.name.monkey.retromusic.FILTER_SONG +import code.name.monkey.retromusic.GAP_LESS_PLAYBACK +import code.name.monkey.retromusic.GENERAL_THEME +import code.name.monkey.retromusic.GENRE_SORT_ORDER +import code.name.monkey.retromusic.HOME_ALBUM_GRID_STYLE +import code.name.monkey.retromusic.HOME_ARTIST_GRID_STYLE +import code.name.monkey.retromusic.IGNORE_MEDIA_STORE_ARTWORK +import code.name.monkey.retromusic.INITIALIZED_BLACKLIST +import code.name.monkey.retromusic.KEEP_SCREEN_ON +import code.name.monkey.retromusic.LANGUAGE_NAME +import code.name.monkey.retromusic.LAST_ADDED_CUTOFF +import code.name.monkey.retromusic.LAST_CHANGELOG_VERSION +import code.name.monkey.retromusic.LAST_PAGE +import code.name.monkey.retromusic.LAST_SLEEP_TIMER_VALUE +import code.name.monkey.retromusic.LIBRARY_CATEGORIES +import code.name.monkey.retromusic.LOCK_SCREEN +import code.name.monkey.retromusic.LYRICS_OPTIONS +import code.name.monkey.retromusic.NEXT_SLEEP_TIMER_ELAPSED_REALTIME +import code.name.monkey.retromusic.NOW_PLAYING_SCREEN_ID +import code.name.monkey.retromusic.PAUSE_ON_ZERO_VOLUME +import code.name.monkey.retromusic.PLAYLIST_SORT_ORDER +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.RECENTLY_PLAYED_CUTOFF +import code.name.monkey.retromusic.SAF_SDCARD_URI +import code.name.monkey.retromusic.SLEEP_TIMER_FINISH_SONG +import code.name.monkey.retromusic.SONG_GRID_SIZE +import code.name.monkey.retromusic.SONG_GRID_SIZE_LAND +import code.name.monkey.retromusic.SONG_GRID_STYLE +import code.name.monkey.retromusic.SONG_SORT_ORDER +import code.name.monkey.retromusic.START_DIRECTORY +import code.name.monkey.retromusic.TAB_TEXT_MODE +import code.name.monkey.retromusic.TOGGLE_ADD_CONTROLS +import code.name.monkey.retromusic.TOGGLE_FULL_SCREEN +import code.name.monkey.retromusic.TOGGLE_HEADSET +import code.name.monkey.retromusic.TOGGLE_HOME_BANNER +import code.name.monkey.retromusic.TOGGLE_SHUFFLE +import code.name.monkey.retromusic.TOGGLE_VOLUME +import code.name.monkey.retromusic.USER_NAME import code.name.monkey.retromusic.extensions.getIntRes import code.name.monkey.retromusic.extensions.getStringOrDefault import code.name.monkey.retromusic.fragments.AlbumCoverStyle @@ -16,7 +84,13 @@ import code.name.monkey.retromusic.fragments.NowPlayingScreen import code.name.monkey.retromusic.fragments.folder.FoldersFragment import code.name.monkey.retromusic.helper.SortOrder.* import code.name.monkey.retromusic.model.CategoryInfo -import code.name.monkey.retromusic.transform.* +import code.name.monkey.retromusic.transform.CascadingPageTransformer +import code.name.monkey.retromusic.transform.DepthTransformation +import code.name.monkey.retromusic.transform.HingeTransformation +import code.name.monkey.retromusic.transform.HorizontalFlipTransformation +import code.name.monkey.retromusic.transform.NormalPageTransformer +import code.name.monkey.retromusic.transform.VerticalFlipTransformation +import code.name.monkey.retromusic.transform.VerticalStackTransformer import code.name.monkey.retromusic.util.theme.ThemeMode import com.google.android.material.bottomnavigation.LabelVisibilityMode import com.google.gson.Gson @@ -154,6 +228,7 @@ object PreferenceUtil { putString(ALBUM_SORT_ORDER, value) } + var artistSortOrder get() = sharedPreferences.getStringOrDefault( ARTIST_SORT_ORDER, @@ -181,6 +256,15 @@ object PreferenceUtil { ArtistAlbumSortOrder.ALBUM_A_Z ) + var playlistSortOrder + get() = sharedPreferences.getStringOrDefault( + PLAYLIST_SORT_ORDER, + PlaylistSortOrder.PLAYLIST_A_Z + ) + set(value) = sharedPreferences.edit { + putString(PLAYLIST_SORT_ORDER, value) + } + val genreSortOrder get() = sharedPreferences.getStringOrDefault( GENRE_SORT_ORDER, @@ -413,7 +497,7 @@ object PreferenceUtil { val homeAlbumGridStyle: Int get() { - val position = sharedPreferences.getStringOrDefault(HOME_ALBUM_GRID_STYLE, "0").toInt() + val position = sharedPreferences.getStringOrDefault(HOME_ALBUM_GRID_STYLE, "4").toInt() val typedArray = App.getContext().resources.obtainTypedArray(R.array.pref_home_grid_style_layout) val layoutRes = typedArray.getResourceId(position, 0) diff --git a/app/src/main/res/drawable-night/ic_launcher_background.xml b/app/src/main/res/drawable-night/ic_launcher_background.xml new file mode 100644 index 00000000..c760e263 --- /dev/null +++ b/app/src/main/res/drawable-night/ic_launcher_background.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml index da4d42d6..2417b12d 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -2,70 +2,71 @@ xmlns:aapt="http://schemas.android.com/aapt" android:width="108dp" android:height="108dp" - android:viewportWidth="921.0526" - android:viewportHeight="921.0526"> - - - - - - - - - - - - - - - - - - - - - - - - - - + android:viewportWidth="108" + android:viewportHeight="108"> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index b97f2835..d651a2a6 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -5,6 +5,6 @@ android:viewportWidth="108" android:viewportHeight="108"> diff --git a/app/src/main/res/layout/activity_lyrics.xml b/app/src/main/res/layout/activity_lyrics.xml index 3740113e..7facebba 100644 --- a/app/src/main/res/layout/activity_lyrics.xml +++ b/app/src/main/res/layout/activity_lyrics.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" + android:id="@+id/container" android:layout_height="match_parent" android:transitionName="@string/transition_lyrics"> diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 036d09bc..7353dbd1 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 036d09bc..7353dbd1 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 43bb965a936504f9bd3db60c9ad8ba31a4fdd5c6..ad35070726c01bd3486444e3c6bead58daa23516 100644 GIT binary patch delta 3320 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 GhW!tiB7t52 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index a1e8f4e0326469e8b50d6ab9e2803a5be9370c3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 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 Syp{j}00{s|MNUMnLSTZrZd14b delta 2193 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 T=)h3`015yANkvXXu0mjfBIGF1 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/app/src/main/res/mipmap-mdpi/ic_launcher_background.png deleted file mode 100644 index 41be56878fcd2bfea3e9b7a804d0f373bea5b956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8211 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 O571K6RjpRGj{F}$A5#nf diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 3b2d6ffa530229fbf3f5de8b17393dad63ab45bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1394 zcmZ`(Yg7^j7&QxWxNIgOzRI`w#LCQKrj;*5B@_h9N1Q=rx~UB-P0Lhr_{u2X??+ld zhGnIK;V`GeW#9u*N^sc2)Y?*XijP^pwjZ5yzx$nY&v)IOw${>!8VFSy+#If*L0`|IG7A>RFE{ zem2$L=&h;4xdTE2n$=Fa%Mi5LfCdE&X(}f8(FN)>+HRnuFuKM@sBC}QF)|i@>B5Ve zhl{RTWY(ek>-8Ngxw7Na;d`US-yP8~&G;Hkx&yYGg1w3VLkPW_(>V)}_g8?#vjx$n z?Q1q2A7piG2K5yeK+*)MwCq}pgU+~D3q|+yXL0Y|Vse5kHx*Ao6{A(TM@^BEVS;-^p=Rc9sILP2p=^ONaB=684m;xXsaY+ z_5e8#10U30!Z%Y!<0X@t*-{?NzJ|@5^SIEDzF7n_7a&Ly(yWr)R_7$)__yb^PL0hp zPD_>x6#0BQh@(E4Yhs5CO#fA5UQ1uYk~svUEH<@LFoYw-krt;LKNR_bc914lJVk9@sBd$D4UWsJBi09iK00nZwMY z?sRLDgURsTerT8}(=-A?wR98rb%#clO0@*O&d75XUK@5~nRf3OcxQSy-HT}Rs%xw~ zd(MLi@6GEl!Nk`ZbZyP?BVh<2em&wA+0I5kJAz(XA=0xJGzcnzcKI8YuyVwu)xx8s z#G*4PiG?Cq8Ytk6hjzd%ZCn%sX750pyF4f&m*$lZQhL`cRW}2IgD~Jix)YkNJNzgN zh0KJZtxS=TXb@Hs=M|lTv6}c9nn`HG^Wz;cjF%B2F;0=&*}eEhhtIbfj_!o$Ix7Qi zs9#JE9OHaR?p|E&5a{lM;ML0n?>|XDYiUOIznQ(TRT!Gbo?J*syjQpa`TQ+ziN(X` zB63siZta81>e;0rj&eV{1-l&kv_!ecpn*=PUPLysOEpvqvmOD6Z zdU$ayyOitNH`4OjVdf8PVw5Z@3hs=Jn7{1OwmhEC7jQEH?$!brcQ0=3$qCsN0@WFW z@+nT98*xzvt@vGcO=$-X1X`mEsG&q&M%A(ULi%{z!tkeo%dSrjM!k)!V?X0Jts8yN znuTK~Yggg{bu&F}wsddeu%>GI+9AeApmzcTgqQ~;mOYLAad=(4#UEm;%Bkw#+&E8N z?oN0;Qi1`YlDBg%=n=vQZGsBu(W++Xy1wXkA&m7VpeJ38ih=$Il68OR*Q+Yy`;`^V Y1GpW!Y508hMwhA~y#hU(j+{*U7uEcWq5uE@ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index a8008b182ec74ecfe09001526c3e455d35e63ac8..a5786f83ca909c76986fd3841e82b915e2feb86f 100644 GIT binary patch delta 2192 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 Syp{j}00{s|MNUMnLSTZrZd14b delta 2193 zcmV;C2yXYB5uFi`B!6T{L_t(|+QnLHOcYlX76q-3+WNy<`UIaS)}q#DwTKTy5k)J$ z@r9{P)o80F6r%!GDWt~4q^-snFeyrm#zriSq{Xfv&_XRj0Re?psuVGTqP%wQo}M#v zXLokl$IP^yuUT0B&f#&^+i>MSpu^TY9#~^SW^Go@nki zz8iq%iRR6X?g!Xt>rQ<=SK#=5B-$pl;|7D_SH@T+S{>dukkLJTM&D5z-gacS6QQZM z@NzhUx`Nh(1_)BM@n^13A87rpjp0h*ZnD1l{l^HR+yb;g5Co>isI3K|a_Uo#2|gQc zt^(gnaX$q?=YJ`H6Cgd4F3@Nlp2hchG={aYT>*X<0v8m63r>KxYP>JTrA7C~-!ngR8(>NKh}oZ*Olu?lcKyHo(qOICxpV(3NJI3@{1y?-7W8X7)RVsn`1QGb)=fb9<1 z*pm}E5v3&DyLWH8-8!MvJ+jVI1gy;g^m+y@tqfYNS&I#8Hn+A`ha^M{jg5`JBeb5D zSUX4uy}wl<9h=#PfX9C$z^vs0%nlV`ZioQ$7YMK*P=H0V1z7AaK(m6FT|U;Cl=%N4oVX2;Fw zy|}MU-~)pN2nrHl;ansTAixqNu=ITf%cn3{@t#CrEfGM#8;QVBB=9zakMOmo%yFF{ zr{XMBq^GA3>@W*5qo+@whAX@ejtG4Dl?0qTAAdBTgO|NOlfklS=>5qIR!(HF`dtR= z#xhv%g9L^%i11cVfEPH1u>e(7RS{;hpiE7zt*uwoXkR7}e+WU(lYj@$5g;VM96Wh{ zrPBLcKATWJ5nkE|$e8Nt>V8(lf}62GJb3V61U71tQq1j@cDApvxXEb=^%cS8qiUHz1P&%jz(vs0rGO=`Q_!xQ zfU@zE0(adQlXPV5J3)YCWFQ%pmX>~EOsVn=JbCiuq?Wu-1Y(Z}FmI7WfIySSMZNn; zUSB&_lFj;2lIJ&jn}gR%fG@|Py1F`_Y_BW18H69^W{^q<1-B zT|t0kUSD5-Cq6!YkdZ)PVd3joDE`w*;Lu^o`&7Ir6D^r3h5^|4CrOk1W_`MfOm!f#%sg*^XGkx1avyx2(1KK zkU(ObltKx(F^yvNU4a3;1*NoeoMZbOvsUeG?F5pOlYNZ@($do2!Xj3ug#b2#932Mh zA_;h?GL>Qt*gA(n<~auc{AJ&2Zhzr|u0 z6QDv?TwMG;V)hWR^QDAaQBl!$dHwC|sl#<7vCZF9#KeUgUp_?7V(@oy=T0r?!dQij zjEvp95}TG1r%#_AkG0^j+QpoBYS1nPvvMZ>KsoK0&I_4E1wJs3L0OLT-lxSJO8rSf zLc&yDfZdhL=>fPR%~ZRbCV%kfe_)`?lH$NP5XD3qgI$xYSK$3~8B`T&my?XCyu4h8 zSYI;R3dnJA?b@{+q%k!zqC$2UEAh&u0%Tn7`2CFx279JhFJ4iYb}RBVfj1yV11@*q z;>C+3A9u5DrMx|xG-=YCI7Jm|x0H!743>O=m3JY|#E*2EW-h0qtA7kWonV~=$*DA3 z{m~<(Ps~1*etv#lRyX#X(F>WGnbC9>BkrW_%tG@s21oYtT^FX$t^Sh!E!+Ke$u^0- z_{`lB$HA-c{sF>h^?XRd$n*aF`vs0-fjq23t)JMBwvWNdXspbathc?D#~?Y9LDC*` zqtD8&tJeMv#P$XOJb!oYTrYd4a(#{-JsOG|{5F29Xj@8x6tuG01){fZ_KT!mpv?2= z(WAE5*w`?_h6_&*HAjmtr>CbMqMS?9_dHJLc-l1JMhh-nxR5}Y93CyosVOWhjHc+d z+}zw0+JoZ7x|0M4&&Yw8>r)8}VN(684UY$!D)0RK{7ZZ$#D6L6YVfjbXw00PoXdz| zC}FXwdj~&o^g$bzm6de{SF0ik3M$HKUEp=`2M!v8WP{m|JU^T;h!xkFi$6#tyhw*w zBU<_KjKNhz6u`y49zJ~7nwpxLNMm*iyi!iSzP`Olhq!N8T~=0BK(j#^N4jYVT>mW{o@#?FWYodk?Nd-iNxb#-+GO*Nkp@sfX8aqtr> zQ?wW5LVcyAq#VS)$IuuwR+sz@f#+b7)T@IB4<3K&)T!v3H*f0d>+2iIgH*x!2^v^l z@{fenhN>z`r4g6#I_iV^qCQpSc~{H^AEYnZ5VTRNR)4Ju#^v}vTnwh74Dx8rg4@1Y zEI<#*=)R_=rV{0sM{TGrJ%i8s@ILxdpD{5p&*eW8L}nldLV-8h)6;WeKtOKGI{zR2ioA@t T=)h3`015yANkvXXu0mjfBIGF1 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 0fdcb0cb7d15ba50314b41bff47e231dcdaa970f..7b5aa2c9c17fb0976eb89b03ab85d2fe0328d6bd 100644 GIT binary patch literal 4613 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 literal 5189 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 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 0fdcb0cb7d15ba50314b41bff47e231dcdaa970f..7b5aa2c9c17fb0976eb89b03ab85d2fe0328d6bd 100644 GIT binary patch literal 4613 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 literal 5189 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 XmcK=JO$QQ000000NkvXXu0mjftF+^; diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png deleted file mode 100644 index a42cd921010787221017bab48718845c2ad57e91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34620 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 P`hR6!?taL6S6uqPS0OHD diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 2acd41a3d60ec82372b2cfaae5c770c3eed7cd69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5716 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 XmcK=JO$QQ000000NkvXXu0mjftF+^; diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index fda6f29e1549ce87407f6ad6f1dcbf2919b09808..a57669d6581321ec62e14476a520095a247284e8 100644 GIT binary patch literal 10135 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 KW~DkJ?0*0q_Y?{M diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png deleted file mode 100644 index 0282220d304c2b716ff629a1e46d0322b5b43819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50987 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 E0I{N6?EnA( diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index f5f397f0684054be1cf13551907cec93e288d645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8527 zcmdUUc|6qX-}gaDwk&55N)kH8(l!*LBa%d?Q)4CuV<<9%u?(_1+1Fo$GNE$XhS}_< zv5hV3Br!AA#uV92%Dz0`>HJ>Lec!L=x$pmP*ULZGe6G)SeU|s<`X>KjZ!IOREdI+c zzew3!w*2##UxX-ve=$*D=biltonL-YSFo}C{buOU{AhCaZO?mbw;lP4r_RcH#Rt>x zoGIpnRTUO46h@AF9(y1T73F9(p*d$?W?dm5Y^aZfCGKCfkUX1#IF%}+72}R-y+i$7 z*e0eC>B0M@N+xR|FL0r@dUGVOp?qZF@N`x0^36KPO^)&pFTw_FF{D0l6G9dO^!VTS z7Xz#NMfc$N^$U#`8h;TI5v)Cuf+cf8ums!x{^7sb{(tHJXEy(t{y(@o{VUH!oEvT~ z#+@CP&)hp&(5}+U$|94!>mAL;zcR-SA2oDLb`aLDteXxL85lh> zxV;=S5J8QqFNm<)T`G_{4jdLCjFDJ@t z^*{a^H!80_HOtVvk8aoqjs($2~E^Btv>SR=kF=i~WDHBhY88}Z-E$W6?5{nA4}^IH?tB|VC@|t#4$Qg^^N{Fo zmC;{`9ph6CVoL9`Vzya{S@1*CaZ-udt_PU=Fz&~Y_)Vc<6N|>+c9E*`yNy)}A__Di zeDA(eMJh)sRRV70VkZ*3{9)f5;#Q-wrEWoL$L@HupW=z9nnEUwDWL2ebMZQ4z+~X)6idB$$}#Vvr*3 zi6#k|2bQgqZct-HxQX<5|n8fD@j+#ER?I~i z7F*D}w?qda#e>o!?Q$`$tx}ky4Y33JFfVnHvzNr!1XpetJ?N)*DB>vjxu^upY}(vH0u zAijiZUrcMpfm9)`SI8!sMffFIP>jN>wI(5JUDG_3w%bL z9s5EYJ|NX{T{!r~PqFV-o}^iWX*lR1mE4w+xtR#waH37i%1vKax4VVWL~m?tanmyS znS?6Kc_^fDkEEAhqkVUxjsj6HJ{_%(&}b`}`%1xV66ld|Q!|7)gU`(u9fp}Bs~ucF zC5>I6M?El-A;Z_CEQLfIL6m9v`&1nhowQc8Q|oDRXK0S|$m{j*>C;+yMx7+4k*S&K z6AAW%d$*n&%AXo$Jw7*<+K*9^b}(@4Bccftj7w%Nw^@_uOzBM_35ntQLA|~o z>l1wLpXR$dh)?itfvh1A#U0YrX@&NhC8V-?@9-U$`rPh!sid3lQfeYc9lr@Lr@UC- zlVR&Ga=kIeVJ~LIOWh$JX=Oy(vbJo^kaSlxyp+t!Z9*?|!d=~tyA+#l8o&R}D|X1h zMn>wR@EopA3%VUO0S%o(e;wKy*|(Y-vBDi1%beGn!$%WBCH6g^zpa1i4$@fr-d8-%HY?eUtd9+)xo}3jbb?8t+R&lee-{D;6 zf`+=C{wcJdn*P%Afn_15xfM<1g}1`NHHxn%mP-@*QqIrn_&PW932b_2)Fi9X#Pyl6 zORJ|VI^TTL@#~j#tLTW2N5^;NPCUg44Troobr9hWRmNZecEPiIr+9 z(2!-y#LO1;y+xpF&L_b&a? zMn~6eA#gIQEAn2msAz=&a^F!WXh$xD?i2rj0g3QbmdcH_mCta8o4nDCT4*mN|=05jfhn_&vo1XY-(HJXRJG1-&>zHoEIZR6lZg%&)B=I ziD7L!5-ML{&%h-e!t|ot=U!8){l8>Lcn-q+oclDI2_@e&T=LYy+}0-(_yiMU3@uX6 zpZ-(!(b$y3`zP;1f-E1seR%R$BICN-+>6gCMD%eNJAL$-do1uuJ&cpH9)I|dg88W# zIbT;{(Fz@;^~$dqyR==C=+VfX+q@6OO|d>;OIORoLp7Zfm4*RU_0tcyC?2jqDbG+L zY<5Ym)wVGvcrS)<^v`WxW37aex?HK&@F23{(hzO1g@?mRPC!=}0UQ(8DSdxB{hg#h z#H%Zeo3exto{rSjnv}%=s8z|rE!gN_C3`plVkCXdu(rY-LT(~HCT+nVezonibGdoge_1(nd=_MC z926&3p^wb=G;!;~C{SyU?Z6atRFPvZbxd7tU_y&$ii-E>++dP=rTc zO^FPqvxCB}D(#0JbFjZcQ%#$B>&Cgq^Qqn;}Wm3055H4BIYbSxo#0_<6Bl zH!|3Tw2NZbSF)G(BebPai(iW&sTgr(pVZe4QR(54oIU1d^^7;-IPr zbK6SR_NzegED$+D5WvojDSb1{$w&?c-+46nDeCQvc^AR>uh5*grWz0O-vP6cg7hbMdP<<_!#;ij<^Oh?ulQ?+0FC{AF zQZ{zr{4C+@Dbu<}jb{HOfpyTv4@`?RE3g`=_HhRgFsMWVYTyXGvQH;&_UmgdEh==@ z7}5z^hto-_TMr+Q54%aE9vuh8-2jd z;YE6U6_W+x_fAG`A{y-<#=k-yd{rK3{VM!1?=lCsO5iooJe@R$9ryv4`mt8kq!MM9 zk8mx18K9X2`>Jn$zMVU0g4@}OM(NKM+T=|CXz(aadxwo9VfXRv-tSgkH@)= zFBKuc+(NnB_`Ipp578QG*US7|HFpm_cWdyyRocYuG{7QId)!487DPeHi1LdWiyrvW%^w<8=oo2rmE0M12-$fLr4xSRv zb4rSd0o@-cIH5#jOy(qj&EHlB(~P7OQI#=vB`c38I*8jUuu*^RDM>+*mSERkq#}Em zEBT>5i-~AY?YZur1tKSqBFGPD#7k)PT~LwV03tcl2hla{P1mrz(1;Q;Q95_{NvE28 z!VDH9Qso}?(lDef3BsXVVc<6M6O6?13A5j_cnns(@g+fJ)vb1u!Z=c~cG8LH6E5nT zxNz;cD|eWabNLa)g4RBuDqrY~tm$p&WPAZ`-nnr_O-cIWAC!Q+Gbrv5)g8M$RC(TL zxXezsF8-`H?Yg>%N z{osH4qvFzj)@|}wI#A|UL^06{FXrD)7NLE}Ne*+jU||S$QB=+31f&m71g0fR-MW_R zk`6px)62Y5j!OFfba-Smt~8}uV&6ngrh^qd_*&e;z{dAG6W>Q~wLEYC3xXd!&ZWIC z!*T%hcUZj*1;t&32O}PtpPEZV2cTaml0B+CPM1IHulpz)=?YdTO<-0Hsp_i$(WB9V zs6ai-e|xK@nBwoF@+4NHIT=v{q{&d0^UP(9T(bk<$U+dOBEeVAMc)zVZX04J4--dT zLPx4l{QTERFmps*=!a=_fLb4XbXt`znXls-6k zg6f$oO)N1AiC_3z z)J~|l0C^mkf`|tiyn#EoE%FFBsjWIuYc>$$r;o*_j z38>22i2fOu_pi_Dq@7>P{|#Wdk|8xUQK@f)&Q2oAo)p-83@I{vbMD^Yj?n)^Vb(vDAxz#VSD_*E#}AW9`5JmP!&V1jXVQ;uif*|8Ig41k}id zk;lMrZu(QaxDa0A=Hg|n_YE6L0t1v_Nc<|*{H#ma?dv_*8Dz*EX441vmLO?TRr0`? z1;RjpoDHF}ZzckX-la=*l~)H}-kRNPdN z{E4S~g-oinCEMPtqUUM{3*Xv42fcktO(K@m+9;XVW!orv#*3$t2M7?B~@2qkXYXb{N-<3`lGpNNob`VD>#>?l_-eDdu{$J~q+*2=E~BJm!VV+ATTixZU#`@};rh zrPkV#-)pXr-oef<5>j9x4hh(k$!yq8rr#Ejd-}*Xc`jFuu8@u$$Cv%l^Dy2!GRfDe zT(eJE6Ja-jqsWkhq_qR1Ziu<=Sd=AkT7bp^YoxU&8^kTeddLqqyuluORK$Kca0Y=^ zQB_pnfh1V-%K$9#;XD~vVz@>P`9BwwWccn`zR03@bM-!S#=c@^wX*4y^7=c)^^E*F0tu6qGxK}slaC6;mfz8zg(gBCN75Q;!S?h#t>=)iZfs@7AyomFe+mCsI zSy_>?ptWKlc0dcyj+N5nIy%V_MY%)K?MYl^brgfbb90t_Cr!h;R$zI3*8&tIVPTJ&G}wA*K0+5`Akrq=A#5m*1( zd~7Z!`cuuDVXZq&A;X%8pc^B;b(cci3E)PvE6!R#LZ(raoYx-ofvJfzq>#a51>*_u1;hx zh(jajqaU`-CX67|7##w}T0{^=7xA~nis8eECXC)nSRutTYHv?BQa|;HbNfh1w zVM~b#OA`!N{q+Sc3+OfEvylP_qD*!JXt{6SC-Z{SiJ>i>5 zyu?rqp^B6hT0nPOx(CyBc}04BfIVH3out{oDpvcxdK}U42;5BeB2)kM5rH=0TDcfh(bi?TluDZ#Up;dz(+?*Q?JB;` z+TWaDx9H+dtZ4+DwoH>*u!&+`+o=by2#X324kbnEB(wR$U|*0!T^b?~arRg8<(f+w zuv4C{c|EP4i#CJ8o*YLBNPC9?C-#;SrD5MiLSZ-KW)n6vnzL_PCus7G@u@5hxV%<- z{k++_S$pzN&Z&oXXP+ID3z4>-^~weyYJyv~Msr!HGb9uPPh-`B%W4hQBh~H|HCO{P zHhNxbg=22Rpwd1+qO6??xQ~T!XqV2Nnroj$M288PgxnKb)!N;9rS|>mRp24oQH9FX zlr?Fnns6qysw(P3>7++R%Xv&@WXIz2JCO|ey^?!M2V_mkz2mwL))q6gSUl?tRt|(u z)5S}4(9PDj&AyzyE?}feP0YGn>Z?F1n?h*#IKx<`i{3J133AV5{pZ!tkJ`b4pm?hh z>}IErz$u;q=D&W4v!_Z;40YQ|%*ofH#xom+fl3k^Q)!4Qx|S*LM+|L)R{KLnY59o3 z*Bp9Ewl7L8JntVPi3?g)-ggvG{pI5`z3JigMCWKz}pHNH0 z`VSy0Q06Nh#}N>|C zZ~0FYZ7G^_ZvErlhAm4mMZa4Y1aWGsO5W01N%SjE2A(_N=<~UjbFM^3WDO}|y*Z~S zJS&=+IHt^yU~YyB0$qWG0vZWbX5nq+ts0jOB3PLUE=#H{5X7`WwtslkGP@m6?$4;- z-A5SEk(QmM>WiWLy}!!=XKg2^{Sucl_F05>Ihk-n###HB5g`%vRYCHbEHFME9DIJ~ zi!=-)9|%;sBgni)`D+Q-r3h^d2j7j+#uQA)6;By+J6^Rb!nvC$p;FVC2DJ7ODQTIi+wgOMU zLQZnw2ilt}-C>3%A;F9{*#%22JojIz4VMk616|q(s@>eZpNUmH8puG7GMC^og7XRMDmGdBJTv#cl7KswO_e{+NK&>OD@j zuX$uSXTnVDlj`)459j%GokmS-t?X-<`I!?6hbba;NGnE8CTjse>6M!6li_sv!l;0V z`khw|N(?+pzdy-Y0RRCL|Ii0Z_(vPSYrVcS4**B>Y#I$i7=<1SfRnnb+oqUHpLeCW zii?PPJY4xCUND-bfBiIupj3S^Bt_NG@Bo&?mpvY1@Aoqu-@m(bpT8bx`U9pu(%`-B zi<% zHJ^4n0e50-wL#gmNgjwXx8bpHrK+&pt<;eE{VZQ`0X`;+-t>RIc>D;mN7!&wVh~Yb zVO3LR!>cq(W{r6abE*yZUy`GGHkiBM*-Qgo(smQMVpHDaA1L;&@XXC;MnGNhsxclV zg4M{8Aqf=o$FB9-oR*y^x*_#T)D!j~)BgLRy?aU@6yLa8YT;Mr^~3WBqE4gv3_^tO zD9?xu%1WQg>rGrLjt-!@zi|nU`lL9tUREwpDP0vW*^vthz&pH)a(0y^RdNO^8x%!7F+3OW~`DOa0Lb0B}xF9nY~Og#V_YSQ=GvlslsafLk=w zFwyq_cd1h*YJMctsxp6P=22StbO*Y9%pOg zjfcES@o@6^)}La2wc+>tQ0CjoF+#$FxPW0KC8bYCibb%f`NpT6i*pBO)&3SYe);H1 z^GRd-twC5;k`Hh%;gzn`)t`>L0eo}lRFiFEK&o*>)e#!dg$uirRW7d02dZx^X9A(M z)eXzzclFw|j4ijx6mC+14@*EFCC0D7Olklxr%M02Z~!wF;g(F4OH-CU7$}50VtueDt)7 zqHO)Pk^0u~k1ivWUxQIxuPuO6AxM1Kv(9#c5-|nabLb#RFo^m&uZI@YYpsW9F2^Uf z&oXzr$Mwg-D~kFO+^$SNhk+`YcZ&*;K+6#Hv6 z@Zk=tcc5acV}(7DHZqI0Rkf^F*_M2%j@@}5>x-cqw!GbOjdZrjf-MTab#M&J3$@=! zKDx_?uNcQTC0#&^46gE`#kq_12N@wn8QnLQmqYBPI@WD6r*iwRDM$U5yiv}KTdMO* zoBI1fBqX}@p&&DkAY*{~5eo#As9*uj8CZhte}4FHw*No$|0A3KLjND!f$jf|pY{Qr b8`+z?DXB+xXkE*h0uyYk>@7(a$iMy%=9&Ai diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index fda6f29e1549ce87407f6ad6f1dcbf2919b09808..a57669d6581321ec62e14476a520095a247284e8 100644 GIT binary patch literal 10135 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 KW~DkJ?0*0q_Y?{M diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index c5d5899f..236a57d3 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #FFFFFF + #1C1C1C \ No newline at end of file diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index e2cad59d..1020e9a0 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -16,6 +16,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7bb2c04d..4e789221 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -891,4 +891,7 @@ Import playlist It imports all playlists listed in the Android Media Store with songs, if the playlists already exists, the songs will get merged. Import + Song count + Ascending + Song count desc diff --git a/app/src/main/res/xml/pref_ui.xml b/app/src/main/res/xml/pref_ui.xml index 27cac1c8..54af8492 100644 --- a/app/src/main/res/xml/pref_ui.xml +++ b/app/src/main/res/xml/pref_ui.xml @@ -84,14 +84,14 @@