From 90843918d6a4f701965fdc4f6791c61a0b695466 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Fri, 20 Jan 2023 18:38:10 -0700 Subject: [PATCH] settings: use manual nav graph Manually use our own navigation graph in the new settings view. This avoids a crash that occurs with the default preferences navigation (on some devices) where the differing app IDs between debug and release makes it so that the fragments cannot be found. Because you know. Android. --- app/build.gradle | 4 +- .../{ui => }/BasePreferenceFragment.kt | 15 ++--- .../{ui => }/RootPreferenceFragment.kt | 33 ++++++++++- .../auxio/settings/SettingsFragment.kt | 42 ------------- .../AudioPreferenceFragment.kt | 7 ++- .../MusicPreferenceFragment.kt | 7 ++- .../PersonalizePreferenceFragment.kt | 7 ++- .../UIPreferenceFragment.kt | 7 ++- .../ui/PreferenceHeaderItemDecoration.kt | 2 + app/src/main/res/layout/fragment_settings.xml | 19 ------ app/src/main/res/navigation/nav_main.xml | 59 +++++++++++++++---- app/src/main/res/values/settings.xml | 5 ++ app/src/main/res/xml/preferences_root.xml | 8 +-- 13 files changed, 113 insertions(+), 102 deletions(-) rename app/src/main/java/org/oxycblt/auxio/settings/{ui => }/BasePreferenceFragment.kt (92%) rename app/src/main/java/org/oxycblt/auxio/settings/{ui => }/RootPreferenceFragment.kt (72%) delete mode 100644 app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt rename app/src/main/java/org/oxycblt/auxio/settings/{ui => categories}/AudioPreferenceFragment.kt (81%) rename app/src/main/java/org/oxycblt/auxio/settings/{ui => categories}/MusicPreferenceFragment.kt (85%) rename app/src/main/java/org/oxycblt/auxio/settings/{ui => categories}/PersonalizePreferenceFragment.kt (81%) rename app/src/main/java/org/oxycblt/auxio/settings/{ui => categories}/UIPreferenceFragment.kt (89%) delete mode 100644 app/src/main/res/layout/fragment_settings.xml diff --git a/app/build.gradle b/app/build.gradle index 59515810f..d358f6d77 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -34,8 +34,8 @@ android { buildTypes { debug { - applicationIdSuffix = ".debug" - versionNameSuffix = "-DEBUG" + applicationIdSuffix ".debug" + versionNameSuffix "-DEBUG" } release { diff --git a/app/src/main/java/org/oxycblt/auxio/settings/ui/BasePreferenceFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/BasePreferenceFragment.kt similarity index 92% rename from app/src/main/java/org/oxycblt/auxio/settings/ui/BasePreferenceFragment.kt rename to app/src/main/java/org/oxycblt/auxio/settings/BasePreferenceFragment.kt index bc0273e72..547c245e3 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/ui/BasePreferenceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/BasePreferenceFragment.kt @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.settings.ui +package org.oxycblt.auxio.settings import android.os.Bundle import android.view.LayoutInflater @@ -32,6 +32,10 @@ import androidx.preference.children import com.google.android.material.appbar.AppBarLayout import com.google.android.material.transition.MaterialSharedAxis import org.oxycblt.auxio.R +import org.oxycblt.auxio.settings.ui.IntListPreference +import org.oxycblt.auxio.settings.ui.IntListPreferenceDialog +import org.oxycblt.auxio.settings.ui.PreferenceHeaderItemDecoration +import org.oxycblt.auxio.settings.ui.WrappedDialogPreference import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.systemBarInsetsCompat @@ -68,14 +72,7 @@ abstract class BasePreferenceFragment(@XmlRes private val screen: Int) : androidx.preference.R.id.recycler_view view.findViewById(R.id.preferences_toolbar).apply { title = preferenceScreen.title - setNavigationOnClickListener { - val fragmentManager = @Suppress("Deprecation") fragmentManager - if (fragmentManager == null || fragmentManager.backStackEntryCount == 0) { - findNavController().navigateUp() - } else { - fragmentManager.popBackStack() - } - } + setNavigationOnClickListener { findNavController().navigateUp() } } preferenceManager.onDisplayPreferenceDialogListener = this diff --git a/app/src/main/java/org/oxycblt/auxio/settings/ui/RootPreferenceFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/RootPreferenceFragment.kt similarity index 72% rename from app/src/main/java/org/oxycblt/auxio/settings/ui/RootPreferenceFragment.kt rename to app/src/main/java/org/oxycblt/auxio/settings/RootPreferenceFragment.kt index 2856d26b5..4bb3acecb 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/ui/RootPreferenceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/RootPreferenceFragment.kt @@ -15,16 +15,19 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.settings.ui +package org.oxycblt.auxio.settings +import android.os.Bundle import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import com.google.android.material.transition.MaterialFadeThrough +import com.google.android.material.transition.MaterialSharedAxis import org.oxycblt.auxio.R import org.oxycblt.auxio.music.MusicViewModel import org.oxycblt.auxio.playback.PlaybackViewModel -import org.oxycblt.auxio.settings.SettingsFragmentDirections +import org.oxycblt.auxio.settings.ui.WrappedDialogPreference import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.showToast @@ -36,9 +39,18 @@ class RootPreferenceFragment : BasePreferenceFragment(R.xml.preferences_root) { private val playbackModel: PlaybackViewModel by androidActivityViewModels() private val musicModel: MusicViewModel by activityViewModels() + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + enterTransition = MaterialFadeThrough() + returnTransition = MaterialFadeThrough() + exitTransition = MaterialFadeThrough() + reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) + } + override fun onOpenDialogPreference(preference: WrappedDialogPreference) { if (preference.key == getString(R.string.set_key_music_dirs)) { - findNavController().navigate(SettingsFragmentDirections.goToMusicDirsDialog()) + findNavController().navigate(RootPreferenceFragmentDirections.goToMusicDirsDialog()) } } @@ -47,6 +59,21 @@ class RootPreferenceFragment : BasePreferenceFragment(R.xml.preferences_root) { // TODO: These seem like good things to put into a side navigation view, if I choose to // do one. when (preference.key) { + getString(R.string.set_key_ui) -> { + findNavController().navigate(RootPreferenceFragmentDirections.goToUiPreferences()) + } + getString(R.string.set_key_personalize) -> { + findNavController() + .navigate(RootPreferenceFragmentDirections.goToPersonalizePreferences()) + } + getString(R.string.set_key_music) -> { + findNavController() + .navigate(RootPreferenceFragmentDirections.goToMusicPreferences()) + } + getString(R.string.set_key_audio) -> { + findNavController() + .navigate(RootPreferenceFragmentDirections.goToAudioPreferences()) + } getString(R.string.set_key_reindex) -> musicModel.refresh() getString(R.string.set_key_rescan) -> musicModel.rescan() getString(R.string.set_key_save_state) -> { diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt deleted file mode 100644 index 7e585e731..000000000 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2021 Auxio Project - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.oxycblt.auxio.settings - -import android.os.Bundle -import android.view.LayoutInflater -import androidx.fragment.app.Fragment -import com.google.android.material.transition.MaterialFadeThrough -import org.oxycblt.auxio.databinding.FragmentSettingsBinding -import org.oxycblt.auxio.ui.ViewBindingFragment - -/** - * A [Fragment] wrapper wrapping the preference navigation flow. - * @author Alexander Capehart (OxygenCobalt) - */ -class SettingsFragment : ViewBindingFragment() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enterTransition = MaterialFadeThrough() - exitTransition = MaterialFadeThrough() - } - - override fun onCreateBinding(inflater: LayoutInflater) = - FragmentSettingsBinding.inflate(inflater) - - override fun onBindingCreated(binding: FragmentSettingsBinding, savedInstanceState: Bundle?) {} -} diff --git a/app/src/main/java/org/oxycblt/auxio/settings/ui/AudioPreferenceFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/categories/AudioPreferenceFragment.kt similarity index 81% rename from app/src/main/java/org/oxycblt/auxio/settings/ui/AudioPreferenceFragment.kt rename to app/src/main/java/org/oxycblt/auxio/settings/categories/AudioPreferenceFragment.kt index c9fd9f8f2..52506caf5 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/ui/AudioPreferenceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/categories/AudioPreferenceFragment.kt @@ -15,11 +15,12 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.settings.ui +package org.oxycblt.auxio.settings.categories import androidx.navigation.fragment.findNavController import org.oxycblt.auxio.R -import org.oxycblt.auxio.settings.SettingsFragmentDirections +import org.oxycblt.auxio.settings.BasePreferenceFragment +import org.oxycblt.auxio.settings.ui.WrappedDialogPreference /** * Audio settings interface. @@ -29,7 +30,7 @@ class AudioPreferenceFragment : BasePreferenceFragment(R.xml.preferences_audio) override fun onOpenDialogPreference(preference: WrappedDialogPreference) { if (preference.key == getString(R.string.set_key_pre_amp)) { - findNavController().navigate(SettingsFragmentDirections.goToPreAmpDialog()) + findNavController().navigate(AudioPreferenceFragmentDirections.goToPreAmpDialog()) } } } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/ui/MusicPreferenceFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/categories/MusicPreferenceFragment.kt similarity index 85% rename from app/src/main/java/org/oxycblt/auxio/settings/ui/MusicPreferenceFragment.kt rename to app/src/main/java/org/oxycblt/auxio/settings/categories/MusicPreferenceFragment.kt index c963363bc..b38177d1e 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/ui/MusicPreferenceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/categories/MusicPreferenceFragment.kt @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.settings.ui +package org.oxycblt.auxio.settings.categories import androidx.navigation.fragment.findNavController import androidx.preference.Preference import coil.Coil import org.oxycblt.auxio.R -import org.oxycblt.auxio.settings.SettingsFragmentDirections +import org.oxycblt.auxio.settings.BasePreferenceFragment +import org.oxycblt.auxio.settings.ui.WrappedDialogPreference /** * "Content" settings. @@ -30,7 +31,7 @@ import org.oxycblt.auxio.settings.SettingsFragmentDirections class MusicPreferenceFragment : BasePreferenceFragment(R.xml.preferences_music) { override fun onOpenDialogPreference(preference: WrappedDialogPreference) { if (preference.key == getString(R.string.set_key_separators)) { - findNavController().navigate(SettingsFragmentDirections.goToSeparatorsDialog()) + findNavController().navigate(MusicPreferenceFragmentDirections.goToSeparatorsDialog()) } } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/ui/PersonalizePreferenceFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/categories/PersonalizePreferenceFragment.kt similarity index 81% rename from app/src/main/java/org/oxycblt/auxio/settings/ui/PersonalizePreferenceFragment.kt rename to app/src/main/java/org/oxycblt/auxio/settings/categories/PersonalizePreferenceFragment.kt index 2a708fb33..73c5147ec 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/ui/PersonalizePreferenceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/categories/PersonalizePreferenceFragment.kt @@ -15,11 +15,12 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.settings.ui +package org.oxycblt.auxio.settings.categories import androidx.navigation.fragment.findNavController import org.oxycblt.auxio.R -import org.oxycblt.auxio.settings.SettingsFragmentDirections +import org.oxycblt.auxio.settings.BasePreferenceFragment +import org.oxycblt.auxio.settings.ui.WrappedDialogPreference /** * Personalization settings interface. @@ -28,7 +29,7 @@ import org.oxycblt.auxio.settings.SettingsFragmentDirections class PersonalizePreferenceFragment : BasePreferenceFragment(R.xml.preferences_personalize) { override fun onOpenDialogPreference(preference: WrappedDialogPreference) { if (preference.key == getString(R.string.set_key_home_tabs)) { - findNavController().navigate(SettingsFragmentDirections.goToTabDialog()) + findNavController().navigate(PersonalizePreferenceFragmentDirections.goToTabDialog()) } } } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/ui/UIPreferenceFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/categories/UIPreferenceFragment.kt similarity index 89% rename from app/src/main/java/org/oxycblt/auxio/settings/ui/UIPreferenceFragment.kt rename to app/src/main/java/org/oxycblt/auxio/settings/categories/UIPreferenceFragment.kt index ccfd5c48e..443daff5b 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/ui/UIPreferenceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/categories/UIPreferenceFragment.kt @@ -15,20 +15,21 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.settings.ui +package org.oxycblt.auxio.settings.categories import androidx.appcompat.app.AppCompatDelegate import androidx.navigation.fragment.findNavController import androidx.preference.Preference import org.oxycblt.auxio.R -import org.oxycblt.auxio.settings.SettingsFragmentDirections +import org.oxycblt.auxio.settings.BasePreferenceFragment +import org.oxycblt.auxio.settings.ui.WrappedDialogPreference import org.oxycblt.auxio.ui.UISettings import org.oxycblt.auxio.util.isNight class UIPreferenceFragment : BasePreferenceFragment(R.xml.preferences_ui) { override fun onOpenDialogPreference(preference: WrappedDialogPreference) { if (preference.key == getString(R.string.set_key_accent)) { - findNavController().navigate(SettingsFragmentDirections.goToAccentDialog()) + findNavController().navigate(UIPreferenceFragmentDirections.goToAccentDialog()) } } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/ui/PreferenceHeaderItemDecoration.kt b/app/src/main/java/org/oxycblt/auxio/settings/ui/PreferenceHeaderItemDecoration.kt index cd6a49771..5ab4b0ebf 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/ui/PreferenceHeaderItemDecoration.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/ui/PreferenceHeaderItemDecoration.kt @@ -17,6 +17,7 @@ package org.oxycblt.auxio.settings.ui +import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import androidx.preference.PreferenceCategory @@ -39,6 +40,7 @@ constructor( defStyleAttr: Int = R.attr.materialDividerStyle, orientation: Int = LinearLayoutManager.VERTICAL ) : BackportMaterialDividerItemDecoration(context, attributeSet, defStyleAttr, orientation) { + @SuppressLint("RestrictedApi") override fun shouldDrawDivider(position: Int, adapter: RecyclerView.Adapter<*>?) = try { // Add a divider if the next item is a header (in this case a preference category diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml deleted file mode 100644 index cbe33ddf8..000000000 --- a/app/src/main/res/layout/fragment_settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/navigation/nav_main.xml b/app/src/main/res/navigation/nav_main.xml index d5c6c0b8d..27ab8499d 100644 --- a/app/src/main/res/navigation/nav_main.xml +++ b/app/src/main/res/navigation/nav_main.xml @@ -10,7 +10,7 @@ tools:layout="@layout/fragment_main"> + app:destination="@id/root_preferences_fragment" /> @@ -68,27 +68,64 @@ app:argType="org.oxycblt.auxio.music.Music$UID" /> + + android:id="@+id/root_preferences_fragment" + android:name="org.oxycblt.auxio.settings.RootPreferenceFragment" + android:label="fragment_settings"> + android:id="@+id/go_to_ui_preferences" + app:destination="@id/ui_preferences_fragment" /> + android:id="@+id/go_to_personalize_preferences" + app:destination="@id/personalize_preferences_fragment" /> + android:id="@+id/go_to_music_preferences" + app:destination="@id/music_preferences_fragment" /> + + + + + + + + + + + + + + + + + + auxio_ui + auxio_personalize + auxio_music + auxio_audio + KEY_THEME2 KEY_BLACK_THEME auxio_accent2 diff --git a/app/src/main/res/xml/preferences_root.xml b/app/src/main/res/xml/preferences_root.xml index 2549d5af1..980ce2c9c 100644 --- a/app/src/main/res/xml/preferences_root.xml +++ b/app/src/main/res/xml/preferences_root.xml @@ -3,26 +3,26 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:title="@string/set_root_title">