ui: make setting dialogs

Make the setting dialogs navigation destinations.

This reduces the boilerplate required for dialogs.
This commit is contained in:
Alexander Capehart 2022-09-14 18:52:29 -06:00
parent 33b0aabc44
commit 2aa540c29a
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
20 changed files with 101 additions and 100 deletions

View file

@ -232,13 +232,8 @@ class MainFragment :
when (action) {
is MainNavigationAction.Expand -> tryExpandAll()
is MainNavigationAction.Collapse -> tryCollapseAll()
is MainNavigationAction.Settings ->
findNavController().navigate(MainFragmentDirections.actionShowSettings())
is MainNavigationAction.About ->
findNavController().navigate(MainFragmentDirections.actionShowAbout())
is MainNavigationAction.SongDetails ->
findNavController()
.navigate(MainFragmentDirections.actionShowDetails(action.song.uid))
is MainNavigationAction.Directions ->
findNavController().navigate(action.directions)
}
navModel.finishMainNavigation()

View file

@ -37,6 +37,7 @@ import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.tabs.TabLayoutMediator
import com.google.android.material.transition.MaterialSharedAxis
import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.MainFragmentDirections
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentHomeBinding
import org.oxycblt.auxio.home.list.AlbumListFragment
@ -185,11 +186,11 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
}
R.id.action_settings -> {
logD("Navigating to settings")
navModel.mainNavigateTo(MainNavigationAction.Settings)
navModel.mainNavigateTo(MainNavigationAction.Directions(MainFragmentDirections.actionShowSettings()))
}
R.id.action_about -> {
logD("Navigating to about")
navModel.mainNavigateTo(MainNavigationAction.About)
navModel.mainNavigateTo(MainNavigationAction.Directions(MainFragmentDirections.actionShowAbout()))
}
R.id.submenu_sorting -> {
// Junk click event when opening the menu

View file

@ -110,7 +110,6 @@ class TabCustomizeDialog : ViewBindingDialogFragment<DialogTabsBinding>(), TabAd
}
companion object {
const val TAG = BuildConfig.APPLICATION_ID + ".tag.TAB_CUSTOMIZE"
const val KEY_TABS = BuildConfig.APPLICATION_ID + ".key.PENDING_TABS"
}
}

View file

@ -63,14 +63,6 @@ val Long.albumCoverUri: Uri
fun Date?.resolveYear(context: Context) =
this?.resolveYear(context) ?: context.getString(R.string.def_date)
/** Converts this string to a UUID, or returns null if it is not valid. */
fun String.toUuid() =
try {
UUID.fromString(this)
} catch (e: IllegalArgumentException) {
null
}
/** Converts a long in milliseconds to a long in deci-seconds */
fun Long.msToDs() = floorDiv(100)

View file

@ -184,7 +184,6 @@ class MusicDirsDialog :
binding.folderModeGroup.checkedButtonId == R.id.dirs_mode_include
companion object {
const val TAG = BuildConfig.APPLICATION_ID + ".tag.EXCLUDED"
const val KEY_PENDING_DIRS = BuildConfig.APPLICATION_ID + ".key.PENDING_DIRS"
const val KEY_PENDING_MODE = BuildConfig.APPLICATION_ID + ".key.SHOULD_INCLUDE"
}

View file

