From 59036a2747d54b5c5074234ea37d3ab7915861f9 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sun, 29 Nov 2020 14:41:58 -0700 Subject: [PATCH] Change setting ripple color Change the ripple on the settings to a generally neutral color instead of the gaudy colorPrimary. --- app/build.gradle | 6 +++- app/proguard-rules.pro | 2 +- .../oxycblt/auxio/recycler/NoLeakThumbView.kt | 22 ++++++------ ...istFragment.kt => SettingsListFragment.kt} | 36 +++++++++++++++++-- .../oxycblt/auxio/settings/SettingsManager.kt | 11 ++++-- .../auxio/settings/adapters/AccentAdapter.kt | 27 ++++++++------ .../org/oxycblt/auxio/songs/SongsFragment.kt | 21 +++++------ .../org/oxycblt/auxio/ui/InterfaceUtils.kt | 1 + app/src/main/res/drawable/ic_auto.xml | 6 ++-- app/src/main/res/drawable/ic_check.xml | 6 ++-- app/src/main/res/drawable/ic_day.xml | 6 ++-- app/src/main/res/drawable/ic_night.xml | 6 ++-- app/src/main/res/drawable/ic_settings.xml | 6 ++-- app/src/main/res/drawable/ui_circle.xml | 3 +- app/src/main/res/layout/fragment_settings.xml | 4 +-- app/src/main/res/layout/item_accent.xml | 2 ++ app/src/main/res/layout/item_prefs_header.xml | 3 +- app/src/main/res/menu/menu_nav.xml | 2 +- app/src/main/res/values/arrays.xml | 6 ++-- app/src/main/res/values/strings.xml | 20 ++++++----- app/src/main/res/values/styles.xml | 11 ++++++ app/src/main/res/xml-v27/prefs_main.xml | 30 ++++++++++++++++ app/src/main/res/xml/prefs_main.xml | 9 +++-- 23 files changed, 169 insertions(+), 77 deletions(-) rename app/src/main/java/org/oxycblt/auxio/settings/{SettingListFragment.kt => SettingsListFragment.kt} (79%) create mode 100644 app/src/main/res/xml-v27/prefs_main.xml diff --git a/app/build.gradle b/app/build.gradle index 1ec5af13a..26e946794 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -89,13 +89,17 @@ dependencies { implementation 'io.coil-kt:coil:0.13.0' // Material - implementation 'com.google.android.material:material:1.3.0-alpha03' + implementation 'com.google.android.material:material:1.3.0-alpha04' // Fast-Scroll implementation 'com.reddit:indicator-fast-scroll:1.3.0' + // Dialogs implementation 'com.afollestad.material-dialogs:core:3.3.0' + // Edge-To-Edge + implementation 'de.halfbit:edge-to-edge:0.10' + // --- DEV --- // Lint diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index b19c33a72..161f13dd3 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -22,4 +22,4 @@ -dontobfuscate --keep class org.oxycblt.auxio.settings.SettingListFragment \ No newline at end of file +-keep class org.oxycblt.auxio.settings.SettingsListFragment \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/NoLeakThumbView.kt b/app/src/main/java/org/oxycblt/auxio/recycler/NoLeakThumbView.kt index 7922a49af..7d35af33f 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/NoLeakThumbView.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/NoLeakThumbView.kt @@ -26,8 +26,8 @@ import org.oxycblt.auxio.ui.accent import org.oxycblt.auxio.ui.toColor /** - * A source code copy of [com.reddit.indicatorfastscroll.FastScrollerThumbView] that fixes a - * memory leak that occurs from having nested fragments. All credit goes to the authors of + * A semi-copy, semi-custom implementation of [com.reddit.indicatorfastscroll.FastScrollerThumbView] + * that fixes a memory leak that occurs from a bug fix they added. All credit goes to the authors of * the fast scroll library. * Link to repo * @author Reddit, OxygenCobalt @@ -81,7 +81,11 @@ class NoLeakThumbView @JvmOverloads constructor( fastScrollerView.onTouchEvent(event) fastScrollerView.performClick() - if (event.actionMasked in intArrayOf(MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL)) { + if (event.actionMasked in intArrayOf( + MotionEvent.ACTION_UP, + MotionEvent.ACTION_CANCEL + ) + ) { isActivated = false return@setOnTouchListener true } @@ -104,15 +108,9 @@ class NoLeakThumbView @JvmOverloads constructor( fastScrollerView.apply { children.forEach { view -> - if (view.containsY(touchY)) { - when (view) { - is ImageView -> { - consumed = true - } - is TextView -> { - consumed = true - } - } + if (view.containsY(touchY) && (view is ImageView || view is TextView)) { + consumed = true + return@forEach } } } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingListFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt similarity index 79% rename from app/src/main/java/org/oxycblt/auxio/settings/SettingListFragment.kt rename to app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt index 4623547bf..55a982919 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt @@ -1,12 +1,17 @@ package org.oxycblt.auxio.settings +import android.annotation.SuppressLint import android.os.Bundle import android.util.Log import android.view.View +import android.view.ViewGroup import androidx.appcompat.app.AppCompatDelegate import androidx.fragment.app.activityViewModels import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.PreferenceGroupAdapter +import androidx.preference.PreferenceScreen +import androidx.preference.PreferenceViewHolder import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.MaterialDialog @@ -18,12 +23,15 @@ import org.oxycblt.auxio.ui.ACCENTS import org.oxycblt.auxio.ui.accent import org.oxycblt.auxio.ui.getDetailedAccentSummary -class SettingListFragment : PreferenceFragmentCompat() { +class SettingsListFragment : PreferenceFragmentCompat() { private val settingsModel: SettingsViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + view.apply { + } + val themePref = findPreference(SettingsManager.Keys.KEY_THEME)?.apply { setIcon( when (AppCompatDelegate.getDefaultNightMode()) { @@ -80,9 +88,33 @@ class SettingListFragment : PreferenceFragmentCompat() { setPreferencesFromResource(R.xml.prefs_main, rootKey) } + // Forcefully override the adapter creation process so I can get rid of the ugly + // colorPrimary ripples. + @SuppressLint("RestrictedApi") + override fun onCreateAdapter(preferenceScreen: PreferenceScreen?): RecyclerView.Adapter<*> { + return object : PreferenceGroupAdapter(preferenceScreen) { + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): PreferenceViewHolder { + val holder = super.onCreateViewHolder(parent, viewType) + + if (holder.itemView.id != android.R.id.title) { + holder.itemView.setBackgroundResource(R.drawable.ui_ripple) + } + + return holder + } + } + } + + private fun offLoad(something: String) { + Log.d(this::class.simpleName, something) + } + private fun showAccentDialog() { MaterialDialog(requireActivity()).show { - title(R.string.label_settings_accent) + 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. 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 ca726cd46..87bef980c 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt @@ -14,7 +14,8 @@ import org.oxycblt.auxio.ui.ACCENTS * the first time it occurs. * @author OxygenCobalt */ -class SettingsManager private constructor(context: Context) : SharedPreferences.OnSharedPreferenceChangeListener { +class SettingsManager private constructor(context: Context) : + SharedPreferences.OnSharedPreferenceChangeListener { private val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context) init { @@ -79,6 +80,10 @@ class SettingsManager private constructor(context: Context) : SharedPreferences. ) ?: SortMode.ALPHA_DOWN } + fun getEdgeToEdge(): Boolean { + return sharedPrefs.getBoolean(Keys.KEY_EDGE_TO_EDGE, false) + } + // --- OVERRIDES --- override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { @@ -124,6 +129,7 @@ class SettingsManager private constructor(context: Context) : SharedPreferences. const val KEY_LIBRARY_SORT_MODE = "KEY_LIBRARY_SORT_MODE" const val KEY_THEME = "KEY_THEME" const val KEY_ACCENT = "KEY_ACCENT" + const val KEY_EDGE_TO_EDGE = "KEY_EDGE" } private object Theme { @@ -133,11 +139,12 @@ class SettingsManager private constructor(context: Context) : SharedPreferences. } /** - * A safe interface for receiving preference updates, use this instead of + * An interface for receiving some settings updates. * [SharedPreferences.OnSharedPreferenceChangeListener]. */ interface Callback { fun onThemeUpdate(newTheme: Int) {} fun onAccentUpdate(newAccent: Pair) {} + fun onEdgeToEdgeUpdate(isEdgeToEdge: Boolean) {} } } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/adapters/AccentAdapter.kt b/app/src/main/java/org/oxycblt/auxio/settings/adapters/AccentAdapter.kt index 3314ed8ca..133dc9354 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/adapters/AccentAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/adapters/AccentAdapter.kt @@ -1,7 +1,6 @@ package org.oxycblt.auxio.settings.adapters import android.content.res.ColorStateList -import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView @@ -9,6 +8,7 @@ import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.ItemAccentBinding import org.oxycblt.auxio.ui.ACCENTS import org.oxycblt.auxio.ui.accent +import org.oxycblt.auxio.ui.getAccentItemSummary import org.oxycblt.auxio.ui.toColor class AccentAdapter( @@ -29,20 +29,25 @@ class AccentAdapter( ) : RecyclerView.ViewHolder(binding.root) { fun bind(accentData: Pair) { - binding.accent.setOnClickListener { - Log.d(this::class.simpleName, accentData.toString()) - doOnAccentConfirm(accentData) - } - binding.accent.apply { - imageTintList = if (accentData.first != accent.first) { - ColorStateList.valueOf( - android.R.color.transparent.toColor(context) - ) - } else { + contentDescription = getAccentItemSummary(context, accentData) + + setOnClickListener { + doOnAccentConfirm(accentData) + } + + imageTintList = if (accentData.first == accent.first) { + isEnabled = false + ColorStateList.valueOf( R.color.background.toColor(context) ) + } else { + isEnabled = true + + ColorStateList.valueOf( + android.R.color.transparent.toColor(context) + ) } backgroundTintList = ColorStateList.valueOf( diff --git a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt index 5e49f8401..74cfdcaff 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt @@ -129,18 +129,19 @@ class SongsFragment : Fragment(), SearchView.OnQueryTextListener { useDefaultScroller = false - itemIndicatorSelectedCallbacks.add(object : FastScrollerView.ItemIndicatorSelectedCallback { - override fun onItemIndicatorSelected( - indicator: FastScrollItemIndicator, - indicatorCenterY: Int, - itemPosition: Int - ) { - val layoutManager = binding.songRecycler.layoutManager - as LinearLayoutManager + itemIndicatorSelectedCallbacks.add(object : + FastScrollerView.ItemIndicatorSelectedCallback { + override fun onItemIndicatorSelected( + indicator: FastScrollItemIndicator, + indicatorCenterY: Int, + itemPosition: Int + ) { + val layoutManager = binding.songRecycler.layoutManager + as LinearLayoutManager - layoutManager.scrollToPositionWithOffset(itemPosition, 0) + layoutManager.scrollToPositionWithOffset(itemPosition, 0) + } } - } ) } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt b/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt index ee4766f8f..69ecff340 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt @@ -93,6 +93,7 @@ fun PopupMenu.setupSongActions(song: Song, context: Context, playbackModel: Play } inflateAndShow(R.menu.menu_song_actions) } + /** * Show actions for a song item, such as the ones found in [org.oxycblt.auxio.songs.SongsFragment] */ diff --git a/app/src/main/res/drawable/ic_auto.xml b/app/src/main/res/drawable/ic_auto.xml index e80ee38d9..05612ca0f 100644 --- a/app/src/main/res/drawable/ic_auto.xml +++ b/app/src/main/res/drawable/ic_auto.xml @@ -5,7 +5,7 @@ android:viewportWidth="24" android:viewportHeight="24" android:tint="?attr/colorPrimary"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml index 54c0432e0..94844e55e 100644 --- a/app/src/main/res/drawable/ic_check.xml +++ b/app/src/main/res/drawable/ic_check.xml @@ -5,7 +5,7 @@ android:viewportWidth="24" android:viewportHeight="24" android:tint="@color/background"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_day.xml b/app/src/main/res/drawable/ic_day.xml index 8f3ea64a2..38d2309a3 100644 --- a/app/src/main/res/drawable/ic_day.xml +++ b/app/src/main/res/drawable/ic_day.xml @@ -5,7 +5,7 @@ android:viewportWidth="24" android:viewportHeight="24" android:tint="?attr/colorPrimary"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_night.xml b/app/src/main/res/drawable/ic_night.xml index 99a7fd8e2..3d05bec6b 100644 --- a/app/src/main/res/drawable/ic_night.xml +++ b/app/src/main/res/drawable/ic_night.xml @@ -5,7 +5,7 @@ android:viewportWidth="24" android:viewportHeight="24" android:tint="?attr/colorPrimary"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml index 162b11342..e0beb8339 100644 --- a/app/src/main/res/drawable/ic_settings.xml +++ b/app/src/main/res/drawable/ic_settings.xml @@ -5,7 +5,7 @@ android:viewportWidth="24" android:viewportHeight="24" android:tint="?attr/colorPrimary"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ui_circle.xml b/app/src/main/res/drawable/ui_circle.xml index fc9a783a4..be5283142 100644 --- a/app/src/main/res/drawable/ui_circle.xml +++ b/app/src/main/res/drawable/ui_circle.xml @@ -4,6 +4,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index af8869d67..08dc00f8a 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -16,12 +16,12 @@ android:elevation="@dimen/elevation_normal" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:title="@string/label_settings" + app:title="@string/setting_title" app:titleTextAppearance="@style/TextAppearance.Toolbar.Header" /> diff --git a/app/src/main/res/layout/item_accent.xml b/app/src/main/res/layout/item_accent.xml index ebe46d7a5..75605fdaf 100644 --- a/app/src/main/res/layout/item_accent.xml +++ b/app/src/main/res/layout/item_accent.xml @@ -1,6 +1,7 @@ + @@ -9,6 +10,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/margin_mid_small"> + - \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 1b6a1db54..25ec51de5 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,9 +1,9 @@ - @string/label_settings_theme_auto - @string/label_settings_theme_light - @string/label_settings_theme_dark + @string/setting_theme_auto + @string/setting_theme_day + @string/setting_theme_night diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 928a29590..01be725c0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,14 +27,18 @@ Next in Queue Music Playback The music playback service for Auxio. - Settings - Appearance - Theme - Automatic - Light - Dark - Choose theme - Accent + + + Settings + Appearance + Theme + Automatic + Light + Dark + Accent + Edge-To-Edge + Disable edge-to-edge + Enable edge-to-edge State saved diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 2199f72ec..a9ee109ec 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -13,12 +13,17 @@ @color/control_color @style/Theme.CustomDialog @style/FastScrollTheme + ?attr/colorPrimary + ?attr/colorPrimary + @style/Theme.Preference @android:color/transparent @color/background 0dp @color/control_color @font/inter_black + + @drawable/ui_ripple @@ -83,6 +88,12 @@ 18sp + +