From 5d72bfa09b9f2ffb0fec648d91ced5b790e6f77c Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Tue, 9 Mar 2021 08:01:49 -0700 Subject: [PATCH] Move accent dialog to object Move the dialog created in showAccentDialog to a dedicated object. --- .../auxio/settings/SettingsFragment.kt | 4 +- .../auxio/settings/SettingsListFragment.kt | 60 ++---------------- .../oxycblt/auxio/settings/SettingsManager.kt | 2 + .../oxycblt/auxio/settings/ui/AccentDialog.kt | 63 +++++++++++++++++++ app/src/main/res/layout/fragment_loading.xml | 1 + app/src/main/res/xml/prefs_main.xml | 2 +- 6 files changed, 74 insertions(+), 58 deletions(-) create mode 100644 app/src/main/java/org/oxycblt/auxio/settings/ui/AccentDialog.kt diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt index 7d2873df2..3ff79de49 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt @@ -23,7 +23,7 @@ class SettingsFragment : Fragment() { binding.settingsToolbar.setOnMenuItemClickListener { if (it.itemId == R.id.action_open_about) { - AboutDialog().show(childFragmentManager, ABOUT_DIALOG_TAG) + AboutDialog().show(childFragmentManager, TAG_ABOUT_DIALOG) true } else { false @@ -34,6 +34,6 @@ class SettingsFragment : Fragment() { } companion object { - private const val ABOUT_DIALOG_TAG = "TAG_ABOUT_DIALOG" + private const val TAG_ABOUT_DIALOG = "TAG_ABOUT_DIALOG" } } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt index 118f7b0ef..589f8940f 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt @@ -8,18 +8,12 @@ import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import androidx.preference.children -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import coil.Coil -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.customview.customView -import com.afollestad.materialdialogs.utils.invalidateDividers import org.oxycblt.auxio.R import org.oxycblt.auxio.logD import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.DisplayMode -import org.oxycblt.auxio.settings.ui.AccentAdapter -import org.oxycblt.auxio.ui.ACCENTS +import org.oxycblt.auxio.settings.ui.AccentDialog import org.oxycblt.auxio.ui.Accent /** @@ -77,9 +71,9 @@ class SettingsListFragment : PreferenceFragmentCompat() { } } - SettingsManager.Keys.KEY_ACCENT_OLD -> { + SettingsManager.Keys.KEY_ACCENT -> { onPreferenceClickListener = Preference.OnPreferenceClickListener { - showAccentDialog() + AccentDialog().show(childFragmentManager, TAG_ACCENT_DIALOG) true } @@ -89,7 +83,6 @@ class SettingsListFragment : PreferenceFragmentCompat() { SettingsManager.Keys.KEY_EDGE_TO_EDGE -> { onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, _ -> requireActivity().recreate() - true } } @@ -99,7 +92,6 @@ class SettingsListFragment : PreferenceFragmentCompat() { onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, value -> setIcon(DisplayMode.valueOfOrFallback(value as String).iconRes) - true } } @@ -134,7 +126,6 @@ class SettingsListFragment : PreferenceFragmentCompat() { SettingsManager.Keys.KEY_DEBUG_SAVE -> { onPreferenceClickListener = Preference.OnPreferenceClickListener { playbackModel.savePlaybackState(requireContext()) - true } } @@ -142,48 +133,7 @@ class SettingsListFragment : PreferenceFragmentCompat() { } } - /** - * Show the accent dialog to the user - */ - private fun showAccentDialog() { - MaterialDialog(requireActivity()).show { - title(R.string.setting_accent) - - // Roll my own RecyclerView since [To no surprise whatsoever] Material Dialogs - // has a bug where ugly dividers will show with the RecyclerView even if you disable them. - // This is why I hate using third party libraries. - val recycler = RecyclerView(requireContext()).apply { - adapter = AccentAdapter { accent -> - if (accent != Accent.get()) { - settingsManager.accent = accent - - requireActivity().recreate() - } - - this@show.dismiss() - } - - layoutManager = LinearLayoutManager( - requireContext(), LinearLayoutManager.HORIZONTAL, false - ) - - post { - // Combine the width of the recyclerview with the width of an item in order - // to center the currently selected accent. - val childWidth = getChildAt(0).width / 2 - - (layoutManager as LinearLayoutManager) - .scrollToPositionWithOffset( - ACCENTS.indexOf(Accent.get()), - (width / 2) - childWidth - ) - } - } - - customView(view = recycler) - invalidateDividers(showTop = false, showBottom = false) - negativeButton(android.R.string.cancel) - show() - } + companion object { + const val TAG_ACCENT_DIALOG = "ACCENT_DIALOG" } } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt index 8ab52b629..93d2ef682 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt @@ -32,6 +32,7 @@ class SettingsManager private constructor(context: Context) : /** The current accent. */ var accent: Accent get() { + @Suppress("DEPRECATION") if (sharedPrefs.contains(Keys.KEY_ACCENT_OLD)) { logD("Migrating from old accent to new accent.") @@ -233,6 +234,7 @@ class SettingsManager private constructor(context: Context) : const val KEY_SEARCH_FILTER_MODE = "KEY_SEARCH" const val KEY_DEBUG_SAVE = "KEY_SAVE_STATE" + @Deprecated("Use the new KEY_ACCENT instead.") const val KEY_ACCENT_OLD = "KEY_ACCENT" } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/ui/AccentDialog.kt b/app/src/main/java/org/oxycblt/auxio/settings/ui/AccentDialog.kt new file mode 100644 index 000000000..055f705cd --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/settings/ui/AccentDialog.kt @@ -0,0 +1,63 @@ +package org.oxycblt.auxio.settings.ui + +import android.app.Dialog +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.customview.customView +import com.afollestad.materialdialogs.utils.invalidateDividers +import org.oxycblt.auxio.R +import org.oxycblt.auxio.settings.SettingsManager +import org.oxycblt.auxio.ui.ACCENTS +import org.oxycblt.auxio.ui.Accent + +class AccentDialog : DialogFragment() { + private val settingsManager = SettingsManager.getInstance() + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + // Roll my own RecyclerView since [To no surprise whatsoever] Material Dialogs + // has a bug where ugly dividers will show with the RecyclerView even if you disable them. + // This is why I hate using third party libraries. + val recycler = RecyclerView(requireContext()).apply { + adapter = AccentAdapter { accent -> + if (accent != Accent.get()) { + settingsManager.accent = accent + + requireActivity().recreate() + } + + dismiss() + } + + layoutManager = LinearLayoutManager( + requireContext(), LinearLayoutManager.HORIZONTAL, false + ) + + post { + // Combine the width of the recyclerview with the width of an item in order + // to center the currently selected accent. + val childWidth = getChildAt(0).width / 2 + + (layoutManager as LinearLayoutManager) + .scrollToPositionWithOffset( + ACCENTS.indexOf(Accent.get()), + (width / 2) - childWidth + ) + } + } + + return MaterialDialog(requireActivity()) + .title(R.string.setting_accent) + .negativeButton(android.R.string.cancel) + .customView(view = recycler) + .noDividers() + } + + private fun MaterialDialog.noDividers(): MaterialDialog { + invalidateDividers(showTop = false, showBottom = false) + + return this + } +} diff --git a/app/src/main/res/layout/fragment_loading.xml b/app/src/main/res/layout/fragment_loading.xml index 4f3d4db13..08c63d830 100644 --- a/app/src/main/res/layout/fragment_loading.xml +++ b/app/src/main/res/layout/fragment_loading.xml @@ -14,6 +14,7 @@ android:layout_height="match_parent" android:animateLayoutChanges="true" android:gravity="center" + android:padding="@dimen/padding_small" android:orientation="vertical">