@ -69,7 +69,6 @@ class SeparatorsDialog : ViewBindingDialogFragment<DialogSeparatorsBinding>() {
}
companion object {
const val TAG = BuildConfig.APPLICATION_ID + ".tag.EXCLUDED"
private const val SEPARATOR_COMMA = ','
private const val SEPARATOR_SEMICOLON = ';'

View file

@ -27,6 +27,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.Toolbar
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import org.oxycblt.auxio.MainFragmentDirections
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentPlaybackPanelBinding
import org.oxycblt.auxio.music.MusicParent
@ -145,8 +146,12 @@ class PlaybackPanelFragment :
true
}
R.id.action_song_detail -> {
playbackModel.song.value?.let {
navModel.mainNavigateTo(MainNavigationAction.SongDetails(it))
playbackModel.song.value?.let { song ->
navModel.mainNavigateTo(
MainNavigationAction.Directions(
MainFragmentDirections.actionShowDetails(song.uid)
)
)
}
true

View file

@ -85,6 +85,5 @@ class PreAmpCustomizeDialog : ViewBindingDialogFragment<DialogPreAmpBinding>() {
}
companion object {
const val TAG = BuildConfig.APPLICATION_ID + ".tag.PRE_AMP_CUSTOMIZE"
}
}

View file

@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.settings.ui
package org.oxycblt.auxio.settings
import android.content.Context
import android.content.res.TypedArray

View file

@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.settings.ui
package org.oxycblt.auxio.settings
import android.os.Bundle
import androidx.preference.PreferenceDialogFragmentCompat

View file

@ -23,6 +23,7 @@ import androidx.annotation.DrawableRes
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.view.updatePadding
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat
@ -30,16 +31,9 @@ import androidx.preference.children
import androidx.recyclerview.widget.RecyclerView
import coil.Coil
import org.oxycblt.auxio.R
import org.oxycblt.auxio.home.tabs.TabCustomizeDialog
import org.oxycblt.auxio.music.MusicViewModel
import org.oxycblt.auxio.music.settings.MusicDirsDialog
import org.oxycblt.auxio.music.settings.SeparatorsDialog
import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.playback.replaygain.PreAmpCustomizeDialog
import org.oxycblt.auxio.settings.ui.IntListPreference
import org.oxycblt.auxio.settings.ui.IntListPreferenceDialog
import org.oxycblt.auxio.settings.ui.WrappedDialogPreference
import org.oxycblt.auxio.ui.accent.AccentCustomizeDialog
import org.oxycblt.auxio.ui.NavigationViewModel
import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.isNight
import org.oxycblt.auxio.util.logD
@ -54,6 +48,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat
class SettingsListFragment : PreferenceFragmentCompat() {
private val playbackModel: PlaybackViewModel by androidActivityViewModels()
private val musicModel: MusicViewModel by activityViewModels()
private val navModel: NavigationViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@ -97,21 +92,15 @@ class SettingsListFragment : PreferenceFragmentCompat() {
}
is WrappedDialogPreference -> {
val context = requireContext()
when (preference.key) {
context.getString(R.string.set_key_accent) ->
AccentCustomizeDialog()
.show(childFragmentManager, AccentCustomizeDialog.TAG)
context.getString(R.string.set_key_lib_tabs) ->
TabCustomizeDialog().show(childFragmentManager, TabCustomizeDialog.TAG)
context.getString(R.string.set_key_pre_amp) ->
PreAmpCustomizeDialog()
.show(childFragmentManager, PreAmpCustomizeDialog.TAG)
context.getString(R.string.set_key_music_dirs) ->
MusicDirsDialog().show(childFragmentManager, MusicDirsDialog.TAG)
getString(R.string.set_key_separators) ->
SeparatorsDialog().show(childFragmentManager, SeparatorsDialog.TAG)
val directions = when (preference.key) {
context.getString(R.string.set_key_accent) -> SettingsFragmentDirections.goToAccentDialog()
context.getString(R.string.set_key_lib_tabs) -> SettingsFragmentDirections.goToTabDialog()
context.getString(R.string.set_key_pre_amp) -> SettingsFragmentDirections.goToPreAmpDialog()
context.getString(R.string.set_key_music_dirs) -> SettingsFragmentDirections.goToMusicDirsDialog()
getString(R.string.set_key_separators) -> SettingsFragmentDirections.goToSeparatorsDialog()
else -> error("Unexpected dialog key ${preference.key}")
}
findNavController().navigate(directions)
}
else -> super.onDisplayPreferenceDialog(preference)
}

View file

@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.settings.ui
package org.oxycblt.auxio.settings
import android.content.Context
import android.util.AttributeSet

View file

@ -18,10 +18,10 @@
package org.oxycblt.auxio.ui
import androidx.lifecycle.ViewModel
import androidx.navigation.NavDirections
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.util.logD
/**
@ -91,12 +91,5 @@ sealed class MainNavigationAction {
/** Collapse the playback panel. */
object Collapse : MainNavigationAction()
/** Go to settings. */
object Settings : MainNavigationAction()
/** Go to the about page. */
object About : MainNavigationAction()
/** Show song details. */
data class SongDetails(val song: Song) : MainNavigationAction()
data class Directions(val directions: NavDirections) : MainNavigationAction()
}

View file

@ -80,7 +80,6 @@ class AccentCustomizeDialog :
}
companion object {
const val TAG = BuildConfig.APPLICATION_ID + ".tag.ACCENT_PICKER"
const val KEY_PENDING_ACCENT = BuildConfig.APPLICATION_ID + ".key.PENDING_ACCENT"
}
}

View file

