diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index 8e834e3fe..05fdf113a 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -44,9 +44,6 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat * * TODO: Add multi-select * - * LEFT-OFF: Add RecyclerView styles, queue issue is caused by tiny scroll and then replace op, not - * enough to change scroll apparently - * * @author OxygenCobalt */ class MainActivity : AppCompatActivity() { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt index b96cbc5d2..6b3785e29 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt @@ -128,9 +128,6 @@ private constructor( binding.background.isInvisible = true - binding.songName.requestLayout() - binding.songInfo.requestLayout() - binding.body.setOnClickListener { listener.onClick(this) } // Roll our own drag handlers as the default ones suck diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt index 9a835eeef..13d0c1978 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt @@ -49,12 +49,14 @@ class QueueFragment : ViewBindingFragment(), QueueItemList binding.queueRecycler.apply { adapter = queueAdapter touchHelper.attachToRecyclerView(this) + + // Sometimes the scroll can change without the listener being updated, so we also + // check for relayout events. + addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> invalidateDivider() } addOnScrollListener( object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - binding.queueDivider.isInvisible = - (layoutManager as LinearLayoutManager) - .findFirstCompletelyVisibleItemPosition() < 1 + invalidateDivider() } }) } @@ -78,6 +80,8 @@ class QueueFragment : ViewBindingFragment(), QueueItemList } private fun updateQueue(queue: List, index: Int) { + val binding = requireBinding() + val replaceQueue = queueModel.replaceQueue if (replaceQueue == true) { logD("Replacing queue") @@ -87,11 +91,14 @@ class QueueFragment : ViewBindingFragment(), QueueItemList queueAdapter.data.submitList(queue) } + binding.queueDivider.isInvisible = + (binding.queueRecycler.layoutManager as LinearLayoutManager) + .findFirstCompletelyVisibleItemPosition() < 1 + queueModel.finishReplace() val scrollTo = queueModel.scrollTo if (scrollTo != null) { - val binding = requireBinding() val lmm = binding.queueRecycler.layoutManager as LinearLayoutManager val start = lmm.findFirstCompletelyVisibleItemPosition() val end = lmm.findLastCompletelyVisibleItemPosition() @@ -106,4 +113,11 @@ class QueueFragment : ViewBindingFragment(), QueueItemList queueAdapter.updateIndex(index) } + + private fun invalidateDivider() { + val binding = requireBinding() + binding.queueDivider.isInvisible = + (binding.queueRecycler.layoutManager as LinearLayoutManager) + .findFirstCompletelyVisibleItemPosition() < 1 + } } 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 a6f8387ce..b7f09920f 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt @@ -17,7 +17,6 @@ package org.oxycblt.auxio.settings -import android.os.Build import android.os.Bundle import android.view.View import androidx.annotation.DrawableRes @@ -154,45 +153,38 @@ class SettingsListFragment : PreferenceFragmentCompat() { if (!preference.isVisible) return if (preference is PreferenceCategory) { - for (child in preference.children) { - setupPreference(child) - } + preference.children.forEach(::setupPreference) + return } - preference.apply { - when (key) { - context.getString(R.string.set_key_theme) -> { - // Android 12 is the first version I deem to have universal dark and light - // mode toggles. No need for our setting. - isVisible = Build.VERSION.SDK_INT < Build.VERSION_CODES.S + when (preference.key) { + context.getString(R.string.set_key_theme) -> { + preference.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _, value -> + AppCompatDelegate.setDefaultNightMode(value as Int) + true + } + } + context.getString(R.string.set_key_accent) -> { + preference.summary = context.getString(settings.accent.name) + } + context.getString(R.string.set_key_black_theme) -> { + preference.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _, _ -> + if (context.isNight) { + context.recreate() + } - onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _, value -> - AppCompatDelegate.setDefaultNightMode(value as Int) - true - } - } - context.getString(R.string.set_key_accent) -> { - summary = context.getString(settings.accent.name) - } - context.getString(R.string.set_key_black_theme) -> { - onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _, _ -> - if (context.isNight) { - context.recreate() - } - - true - } - } - context.getString(R.string.set_key_show_covers), - context.getString(R.string.set_key_quality_covers) -> { - onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _, _ -> - Coil.imageLoader(context).apply { this.memoryCache?.clear() } - true - } - } + true + } + } + context.getString(R.string.set_key_show_covers), + context.getString(R.string.set_key_quality_covers) -> { + preference.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _, _ -> + Coil.imageLoader(context).memoryCache?.clear() + true + } } } } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/AuxioSheetBehavior.kt b/app/src/main/java/org/oxycblt/auxio/ui/AuxioSheetBehavior.kt index 7b197f385..594fbb777 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/AuxioSheetBehavior.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/AuxioSheetBehavior.kt @@ -20,6 +20,7 @@ package org.oxycblt.auxio.ui import android.content.Context import android.graphics.drawable.ColorDrawable import android.graphics.drawable.LayerDrawable +import android.os.Build import android.util.AttributeSet import android.view.View import android.view.ViewGroup @@ -79,8 +80,12 @@ abstract class AuxioSheetBehavior(context: Context, attributeSet: Attr context.getAttrColorCompat(R.attr.colorSurface).defaultColor), sheetBackgroundDrawable)) - // Try to disable drop shadows if possible. - disableDropShadowCompat() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val transparent = + context.getColorCompat(android.R.color.transparent).defaultColor + outlineAmbientShadowColor = transparent + outlineSpotShadowColor = transparent + } setOnApplyWindowInsetsListener(::applyWindowInsets) } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/recycler/DialogRecyclerView.kt b/app/src/main/java/org/oxycblt/auxio/ui/recycler/DialogRecyclerView.kt index b15ff9e54..fe452326a 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/recycler/DialogRecyclerView.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/recycler/DialogRecyclerView.kt @@ -55,11 +55,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr override fun onScrolled(dx: Int, dy: Int) { super.onScrolled(dx, dy) - - val manager = layoutManager as LinearLayoutManager - topDivider.isInvisible = manager.findFirstCompletelyVisibleItemPosition() < 1 - bottomDivider.isInvisible = - manager.findLastCompletelyVisibleItemPosition() == (manager.itemCount - 1) + invalidateDividers() } override fun onMeasure(widthSpec: Int, heightSpec: Int) { @@ -88,5 +84,13 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr super.onLayout(changed, l, t, r, b) topDivider.layout(l, spacingMedium, r, spacingMedium + topDivider.measuredHeight) bottomDivider.layout(l, measuredHeight - bottomDivider.measuredHeight, r, b) + invalidateDividers() + } + + private fun invalidateDividers() { + val manager = layoutManager as LinearLayoutManager + topDivider.isInvisible = manager.findFirstCompletelyVisibleItemPosition() < 1 + bottomDivider.isInvisible = + manager.findLastCompletelyVisibleItemPosition() == (manager.itemCount - 1) } } diff --git a/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt index 0eba10018..bc9c24f7b 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt @@ -47,18 +47,6 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import org.oxycblt.auxio.R -/** - * Disables drop shadows on a view programmatically in a version-compatible manner. This only works - * on Android 9 and above. Below that version, shadows will remain visible. - */ -fun View.disableDropShadowCompat() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - val transparent = context.getColorCompat(android.R.color.transparent).defaultColor - outlineAmbientShadowColor = transparent - outlineSpotShadowColor = transparent - } -} - /** * Determines if the point given by [x] and [y] falls within this view. * @param minTouchTargetSize The minimum touch size, independent of the view's size (Optional) diff --git a/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt index 2f4e1e6ab..39719580e 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt @@ -34,8 +34,7 @@ fun Any.logD(obj: Any?) = logD("$obj") * objects */ fun Any.logD(msg: String) { - if (BuildConfig.DEBUG) { - basedCopyleftNotice() + if (BuildConfig.DEBUG && !basedCopyleftNotice()) { Log.d(autoTag, msg) } } @@ -58,18 +57,6 @@ fun Any.logEOrThrow(msg: String) { } } -/** - * Logs an error in production while still throwing it in debug mode. This is useful for - * non-showstopper bugs that I would still prefer to be caught in debug mode. - */ -fun Throwable.logTraceOrThrow() { - if (BuildConfig.DEBUG) { - throw this - } else { - logE(stackTraceToString()) - } -} - /** Automatically creates a tag that identifies the object currently logging. */ private val Any.autoTag: String get() = "Auxio.${this::class.simpleName ?: "Anonymous Object"}" @@ -84,31 +71,33 @@ private val Any.autoTag: String * * JUNE 1989 TIANAMEN SQUARE PROTESTS AND MASSACRE 六四事件 * - * KASHMIR INDEPENDENCE MOVEMENT + * 2022 RUSSIAN INVASION OF UKRAINE Вторжение России на Украину * * WOMEN'S RIGHTS IN THE ISLAMIC REPUBLIC OF IRAN حقوق زنان در ایران * - * FREE TIBET 西藏自由 - * - * 1971 BANGLADESHI GENOCIDE BY PAKISTAN - * - * 2022 RUSSIAN INVASION OF UKRAINE Вторжение России на Украину - * * UYGHUR GENOCIDE/XINJIANG INTERNMENT CAMPS 新疆种族灭绝指控/新疆再教育營 * - * KURDISTAN WORKERS PARTY KÜRDISTAN İŞÇI PARTISI (PKK) + * KASHMIR INDEPENDENCE MOVEMENT * - * TORTURE AND ASSASSINATION OF JAMAL KHASHOGGI مقتل جمال خاشقجي + * FREE TIBET 西藏自由 + * + * 1915-1916 ARMENIAN GENOCIDE Ermeni Kırımı + * + * 2018 TORTURE AND ASSASSINATION OF JAMAL KHASHOGGI مقتل جمال خاشقجي * * UNITED ARAB EMIRATES ENSLAVED MIGRANT WORKERS */ @Suppress("KotlinConstantConditions") -private fun basedCopyleftNotice() { +private fun basedCopyleftNotice(): Boolean { if (BuildConfig.APPLICATION_ID != "org.oxycblt.auxio" && BuildConfig.APPLICATION_ID != "org.oxycblt.auxio.debug") { Log.d( "Auxio Project", "Friendly reminder: Auxio is licensed under the " + "GPLv3 and all derivative apps must be made open source!") + + return true } + + return false } diff --git a/app/src/main/res/values-sw840dp-land/styles_ui.xml b/app/src/main/res/values-sw840dp-land/styles_ui.xml index 5dff51dbb..b2d8a2277 100644 --- a/app/src/main/res/values-sw840dp-land/styles_ui.xml +++ b/app/src/main/res/values-sw840dp-land/styles_ui.xml @@ -1,6 +1,5 @@ - diff --git a/app/src/main/res/values-v31/settings.xml b/app/src/main/res/values-v31/settings.xml new file mode 100644 index 000000000..4bd8a8884 --- /dev/null +++ b/app/src/main/res/values-v31/settings.xml @@ -0,0 +1,4 @@ + + + false + \ No newline at end of file diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/settings.xml index 16e55339b..394567d87 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/settings.xml @@ -1,5 +1,7 @@ + true + KEY_THEME2 KEY_BLACK_THEME diff --git a/app/src/main/res/values/styles_core.xml b/app/src/main/res/values/styles_core.xml index 733fd82a8..d22ba253f 100644 --- a/app/src/main/res/values/styles_core.xml +++ b/app/src/main/res/values/styles_core.xml @@ -2,7 +2,7 @@