diff --git a/app/build.gradle b/app/build.gradle index fbd8bd3ad..b6b12352f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: "ru.cleverpumpkin.proguard-dictionaries-generator" +apply plugin: "androidx.navigation.safeargs.kotlin" proguardDictionaries { dictionaryNames = [ @@ -111,7 +112,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.annotation:annotation:1.1.0' implementation 'androidx.preference:preference-ktx:1.1.1' - implementation 'androidx.core:core-ktx:1.3.0' + implementation 'androidx.core:core-ktx:1.3.1' implementation 'androidx.fragment:fragment-ktx:1.2.5' implementation 'androidx.palette:palette-ktx:1.0.0' @@ -168,4 +169,9 @@ dependencies { implementation "org.koin:koin-core:$koin_version" implementation "org.koin:koin-android:$koin_version" implementation "org.koin:koin-android-viewmodel:$koin_version" + + def nav_version = "2.3.0" + implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" + implementation "androidx.navigation:navigation-ui-ktx:$nav_version" + } \ No newline at end of file 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 e5c91ae70..931703ca3 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 @@ -24,9 +24,9 @@ import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.albums.AlbumsFragment import code.name.monkey.retromusic.fragments.artists.ArtistsFragment import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment +import code.name.monkey.retromusic.fragments.folder.FoldersFragment import code.name.monkey.retromusic.fragments.genres.GenresFragment import code.name.monkey.retromusic.fragments.home.BannerHomeFragment -import code.name.monkey.retromusic.fragments.mainactivity.FoldersFragment import code.name.monkey.retromusic.fragments.playlists.PlaylistsFragment import code.name.monkey.retromusic.fragments.queue.PlayingQueueFragment import code.name.monkey.retromusic.fragments.songs.SongsFragment diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt index 241d59c4b..bda70239f 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt @@ -10,7 +10,6 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager import code.name.monkey.retromusic.extensions.applyToolbar -import code.name.monkey.retromusic.fragments.settings.MainSettingsFragment import com.afollestad.materialdialogs.color.ColorChooserDialog import kotlinx.android.synthetic.main.activity_settings.* @@ -26,11 +25,6 @@ class SettingsActivity : AbsBaseActivity(), ColorChooserDialog.ColorCallback { setNavigationbarColorAuto() setLightNavigationBar(true) setupToolbar() - - if (savedInstanceState == null) { - fragmentManager.beginTransaction().replace(R.id.contentFrame, MainSettingsFragment()) - .commit() - } } private fun setupToolbar() { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsActivity.kt index 7ff9bff1d..873a35da3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsActivity.kt @@ -8,7 +8,6 @@ import android.view.Menu import android.view.MenuItem import android.view.SubMenu import android.view.View -import android.widget.ImageView import androidx.core.app.ActivityCompat import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.GridLayoutManager @@ -25,7 +24,6 @@ import code.name.monkey.retromusic.adapter.song.SimpleSongAdapter import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog import code.name.monkey.retromusic.dialogs.DeleteSongsDialog import code.name.monkey.retromusic.extensions.extraNotNull -import code.name.monkey.retromusic.extensions.ripAlpha import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.extensions.surfaceColor import code.name.monkey.retromusic.glide.AlbumGlideRequest @@ -73,7 +71,6 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder { } private lateinit var simpleSongAdapter: SimpleSongAdapter private lateinit var album: Album - private lateinit var artistImage: ImageView private var cab: MaterialCab? = null private val savedSortOrder: String get() = PreferenceUtil.albumDetailSongSortOrder @@ -101,24 +98,25 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder { setBottomBarVisibility(View.GONE) window.sharedElementsUseOverlay = true windowEnterTransition() + toolbar.setBackgroundColor(surfaceColor()) addMusicServiceEventListener(detailsViewModel) ActivityCompat.postponeEnterTransition(this) - //val viewModelFactory = AlbumDetailsViewModelFactory(application, albumId) - //viewModel = ViewModelProvider(this, viewModelFactory).get(AlbumDetailsViewModel::class.java) detailsViewModel.getAlbum().observe(this, androidx.lifecycle.Observer { ActivityCompat.startPostponedEnterTransition(this@AlbumDetailsActivity) - album(it) + showAlbum(it) }) detailsViewModel.getArtist().observe(this, androidx.lifecycle.Observer { loadArtistImage(it) }) + detailsViewModel.getMoreAlbums().observe(this, androidx.lifecycle.Observer { + moreAlbums(it) + }) detailsViewModel.getAlbumInfo().observe(this, androidx.lifecycle.Observer { aboutAlbum(it) }) setupRecyclerView() - artistImage = findViewById(R.id.artistImage) artistImage.setOnClickListener { val artistPairs = ActivityOptions.makeSceneTransitionAnimation( this, @@ -155,12 +153,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder { } } - fun complete() { - ActivityCompat.startPostponedEnterTransition(this) - } - - fun album(album: Album) { - complete() + private fun showAlbum(album: Album) { if (album.songs!!.isEmpty()) { finish() return @@ -196,7 +189,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder { detailsViewModel.loadAlbumInfo(album) } - fun moreAlbums(albums: List) { + private fun moreAlbums(albums: List) { moreTitle.show() moreRecyclerView.show() moreTitle.text = String.format(getString(R.string.label_more_from), album.artistName) @@ -211,7 +204,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder { moreRecyclerView.adapter = albumAdapter } - fun aboutAlbum(lastFmAlbum: LastFmAlbum) { + private fun aboutAlbum(lastFmAlbum: LastFmAlbum) { if (lastFmAlbum.album != null) { if (lastFmAlbum.album.wiki != null) { aboutAlbumText.show() @@ -232,7 +225,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder { } } - fun loadArtistImage(artist: Artist) { + private fun loadArtistImage(artist: Artist) { ArtistGlideRequest.Builder.from(Glide.with(this), artist) .generatePalette(this) .build() @@ -260,15 +253,17 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder { } private fun setColors(color: MediaNotificationProcessor) { - val buttonColor = if (PreferenceUtil.isAdaptiveColor) - color.backgroundColor.ripAlpha() - else - ATHUtil.resolveColor(this, R.attr.colorSurface) + MaterialUtil.tintColor( + button = shuffleAction, + textColor = color.primaryTextColor, + backgroundColor = color.backgroundColor + ) + MaterialUtil.tintColor( + button = playAction, + textColor = color.primaryTextColor, + backgroundColor = color.backgroundColor + ) - MaterialUtil.setTint(button = shuffleAction, color = buttonColor) - MaterialUtil.setTint(button = playAction, color = buttonColor) - - toolbar.setBackgroundColor(surfaceColor()) setSupportActionBar(toolbar) supportActionBar?.title = null } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModel.kt index 38bde635d..2a9d83595 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModel.kt @@ -7,8 +7,8 @@ import androidx.lifecycle.viewModelScope import code.name.monkey.retromusic.interfaces.MusicServiceEventListener import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Artist -import code.name.monkey.retromusic.providers.RepositoryImpl import code.name.monkey.retromusic.network.model.LastFmAlbum +import code.name.monkey.retromusic.providers.RepositoryImpl import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async @@ -22,10 +22,12 @@ class AlbumDetailsViewModel( private val _album = MutableLiveData() private val _artist = MutableLiveData() private val _lastFmAlbum = MutableLiveData() + private val _moreAlbums = MutableLiveData>() fun getAlbum(): LiveData = _album fun getArtist(): LiveData = _artist fun getAlbumInfo(): LiveData = _lastFmAlbum + fun getMoreAlbums(): LiveData> = _moreAlbums; init { loadAlbumDetails() @@ -44,6 +46,10 @@ class AlbumDetailsViewModel( fun loadArtist(artistId: Int) = viewModelScope.launch(Dispatchers.IO) { val artist = repository.artistById(artistId) _artist.postValue(artist) + + artist.albums?.filter { item -> item.id != albumId }?.let { albums -> + if (albums.isNotEmpty()) _moreAlbums.postValue(albums) + } } private val loadAlbumAsync: Deferred diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/artists/ArtistDetailActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/artists/ArtistDetailActivity.kt index 8848be8ec..4eb8cd512 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/artists/ArtistDetailActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/artists/ArtistDetailActivity.kt @@ -22,7 +22,6 @@ import code.name.monkey.retromusic.adapter.album.HorizontalAlbumAdapter import code.name.monkey.retromusic.adapter.song.SimpleSongAdapter import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog import code.name.monkey.retromusic.extensions.extraNotNull -import code.name.monkey.retromusic.extensions.ripAlpha import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.extensions.surfaceColor import code.name.monkey.retromusic.glide.ArtistGlideRequest @@ -31,7 +30,10 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.CabHolder import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.network.model.LastFmArtist -import code.name.monkey.retromusic.util.* +import code.name.monkey.retromusic.util.CustomArtistImageUtil +import code.name.monkey.retromusic.util.MusicUtil +import code.name.monkey.retromusic.util.RetroColorUtil +import code.name.monkey.retromusic.util.RetroUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.afollestad.materialcab.MaterialCab import com.bumptech.glide.Glide @@ -95,8 +97,11 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder { setBottomBarVisibility(View.GONE) window.sharedElementsUseOverlay = true windowEnterTransition() - ActivityCompat.postponeEnterTransition(this) + toolbar.setBackgroundColor(surfaceColor()) + addMusicServiceEventListener(detailsViewModel) + + ActivityCompat.postponeEnterTransition(this) detailsViewModel.getArtist().observe(this, androidx.lifecycle.Observer { ActivityCompat.startPostponedEnterTransition(this@ArtistDetailActivity) artist(it) @@ -150,18 +155,12 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder { } } - fun complete() { - ActivityCompat.startPostponedEnterTransition(this) - } - fun artist(artist: Artist) { - complete() - if (artist.songCount <= 0) { + if (artist.songs.isEmpty()) { finish() } this.artist = artist - loadArtistImage() - + loadArtistImage(artist) if (RetroUtil.isAllowedToDownloadMetadata(this)) { loadBiography(artist.name) } @@ -186,7 +185,7 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder { songTitle.text = songText albumTitle.text = albumText songAdapter.swapDataSet(artist.songs) - albumAdapter.swapDataSet(artist.albums!!) + artist.albums?.let { albumAdapter.swapDataSet(it) } } private fun loadBiography( @@ -198,7 +197,7 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder { detailsViewModel.loadBiography(name, lang, null) } - fun artistInfo(lastFmArtist: LastFmArtist?) { + private fun artistInfo(lastFmArtist: LastFmArtist?) { if (lastFmArtist != null && lastFmArtist.artist != null) { val bioContent = lastFmArtist.artist.bio.content if (bioContent != null && bioContent.trim { it <= ' ' }.isNotEmpty()) { @@ -211,7 +210,6 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder { listenersLabel.show() scrobbles.show() scrobblesLabel.show() - listeners.text = RetroUtil.formatValue(lastFmArtist.artist.stats.listeners.toFloat()) scrobbles.text = @@ -228,8 +226,9 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder { private var lang: String? = null - private fun loadArtistImage() { - ArtistGlideRequest.Builder.from(Glide.with(this), artist).generatePalette(this).build() + private fun loadArtistImage(artist: Artist) { + ArtistGlideRequest.Builder.from(Glide.with(this), artist) + .generatePalette(this).build() .dontAnimate().into(object : RetroMusicColoredTarget(image) { override fun onColorReady(colors: MediaNotificationProcessor) { setColors(colors) @@ -238,16 +237,16 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder { } private fun setColors(color: MediaNotificationProcessor) { - val buttonColor = if (PreferenceUtil.isAdaptiveColor) - color.backgroundColor.ripAlpha() - else - ATHUtil.resolveColor(this, R.attr.colorSurface) - - MaterialUtil.setTint(button = shuffleAction, color = buttonColor) - MaterialUtil.setTint(button = playAction, color = buttonColor) - - - toolbar.setBackgroundColor(surfaceColor()) + MaterialUtil.tintColor( + button = shuffleAction, + textColor = color.primaryTextColor, + backgroundColor = color.backgroundColor + ) + MaterialUtil.tintColor( + button = playAction, + textColor = color.primaryTextColor, + backgroundColor = color.backgroundColor + ) setSupportActionBar(toolbar) supportActionBar?.title = null } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt index 3841fd9eb..a8ae9ce31 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt @@ -3,7 +3,6 @@ package code.name.monkey.retromusic.adapter.album import android.app.ActivityOptions import android.content.res.ColorStateList import android.content.res.Resources -import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.MenuItem import android.view.View @@ -106,10 +105,6 @@ open class AlbumAdapter( .generatePalette(activity) .build() .into(object : RetroMusicColoredTarget(holder.image!!) { - override fun onLoadCleared(placeholder: Drawable?) { - super.onLoadCleared(placeholder) - //setColors(defaultFooterColor, holder) - } override fun onColorReady(colors: MediaNotificationProcessor) { setColors(colors, holder) 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 b2c844e62..987e98e86 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 @@ -7,6 +7,7 @@ import android.view.ViewGroup import android.widget.ImageView 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.fragments.AlbumCoverStyle import code.name.monkey.retromusic.fragments.NowPlayingScreen.* @@ -21,7 +22,6 @@ import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.bumptech.glide.Glide import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -68,7 +68,7 @@ class AlbumCoverPagerAdapter( class AlbumCoverFragment : Fragment() { - lateinit var albumCover: ImageView + private lateinit var albumCover: ImageView private var isColorReady: Boolean = false private lateinit var color: MediaNotificationProcessor private lateinit var song: Song @@ -96,7 +96,7 @@ class AlbumCoverPagerAdapter( } private fun showLyricsDialog() { - GlobalScope.launch(Dispatchers.IO) { + lifecycleScope.launch(Dispatchers.IO) { val data = MusicUtil.getLyrics(song) withContext(Dispatchers.Main) { MaterialAlertDialogBuilder( @@ -116,7 +116,7 @@ class AlbumCoverPagerAdapter( private fun getLayoutWithPlayerTheme(): Int { return when (PreferenceUtil.nowPlayingScreen) { - Card, Fit, Tiny, Classic, Peak, Gradient, Full -> R.layout.fragment_album_full_cover + Card, Peak, Fit, Tiny, Classic, Gradient, Full -> R.layout.fragment_album_full_cover else -> { if (PreferenceUtil.isCarouselEffect) { R.layout.fragment_album_carousel_cover diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/FragmentExt.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/FragmentExt.kt index 311b944d0..4a0dc22f5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/FragmentExt.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/FragmentExt.kt @@ -4,7 +4,10 @@ import android.content.Context import android.content.res.Configuration import android.os.PowerManager import androidx.annotation.IntegerRes +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.navigation.fragment.NavHostFragment import code.name.monkey.retromusic.util.PreferenceUtil fun Fragment.getIntRes(@IntegerRes int: Int): Int { @@ -36,4 +39,17 @@ inline fun Fragment.extra(key: String, default: T? = null) = l inline fun Fragment.extraNotNull(key: String, default: T? = null) = lazy { val value = arguments?.get(key) requireNotNull(if (value is T) value else default) { key } -} \ No newline at end of file +} + +val NavHostFragment.currentFragment: Fragment? + get() = targetFragment + +val FragmentManager.currentNavigationFragment: Fragment? + get() = primaryNavigationFragment?.childFragmentManager?.fragments?.first() + +fun AppCompatActivity.currentFragment(navHostId: Int): Fragment? { + val navHostFragment: NavHostFragment = + supportFragmentManager.findFragmentById(navHostId) as NavHostFragment + navHostFragment.targetFragment + return navHostFragment?.childFragmentManager?.fragments?.first() +} 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 9ffa6af53..73a71dd09 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 @@ -24,13 +24,15 @@ class LibraryViewModel( private val _playlist = MutableLiveData>() private val _genre = MutableLiveData>() private val _homeSections = MutableLiveData>() + private val _paletteColor = MutableLiveData() - fun homeSections(): LiveData> = _homeSections - fun allAlbums(): LiveData> = _albums - fun allSongs(): LiveData> = _songs - fun allArtists(): LiveData> = _artists - fun allPlaylisits(): LiveData> = _playlist - fun allGenres(): LiveData> = _genre + val paletteColor: LiveData = _paletteColor + val homeSections: LiveData> = _homeSections + val allAlbums: LiveData> = _albums + val allSongs: LiveData> = _songs + val allArtists: LiveData> = _artists + val allPlaylisits: LiveData> = _playlist + val allGenres: LiveData> = _genre init { viewModelScope.launch { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt index 47d3fd522..425f3fe9d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt @@ -17,7 +17,7 @@ class AlbumsFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mainActivity.libraryViewModel.allAlbums() + mainActivity.libraryViewModel.allAlbums .observe(viewLifecycleOwner, Observer { albums -> if (albums.isNotEmpty()) adapter?.swapDataSet(albums) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt index 9b308bbbb..48944baba 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt @@ -16,8 +16,8 @@ class ArtistsFragment : MainActivityFragmentCallbacks { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mainActivity.libraryViewModel.allArtists().observe( - viewLifecycleOwner, Observer { artists -> + mainActivity.libraryViewModel.allArtists + .observe(viewLifecycleOwner, Observer { artists -> if (artists.isNotEmpty()) { adapter?.swapDataSet(artists) } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java similarity index 99% rename from app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java rename to app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java index a430edd1d..0df60de03 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java @@ -12,7 +12,7 @@ * See the GNU General Public License for more details. */ -package code.name.monkey.retromusic.fragments.mainactivity; +package code.name.monkey.retromusic.fragments.folder; import android.app.Dialog; import android.content.Context; diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt index 8767ff7a2..c696b28c5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt @@ -28,8 +28,8 @@ class GenresFragment : AbsLibraryPagerRecyclerViewFragment + mainActivity.libraryViewModel.allGenres + .observe(viewLifecycleOwner, Observer { genres -> if (genres.isNotEmpty()) { adapter?.swapDataSet(genres) } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/BannerHomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/BannerHomeFragment.kt index 1a67cbd93..16b2d1323 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/BannerHomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/BannerHomeFragment.kt @@ -112,7 +112,7 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba adapter = homeAdapter } - mainActivity.libraryViewModel.homeSections() + mainActivity.libraryViewModel.homeSections .observe(viewLifecycleOwner, Observer { sections -> homeAdapter.swapData(sections) }) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/main/MainFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/main/MainFragment.kt new file mode 100644 index 000000000..8bfe48608 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/main/MainFragment.kt @@ -0,0 +1,18 @@ +package code.name.monkey.retromusic.fragments.main + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment + +class MainFragment : AbsMusicServiceFragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_main, container, false) + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/MainPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/MainPlayerFragment.kt new file mode 100644 index 000000000..e9ba68684 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/MainPlayerFragment.kt @@ -0,0 +1,16 @@ +package code.name.monkey.retromusic.fragments.player + +import android.os.Bundle +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.util.PreferenceUtil + +class MainPlayerFragment : Fragment(R.layout.fragment_main_player) { + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + when (PreferenceUtil.nowPlayingScreen) { + else -> findNavController().navigate(R.id.action_mainPlayerFragment_to_adaptiveFragment) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt index 7a2c42499..13ef1ffd8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt @@ -50,7 +50,7 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(), ViewPager.OnPageChan val metrics = resources.displayMetrics val ratio = metrics.heightPixels.toFloat() / metrics.widthPixels.toFloat() - if (nps == Full || nps == Classic || nps == Fit || nps == Gradient) { + if (nps == Full || nps == Classic || nps == Fit || nps == Gradient || nps == Peak) { viewPager.offscreenPageLimit = 2 } else if (PreferenceUtil.isCarouselEffect) { viewPager.clipToPadding = false 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 962e3200d..345651ad2 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,7 +18,7 @@ class PlaylistsFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mainActivity.libraryViewModel.allPlaylisits() + mainActivity.libraryViewModel.allPlaylisits .observe(viewLifecycleOwner, Observer { playlists -> if (playlists.isNotEmpty()) { adapter?.swapDataSet(playlists) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt index 2a690c087..5095de933 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt @@ -21,6 +21,7 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.StringRes import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R @@ -33,29 +34,14 @@ import kotlinx.android.synthetic.main.fragment_main_settings.* class MainSettingsFragment : Fragment(), View.OnClickListener { override fun onClick(view: View) { when (view.id) { - R.id.generalSettings -> inflateFragment( - ThemeSettingsFragment(), - R.string.general_settings_title - ) - R.id.audioSettings -> inflateFragment(AudioSettings(), R.string.pref_header_audio) - R.id.nowPlayingSettings -> inflateFragment( - NowPlayingSettingsFragment(), - R.string.now_playing - ) - R.id.personalizeSettings -> inflateFragment( - PersonalizeSettingsFragment(), - R.string.personalize - ) - R.id.imageSettings -> inflateFragment( - ImageSettingFragment(), - R.string.pref_header_images - ) - R.id.notificationSettings -> inflateFragment( - NotificationSettingsFragment(), - R.string.notification - ) - R.id.otherSettings -> inflateFragment(OtherSettingsFragment(), R.string.others) + R.id.generalSettings -> findNavController().navigate(R.id.action_mainSettingsFragment_to_themeSettingsFragment) + R.id.audioSettings -> findNavController().navigate(R.id.action_mainSettingsFragment_to_audioSettings) + R.id.personalizeSettings -> findNavController().navigate(R.id.action_mainSettingsFragment_to_personalizeSettingsFragment) + R.id.imageSettings -> findNavController().navigate(R.id.action_mainSettingsFragment_to_imageSettingFragment) + R.id.notificationSettings -> findNavController().navigate(R.id.action_mainSettingsFragment_to_notificationSettingsFragment) + R.id.otherSettings -> findNavController().navigate(R.id.action_mainSettingsFragment_to_otherSettingsFragment) R.id.aboutSettings -> NavigationUtil.goToAbout(requireActivity()) + R.id.nowPlayingSettings -> findNavController().navigate(R.id.action_mainSettingsFragment_to_nowPlayingSettingsFragment) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt index 38f16a578..5d0fe3166 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt @@ -3,6 +3,7 @@ package code.name.monkey.retromusic.fragments.songs import android.os.Bundle import android.view.View import androidx.annotation.LayoutRes +import androidx.lifecycle.Observer import androidx.recyclerview.widget.GridLayoutManager import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.song.ShuffleButtonSongAdapter @@ -17,8 +18,8 @@ class SongsFragment : MainActivityFragmentCallbacks { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mainActivity.libraryViewModel.allSongs() - .observe(viewLifecycleOwner, androidx.lifecycle.Observer { + mainActivity.libraryViewModel.allSongs + .observe(viewLifecycleOwner, Observer { if (it.isNotEmpty()) { adapter?.swapDataSet(it) } else { @@ -73,7 +74,7 @@ class SongsFragment : override fun setGridSize(gridSize: Int) { adapter?.notifyDataSetChanged() } - + override fun loadSortOrder(): String { return PreferenceUtil.songSortOrder } 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 62971fae9..56ac1afdd 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 @@ -170,6 +170,7 @@ public class MusicService extends Service implements private AppWidgetSmall appWidgetSmall = AppWidgetSmall.Companion.getInstance(); private AppWidgetText appWidgetText = AppWidgetText.Companion.getInstance(); + private final BroadcastReceiver widgetIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { 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 2b4b5c9e3..86ed7e750 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 @@ -13,7 +13,7 @@ import code.name.monkey.retromusic.extensions.getIntRes import code.name.monkey.retromusic.extensions.getStringOrDefault import code.name.monkey.retromusic.fragments.AlbumCoverStyle import code.name.monkey.retromusic.fragments.NowPlayingScreen -import code.name.monkey.retromusic.fragments.mainactivity.FoldersFragment +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.* diff --git a/app/src/main/res/anim/retro_fragment_close_enter.xml b/app/src/main/res/anim/retro_fragment_close_enter.xml new file mode 100644 index 000000000..72ea35a8d --- /dev/null +++ b/app/src/main/res/anim/retro_fragment_close_enter.xml @@ -0,0 +1,40 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/retro_fragment_close_exit.xml b/app/src/main/res/anim/retro_fragment_close_exit.xml new file mode 100644 index 000000000..164efc950 --- /dev/null +++ b/app/src/main/res/anim/retro_fragment_close_exit.xml @@ -0,0 +1,41 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/retro_fragment_fade_enter.xml b/app/src/main/res/anim/retro_fragment_fade_enter.xml new file mode 100644 index 000000000..939f446c4 --- /dev/null +++ b/app/src/main/res/anim/retro_fragment_fade_enter.xml @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/retro_fragment_fade_exit.xml b/app/src/main/res/anim/retro_fragment_fade_exit.xml new file mode 100644 index 000000000..3b4d7ae8a --- /dev/null +++ b/app/src/main/res/anim/retro_fragment_fade_exit.xml @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/retro_fragment_fast_out_extra_slow_in.xml b/app/src/main/res/anim/retro_fragment_fast_out_extra_slow_in.xml new file mode 100644 index 000000000..c3baa5df6 --- /dev/null +++ b/app/src/main/res/anim/retro_fragment_fast_out_extra_slow_in.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/anim/retro_fragment_open_enter.xml b/app/src/main/res/anim/retro_fragment_open_enter.xml new file mode 100644 index 000000000..648ca0840 --- /dev/null +++ b/app/src/main/res/anim/retro_fragment_open_enter.xml @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/retro_fragment_open_exit.xml b/app/src/main/res/anim/retro_fragment_open_exit.xml new file mode 100644 index 000000000..3727f66f7 --- /dev/null +++ b/app/src/main/res/anim/retro_fragment_open_exit.xml @@ -0,0 +1,41 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index ec83f3e5c..4e115feb5 100755 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -23,10 +23,13 @@ android:layout_height="wrap_content" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"> - + android:layout_height="wrap_content" + app:defaultNavHost="true" + app:navGraph="@navigation/settings_graph" /> + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main_player.xml b/app/src/main/res/layout/fragment_main_player.xml new file mode 100644 index 000000000..61a4490a4 --- /dev/null +++ b/app/src/main/res/layout/fragment_main_player.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sliding_music_panel_layout.xml b/app/src/main/res/layout/sliding_music_panel_layout.xml index 8dad22c22..b0c54814c 100644 --- a/app/src/main/res/layout/sliding_music_panel_layout.xml +++ b/app/src/main/res/layout/sliding_music_panel_layout.xml @@ -28,12 +28,12 @@ app:behavior_peekHeight="0dp" app:layout_behavior="code.name.monkey.retromusic.RetroBottomSheetBehavior"> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/retro_graph.xml b/app/src/main/res/navigation/retro_graph.xml new file mode 100644 index 000000000..3900d7fe9 --- /dev/null +++ b/app/src/main/res/navigation/retro_graph.xml @@ -0,0 +1,33 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/settings_graph.xml b/app/src/main/res/navigation/settings_graph.xml new file mode 100644 index 000000000..4adf4506e --- /dev/null +++ b/app/src/main/res/navigation/settings_graph.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt index 4eca6ea19..dae1401b0 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt @@ -1,6 +1,7 @@ package code.name.monkey.appthemehelper.util import android.content.res.ColorStateList +import android.graphics.Color import code.name.monkey.appthemehelper.ThemeStore import com.google.android.material.button.MaterialButton import com.google.android.material.textfield.TextInputLayout @@ -36,6 +37,20 @@ object MaterialUtil { } } + @JvmOverloads + @JvmStatic + fun tintColor( + button: MaterialButton, + textColor: Int = Color.WHITE, + backgroundColor: Int = Color.BLACK + ) { + val backgroundColorStateList = ColorStateList.valueOf(backgroundColor) + val textColorColorStateList = ColorStateList.valueOf(textColor) + button.backgroundTintList = backgroundColorStateList + button.setTextColor(textColorColorStateList) + button.iconTint = textColorColorStateList + } + @JvmOverloads @JvmStatic fun setTint(textInputLayout: TextInputLayout, background: Boolean = true) { diff --git a/build.gradle b/build.gradle index aba171eaa..a4cb3bb6b 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,8 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.android.tools.build:bundletool:0.9.0' classpath "gradle.plugin.ru.cleverpumpkin.proguard-dictionaries-generator:plugin:1.0.8" + def nav_version = "2.3.0" + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" } }