@ -23,6 +23,7 @@ import androidx.appcompat.widget.PopupMenu
import androidx.core.view.children
import androidx.fragment.app.activityViewModels
import androidx.viewbinding.ViewBinding
import org.oxycblt.auxio.MainFragmentDirections
import org.oxycblt.auxio.R
import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist
@ -70,7 +71,11 @@ abstract class MenuFragment<T : ViewBinding> : ViewBindingFragment<T>() {
navModel.exploreNavigateTo(song.album)
}
R.id.action_song_detail -> {
navModel.mainNavigateTo(MainNavigationAction.SongDetails(song))
navModel.mainNavigateTo(
MainNavigationAction.Directions(
MainFragmentDirections.actionShowDetails(song.uid)
)
)
}
else -> {
error("Unexpected menu item selected")

View file

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_go_artist"
android:title="@string/lbl_go_artist" />
<item
android:id="@+id/action_go_album"
android:title="@string/lbl_go_album" />
<item
android:id="@+id/action_song_detail"
android:title="@string/lbl_song_detail" />
</menu>

View file

@ -19,21 +19,6 @@
app:destination="@id/song_detail_dialog" />
</fragment>
<fragment
android:id="@+id/queue_fragment"
android:name="org.oxycblt.auxio.playback.queue.QueueFragment"
android:label="QueueFragment"
tools:layout="@layout/fragment_queue" />
<fragment
android:id="@+id/about_fragment"
android:name="org.oxycblt.auxio.settings.AboutFragment"
android:label="dialog_about"
tools:layout="@layout/fragment_about" />
<fragment
android:id="@+id/settings_fragment"
android:name="org.oxycblt.auxio.settings.SettingsFragment"
android:label="fragment_settings"
tools:layout="@layout/fragment_settings" />
<dialog
android:id="@+id/song_detail_dialog"
android:name="org.oxycblt.auxio.detail.SongDetailDialog"
@ -43,4 +28,57 @@
android:name="songUid"
app:argType="org.oxycblt.auxio.music.Music$UID" />
</dialog>
<fragment
android:id="@+id/settings_fragment"
android:name="org.oxycblt.auxio.settings.SettingsFragment"
android:label="fragment_settings"
tools:layout="@layout/fragment_settings" >
<action
android:id="@+id/go_to_accent_dialog"
app:destination="@id/accent_dialog" />
<action
android:id="@+id/go_to_tab_dialog"
app:destination="@id/tab_dialog" />
<action
android:id="@+id/go_to_pre_amp_dialog"
app:destination="@id/pre_amp_dialog" />
<action
android:id="@+id/go_to_music_dirs_dialog"
app:destination="@id/music_dirs_dialog" />
<action
android:id="@+id/go_to_separators_dialog"
app:destination="@id/separators_dialog" />
</fragment>
<dialog
android:id="@+id/accent_dialog"
android:name="org.oxycblt.auxio.ui.accent.AccentCustomizeDialog"
android:label="accent_dialog"
tools:layout="@layout/dialog_accent" />
<dialog
android:id="@+id/tab_dialog"
android:name="org.oxycblt.auxio.home.tabs.TabCustomizeDialog"
android:label="tab_dialog"
tools:layout="@layout/dialog_tabs" />
<dialog
android:id="@+id/pre_amp_dialog"
android:name="org.oxycblt.auxio.playback.replaygain.PreAmpCustomizeDialog"
android:label="pre_amp_dialog"
tools:layout="@layout/dialog_pre_amp" />
<dialog
android:id="@+id/music_dirs_dialog"
android:name="org.oxycblt.auxio.music.settings.MusicDirsDialog"
android:label="music_dirs_dialog"
tools:layout="@layout/dialog_music_dirs" />
<dialog
android:id="@+id/separators_dialog"
android:name="org.oxycblt.auxio.music.settings.SeparatorsDialog"
android:label="music_dirs_dialog"
tools:layout="@layout/dialog_separators" />
<fragment
android:id="@+id/about_fragment"
android:name="org.oxycblt.auxio.settings.AboutFragment"
android:label="dialog_about"
tools:layout="@layout/fragment_about" />
</navigation>

View file

@ -102,6 +102,7 @@
<plurals name="fmt_album_count">
<item quantity="one">%d albumas</item>
<item quantity="few">%d albumai</item>
<item quantity="many">%d albumo</item>
<item quantity="other">%d albumo</item>
</plurals>
<string name="lbl_remix_group">Remiksai</string>
@ -112,6 +113,7 @@
<plurals name="fmt_song_count">
<item quantity="one">%d daina</item>
<item quantity="few">%d dainos</item>
<item quantity="many">%d dainą</item>
<item quantity="other">%d dainą</item>
</plurals>
<string name="clr_dynamic">Dinaminis</string>
@ -194,7 +196,7 @@
<string name="fmt_lib_genre_count">Įkrauti žanrai: %d</string>
<string name="fmt_lib_album_count">Įkrauti albumai: %d</string>
<string name="fmt_lib_artist_count">Įkelti atlikėjai: %d</string>
<string name="fmt_indexing">Kraunama jūsų muzikos biblioteka... (%1$d/%2$d)</string>
<string name="fmt_indexing">Kraunama jūsų muzikos biblioteka (%1$d/%2$d)</string>
<string name="desc_shuffle_all">Maišyti visas dainas</string>
<string name="set_behavior">Elgesys</string>
<string name="set_pre_amp_warning">Įspėjimas: Keičiant išankstinį stiprintuvą į didelę teigiamą vertę, kai kuriuose garso takeliuose gali atsirasti pikų.</string>

View file

@ -64,13 +64,11 @@
<string name="fmt_lib_song_count">Músicas carregadas: %d</string>
<plurals name="fmt_song_count">
<item quantity="one">%d música</item>
<item quantity="many">%d músicas</item>
<item quantity="other"></item>
<item quantity="other">%d músicas</item>
</plurals>
<plurals name="fmt_album_count">
<item quantity="one">%d álbum</item>
<item quantity="many">%d álbuns</item>
<item quantity="other"></item>
<item quantity="other">%d álbuns</item>
</plurals>
<string name="lbl_sort_asc">Crescente</string>
<string name="lbl_song_detail">Ver propriedades</string>

View file

@ -2,7 +2,7 @@
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory app:title="@string/set_ui">
<org.oxycblt.auxio.settings.ui.IntListPreference
<org.oxycblt.auxio.settings.IntListPreference
app:defaultValue="@integer/theme_auto"
app:entries="@array/entries_theme"
app:entryIcons="@array/icons_theme"
@ -12,7 +12,7 @@
app:key="@string/set_key_theme"
app:title="@string/set_theme" />
<org.oxycblt.auxio.settings.ui.WrappedDialogPreference
<org.oxycblt.auxio.settings.WrappedDialogPreference
app:icon="@drawable/ic_accent_24"
app:key="@string/set_key_accent"
app:title="@string/set_accent" />
@ -27,7 +27,7 @@
<PreferenceCategory app:title="@string/set_display">
<org.oxycblt.auxio.settings.ui.WrappedDialogPreference
<org.oxycblt.auxio.settings.WrappedDialogPreference
app:key="@string/set_key_lib_tabs"
app:summary="@string/set_lib_tabs_desc"
app:title="@string/set_lib_tabs" />
@ -51,7 +51,7 @@
app:summary="@string/set_round_mode_desc"
app:title="@string/set_round_mode" />
<org.oxycblt.auxio.settings.ui.IntListPreference
<org.oxycblt.auxio.settings.IntListPreference
app:defaultValue="@integer/bar_action_next"
app:entries="@array/entries_bar_action"
app:entryValues="@array/values_bar_action"
@ -74,14 +74,14 @@
app:summary="@string/set_headset_autoplay_desc"
app:title="@string/set_headset_autoplay" />
<org.oxycblt.auxio.settings.ui.IntListPreference
<org.oxycblt.auxio.settings.IntListPreference
app:defaultValue="@integer/replay_gain_dynamic"
app:entries="@array/entries_replay_gain"
app:entryValues="@array/values_replay_gain"
app:key="@string/set_key_replay_gain"
app:title="@string/set_replay_gain" />
<org.oxycblt.auxio.settings.ui.WrappedDialogPreference
<org.oxycblt.auxio.settings.WrappedDialogPreference
app:key="@string/set_key_pre_amp"
app:summary="@string/set_pre_amp_desc"
app:title="@string/set_pre_amp" />
@ -90,7 +90,7 @@
<PreferenceCategory app:title="@string/set_behavior">
<org.oxycblt.auxio.settings.ui.IntListPreference
<org.oxycblt.auxio.settings.IntListPreference
app:defaultValue="@integer/play_mode_songs"
app:entries="@array/entries_library_song_playback_mode"
app:entryValues="@array/values_library_song_playback_mode"
@ -98,7 +98,7 @@
app:title="@string/set_library_song_playback_mode"
app:useSimpleSummaryProvider="true" />
<org.oxycblt.auxio.settings.ui.IntListPreference
<org.oxycblt.auxio.settings.IntListPreference
app:defaultValue="@integer/play_mode_none"
app:entries="@array/entries_detail_song_playback_mode"
app:entryValues="@array/values_detail_song_playback_mode"
@ -154,12 +154,12 @@
app:summary="@string/set_observing_desc"
app:title="@string/set_observing" />
<org.oxycblt.auxio.settings.ui.WrappedDialogPreference
<org.oxycblt.auxio.settings.WrappedDialogPreference
app:key="@string/set_key_music_dirs"
app:summary="@string/set_dirs_desc"
app:title="@string/set_dirs" />
<org.oxycblt.auxio.settings.ui.WrappedDialogPreference
<org.oxycblt.auxio.settings.WrappedDialogPreference
app:key="@string/set_key_separators"
app:summary="@string/set_separators_desc"
app:title="@string/set_separators" />