diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index 48e38cf5d..b1183b194 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -31,14 +31,18 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController import com.google.android.material.R as MR import com.google.android.material.bottomsheet.BackportBottomSheetBehavior import com.google.android.material.shape.MaterialShapeDrawable +import com.google.android.material.transition.MaterialFadeThrough import dagger.hilt.android.AndroidEntryPoint import kotlin.math.max import kotlin.math.min import org.oxycblt.auxio.databinding.FragmentMainBinding import org.oxycblt.auxio.detail.DetailViewModel +import org.oxycblt.auxio.home.HomeViewModel +import org.oxycblt.auxio.home.Outer import org.oxycblt.auxio.list.ListViewModel import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.Song @@ -53,6 +57,7 @@ import org.oxycblt.auxio.util.coordinatorLayoutBehavior import org.oxycblt.auxio.util.getAttrColorCompat import org.oxycblt.auxio.util.getDimen import org.oxycblt.auxio.util.logD +import org.oxycblt.auxio.util.navigateSafe import org.oxycblt.auxio.util.systemBarInsetsCompat import org.oxycblt.auxio.util.unlikelyToBeNull @@ -66,9 +71,10 @@ class MainFragment : ViewBindingFragment(), ViewTreeObserver.OnPreDrawListener, NavController.OnDestinationChangedListener { - private val playbackModel: PlaybackViewModel by activityViewModels() - private val listModel: ListViewModel by activityViewModels() private val detailModel: DetailViewModel by activityViewModels() + private val homeModel: HomeViewModel by activityViewModels() + private val listModel: ListViewModel by activityViewModels() + private val playbackModel: PlaybackViewModel by activityViewModels() private var sheetBackCallback: SheetBackPressedCallback? = null private var detailBackCallback: DetailBackPressedCallback? = null private var selectionBackCallback: SelectionBackPressedCallback? = null @@ -77,6 +83,12 @@ class MainFragment : private var elevationNormal = 0f private var initialNavDestinationChange = true + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enterTransition = MaterialFadeThrough() + exitTransition = MaterialFadeThrough() + } + override fun onCreateBinding(inflater: LayoutInflater) = FragmentMainBinding.inflate(inflater) override fun onBindingCreated(binding: FragmentMainBinding, savedInstanceState: Bundle?) { @@ -152,6 +164,7 @@ class MainFragment : // --- VIEWMODEL SETUP --- collectImmediately(detailModel.editedPlaylist, detailBackCallback::invalidateEnabled) + collectImmediately(homeModel.showOuter.flow, ::handleShowOuter) collectImmediately(listModel.selected, selectionBackCallback::invalidateEnabled) collectImmediately(playbackModel.song, ::updateSong) collectImmediately(playbackModel.openPanel.flow, ::handlePanel) @@ -292,6 +305,17 @@ class MainFragment : listModel.dropSelection() } + private fun handleShowOuter(outer: Outer?) { + val directions = + when (outer) { + is Outer.Settings -> MainFragmentDirections.preferences() + is Outer.About -> MainFragmentDirections.about() + null -> return + } + findNavController().navigateSafe(directions) + homeModel.showOuter.consume() + } + private fun updateSong(song: Song?) { if (song != null) { tryShowSheets() diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt index 73a122006..abd3bf15a 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt @@ -38,7 +38,6 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.appbar.AppBarLayout import com.google.android.material.tabs.TabLayoutMediator -import com.google.android.material.transition.MaterialFadeThrough import com.google.android.material.transition.MaterialSharedAxis import dagger.hilt.android.AndroidEntryPoint import java.lang.reflect.Field @@ -102,10 +101,9 @@ class HomeFragment : // Orientation change will wipe whatever transition we were using prior, which will // result in no transition when the user navigates back. Make sure we re-initialize // our transitions. - when (val id = savedInstanceState.getInt(KEY_LAST_TRANSITION_ID, -2)) { - -2 -> {} - -1 -> applyFadeTransition() - else -> applyAxisTransition(id) + val axis = savedInstanceState.getInt(KEY_LAST_TRANSITION_ID, -1) + if (axis > -1) { + applyAxisTransition(axis) } } } @@ -183,9 +181,9 @@ class HomeFragment : } override fun onSaveInstanceState(outState: Bundle) { - when (val transition = enterTransition) { - is MaterialFadeThrough -> outState.putInt(KEY_LAST_TRANSITION_ID, -1) - is MaterialSharedAxis -> outState.putInt(KEY_LAST_TRANSITION_ID, transition.axis) + val transition = enterTransition + if (transition is MaterialSharedAxis) { + outState.putInt(KEY_LAST_TRANSITION_ID, transition.axis) } super.onSaveInstanceState(outState) @@ -224,14 +222,12 @@ class HomeFragment : } R.id.action_settings -> { logD("Navigating to preferences") - applyFadeTransition() - findNavController().navigateSafe(HomeFragmentDirections.preferences()) + homeModel.showSettings() true } R.id.action_about -> { logD("Navigating to about") - applyFadeTransition() - findNavController().navigateSafe(HomeFragmentDirections.about()) + homeModel.showAbout() true } @@ -612,13 +608,6 @@ class HomeFragment : reenterTransition = MaterialSharedAxis(axis, false) } - private fun applyFadeTransition() { - enterTransition = MaterialFadeThrough() - returnTransition = MaterialFadeThrough() - exitTransition = MaterialFadeThrough() - reenterTransition = MaterialFadeThrough() - } - /** * [FragmentStateAdapter] implementation for the [HomeFragment]'s [ViewPager2] instance. * diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt index eb5efc322..ac16e2e8b 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt @@ -131,6 +131,10 @@ constructor( /** A marker for whether the user is fast-scrolling in the home view or not. */ val isFastScrolling: StateFlow = _isFastScrolling + private val _showOuter = MutableEvent() + val showOuter: Event + get() = _showOuter + init { musicRepository.addUpdateListener(this) homeSettings.registerListener(this) @@ -265,6 +269,14 @@ constructor( _isFastScrolling.value = isFastScrolling } + fun showSettings() { + _showOuter.put(Outer.Settings) + } + + fun showAbout() { + _showOuter.put(Outer.About) + } + /** * Create a list of [MusicType]s representing a simpler version of the [Tab] configuration. * @@ -274,3 +286,8 @@ constructor( private fun makeTabTypes() = homeSettings.homeTabs.filterIsInstance().map { it.type } } + +sealed interface Outer { + object Settings : Outer + object About : Outer +} diff --git a/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt b/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt index 41662f93a..d8d9b8d64 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt @@ -196,7 +196,6 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr } override fun onRoundModeChanged() { - // TODO: Make this a recreate as soon as you can make the bottom sheet stop freaking out cornerRadiusRes = getCornerRadiusRes() applyBackgroundsToChildren() val cover = currentCover ?: return diff --git a/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt b/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt index ac768b627..d135117bd 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt @@ -80,7 +80,7 @@ class SongMenuDialogFragment : MenuDialogFragment() { requireContext().showToast(R.string.lng_queue_added) } R.id.action_artist_details -> detailModel.showArtist(menu.song) - R.id.action_album_details -> detailModel.showAlbum(menu.song) + R.id.action_album_details -> detailModel.showAlbum(menu.song.album) R.id.action_share -> requireContext().share(menu.song) R.id.action_playlist_add -> musicModel.addToPlaylist(menu.song) R.id.action_detail -> detailModel.showSong(menu.song) diff --git a/app/src/main/res/anim/bottom_sheet_slide_in.xml b/app/src/main/res/anim/bottom_sheet_slide_in.xml index 4e7bad17f..e9236ec2d 100644 --- a/app/src/main/res/anim/bottom_sheet_slide_in.xml +++ b/app/src/main/res/anim/bottom_sheet_slide_in.xml @@ -2,7 +2,7 @@ - + diff --git a/app/src/main/res/anim/bottom_sheet_slide_out.xml b/app/src/main/res/anim/bottom_sheet_slide_out.xml index 59507b878..3337807ab 100644 --- a/app/src/main/res/anim/bottom_sheet_slide_out.xml +++ b/app/src/main/res/anim/bottom_sheet_slide_out.xml @@ -1,9 +1,9 @@ - - + + diff --git a/app/src/main/res/layout-w600dp-land/fragment_main.xml b/app/src/main/res/layout-w600dp-land/fragment_main.xml index e7213924f..e381eae0f 100644 --- a/app/src/main/res/layout-w600dp-land/fragment_main.xml +++ b/app/src/main/res/layout-w600dp-land/fragment_main.xml @@ -13,7 +13,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="org.oxycblt.auxio.ui.BottomSheetContentBehavior" - app:navGraph="@navigation/main" + app:navGraph="@navigation/inner" app:defaultNavHost="true" tools:layout="@layout/fragment_home" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6064ea0e4..23d23770a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,8 +3,10 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_host" - android:name="org.oxycblt.auxio.MainFragment" + android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:background="?attr/colorSurface" + app:defaultNavHost="true" + app:navGraph="@navigation/outer" tools:layout="@layout/fragment_main" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 81141391f..58259f50b 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -14,7 +14,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="org.oxycblt.auxio.ui.BottomSheetContentBehavior" - app:navGraph="@navigation/main" + app:navGraph="@navigation/inner" app:defaultNavHost="true" tools:layout="@layout/fragment_home" /> diff --git a/app/src/main/res/navigation/main.xml b/app/src/main/res/navigation/inner.xml similarity index 80% rename from app/src/main/res/navigation/main.xml rename to app/src/main/res/navigation/inner.xml index 41c4f8b92..fa9520ec3 100644 --- a/app/src/main/res/navigation/main.xml +++ b/app/src/main/res/navigation/inner.xml @@ -12,12 +12,6 @@ - - @@ -394,93 +388,4 @@ android:name="parcel" app:argType="org.oxycblt.auxio.list.Menu$ForPlaylist$Parcel" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/navigation/outer.xml b/app/src/main/res/navigation/outer.xml new file mode 100644 index 000000000..23491b998 --- /dev/null +++ b/app/src/main/res/navigation/outer.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file