ui: remove windowinsetscompat

Remove WindowInsetsCompat from the project, as it is a pile of garbage.

WindowInsetsCompat refuses to actually update the correct fields when
you transform it back into a WindowInsets. This makes it impossible to
use in Auxio. The fact that Google decided to make such an
overengineered wrapper to some version-specific methods is an absolute
joke. All you needed were some extension functions, but no, let's make
an entire wrapper class filled with so many gotchas as to be unusable.
This commit is contained in:
OxygenCobalt 2022-07-02 10:19:46 -06:00
parent 631120dafc
commit 3663396b97
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
14 changed files with 80 additions and 42 deletions

View file

@ -25,6 +25,7 @@ finished saving
- Fixed crash that would occur when opening a file on some devices [#176] - Fixed crash that would occur when opening a file on some devices [#176]
- Fixed issue where the search filter menu would not display the correct mode - Fixed issue where the search filter menu would not display the correct mode
- Fixed crash when search filter mode was changed - Fixed crash when search filter mode was changed
- Fixed shuffle button appearing below playback bar on Android 10 and lower
#### What's Changed #### What's Changed
- Reworked typography and iconography to be more aligned with material design guidelines - Reworked typography and iconography to be more aligned with material design guidelines

View file

@ -31,9 +31,9 @@ import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.playback.system.PlaybackService import org.oxycblt.auxio.playback.system.PlaybackService
import org.oxycblt.auxio.settings.Settings import org.oxycblt.auxio.settings.Settings
import org.oxycblt.auxio.util.androidViewModels import org.oxycblt.auxio.util.androidViewModels
import org.oxycblt.auxio.util.getSystemBarInsetsCompat
import org.oxycblt.auxio.util.isNight import org.oxycblt.auxio.util.isNight
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.systemBarInsetsCompat
/** /**
* The single [AppCompatActivity] for Auxio. * The single [AppCompatActivity] for Auxio.
@ -118,7 +118,7 @@ class MainActivity : AppCompatActivity() {
WindowCompat.setDecorFitsSystemWindows(window, false) WindowCompat.setDecorFitsSystemWindows(window, false)
contentView.setOnApplyWindowInsetsListener { view, insets -> contentView.setOnApplyWindowInsetsListener { view, insets ->
val bars = insets.getSystemBarInsetsCompat(view) val bars = insets.systemBarInsetsCompat
view.updatePadding(left = bars.left, right = bars.right) view.updatePadding(left = bars.left, right = bars.right)
insets insets
} }

View file

@ -23,7 +23,7 @@ import android.view.WindowInsets
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import org.oxycblt.auxio.util.getSystemBarInsetsCompat import org.oxycblt.auxio.util.systemBarInsetsCompat
/** /**
* A container for a FloatingActionButton that enables edge-to-edge support. * A container for a FloatingActionButton that enables edge-to-edge support.
@ -42,7 +42,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
} }
override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets { override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets {
updatePadding(bottom = insets.getSystemBarInsetsCompat(this).bottom) updatePadding(bottom = insets.systemBarInsetsCompat.bottom)
return insets return insets
} }
} }

View file

@ -60,11 +60,11 @@ import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.collect import org.oxycblt.auxio.util.collect
import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.getColorStateListSafe import org.oxycblt.auxio.util.getColorStateListSafe
import org.oxycblt.auxio.util.getSystemBarInsetsCompat
import org.oxycblt.auxio.util.lazyReflectedField import org.oxycblt.auxio.util.lazyReflectedField
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logE import org.oxycblt.auxio.util.logE
import org.oxycblt.auxio.util.logTraceOrThrow import org.oxycblt.auxio.util.logTraceOrThrow
import org.oxycblt.auxio.util.systemBarInsetsCompat
import org.oxycblt.auxio.util.textSafe import org.oxycblt.auxio.util.textSafe
/** /**
@ -108,7 +108,7 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
updateTabConfiguration() updateTabConfiguration()
binding.homeIndexingContainer.setOnApplyWindowInsetsListener { view, insets -> binding.homeIndexingContainer.setOnApplyWindowInsetsListener { view, insets ->
view.updatePadding(bottom = insets.getSystemBarInsetsCompat(view).bottom) view.updatePadding(bottom = insets.systemBarInsetsCompat.bottom)
insets insets
} }

View file

@ -40,9 +40,9 @@ import org.oxycblt.auxio.util.clamp
import org.oxycblt.auxio.util.getDimenOffsetSafe import org.oxycblt.auxio.util.getDimenOffsetSafe
import org.oxycblt.auxio.util.getDimenSizeSafe import org.oxycblt.auxio.util.getDimenSizeSafe
import org.oxycblt.auxio.util.getDrawableSafe import org.oxycblt.auxio.util.getDrawableSafe
import org.oxycblt.auxio.util.getSystemBarInsetsCompat
import org.oxycblt.auxio.util.isRtl import org.oxycblt.auxio.util.isRtl
import org.oxycblt.auxio.util.isUnder import org.oxycblt.auxio.util.isUnder
import org.oxycblt.auxio.util.systemBarInsetsCompat
/** /**
* A [RecyclerView] that enables better fast-scrolling. This is fundamentally a implementation of * A [RecyclerView] that enables better fast-scrolling. This is fundamentally a implementation of
@ -283,7 +283,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets { override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets {
super.onApplyWindowInsets(insets) super.onApplyWindowInsets(insets)
val bars = insets.getSystemBarInsetsCompat(this) val bars = insets.systemBarInsetsCompat
thumbPadding.bottom = bars.bottom thumbPadding.bottom = bars.bottom
return insets return insets
} }

View file

@ -31,8 +31,8 @@ import org.oxycblt.auxio.ui.fragment.ViewBindingFragment
import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.getColorStateListSafe import org.oxycblt.auxio.util.getColorStateListSafe
import org.oxycblt.auxio.util.getSystemBarInsetsCompat import org.oxycblt.auxio.util.systemBarInsetsCompat
import org.oxycblt.auxio.util.getSystemGestureInsetsCompat import org.oxycblt.auxio.util.systemGestureInsetsCompat
import org.oxycblt.auxio.util.textSafe import org.oxycblt.auxio.util.textSafe
/** /**
@ -64,8 +64,8 @@ class PlaybackBarFragment : ViewBindingFragment<FragmentPlaybackBarBinding>() {
// any gesture events. So, apply the system gesture insets if present as long // any gesture events. So, apply the system gesture insets if present as long
// as they are *larger* than the bar insets. This is to resolve issues where // as they are *larger* than the bar insets. This is to resolve issues where
// the gesture insets are not sane on OEM devices. // the gesture insets are not sane on OEM devices.
val bars = insets.getSystemBarInsetsCompat(view) val bars = insets.systemBarInsetsCompat
val gestures = insets.getSystemGestureInsetsCompat(view) val gestures = insets.systemGestureInsetsCompat
view.updatePadding(bottom = max(bars.bottom, gestures.bottom)) view.updatePadding(bottom = max(bars.bottom, gestures.bottom))
insets insets
} }

View file

@ -36,9 +36,9 @@ import org.oxycblt.auxio.ui.fragment.ViewBindingFragment
import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.getDrawableSafe import org.oxycblt.auxio.util.getDrawableSafe
import org.oxycblt.auxio.util.getSystemBarInsetsCompat
import org.oxycblt.auxio.util.getSystemGestureInsetsCompat
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.systemBarInsetsCompat
import org.oxycblt.auxio.util.systemGestureInsetsCompat
import org.oxycblt.auxio.util.textSafe import org.oxycblt.auxio.util.textSafe
/** /**
@ -73,8 +73,8 @@ class PlaybackPanelFragment :
// just for quality of life. While the old 3-button navigation does this for us, when // just for quality of life. While the old 3-button navigation does this for us, when
// bar navigation is used, we use the gesture padding to add that extra portion of // bar navigation is used, we use the gesture padding to add that extra portion of
// space. // space.
val bars = insets.getSystemBarInsetsCompat(view) val bars = insets.systemBarInsetsCompat
val gestures = insets.getSystemGestureInsetsCompat(view) val gestures = insets.systemGestureInsetsCompat
view.updatePadding(top = bars.top, bottom = max(gestures.bottom, bars.bottom)) view.updatePadding(top = bars.top, bottom = max(gestures.bottom, bars.bottom))
insets insets
} }

View file

@ -101,7 +101,6 @@ class NotificationComponent(
object : BitmapProvider.Target { object : BitmapProvider.Target {
override fun onCompleted(bitmap: Bitmap?) { override fun onCompleted(bitmap: Bitmap?) {
logD("writing ${song.rawName} to notif") logD("writing ${song.rawName} to notif")
setLargeIcon(bitmap)
setContentTitle(song.resolveName(context)) setContentTitle(song.resolveName(context))
setContentText(song.resolveIndividualArtistName(context)) setContentText(song.resolveIndividualArtistName(context))
@ -115,6 +114,8 @@ class NotificationComponent(
setSubText(song.album.resolveName(context)) setSubText(song.album.resolveName(context))
} }
setLargeIcon(bitmap)
callback.onNotificationChanged(song, this@NotificationComponent) callback.onNotificationChanged(song, this@NotificationComponent)
} }
}) })

View file

@ -39,9 +39,9 @@ import org.oxycblt.auxio.ui.fragment.ViewBindingFragment
import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.formatDuration import org.oxycblt.auxio.util.formatDuration
import org.oxycblt.auxio.util.getSystemBarInsetsCompat
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.showToast
import org.oxycblt.auxio.util.systemBarInsetsCompat
import org.oxycblt.auxio.util.textSafe import org.oxycblt.auxio.util.textSafe
/** /**
@ -55,7 +55,7 @@ class AboutFragment : ViewBindingFragment<FragmentAboutBinding>() {
override fun onBindingCreated(binding: FragmentAboutBinding, savedInstanceState: Bundle?) { override fun onBindingCreated(binding: FragmentAboutBinding, savedInstanceState: Bundle?) {
binding.aboutContents.setOnApplyWindowInsetsListener { view, insets -> binding.aboutContents.setOnApplyWindowInsetsListener { view, insets ->
view.updatePadding(bottom = insets.getSystemBarInsetsCompat(view).bottom) view.updatePadding(bottom = insets.systemBarInsetsCompat.bottom)
insets insets
} }

View file

@ -38,12 +38,12 @@ import org.oxycblt.auxio.settings.ui.IntListPreferenceDialog
import org.oxycblt.auxio.settings.ui.WrappedDialogPreference import org.oxycblt.auxio.settings.ui.WrappedDialogPreference
import org.oxycblt.auxio.ui.accent.AccentCustomizeDialog import org.oxycblt.auxio.ui.accent.AccentCustomizeDialog
import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.getSystemBarInsetsCompat
import org.oxycblt.auxio.util.hardRestart import org.oxycblt.auxio.util.hardRestart
import org.oxycblt.auxio.util.isNight import org.oxycblt.auxio.util.isNight
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.logEOrThrow
import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.showToast
import org.oxycblt.auxio.util.systemBarInsetsCompat
/** /**
* The actual fragment containing the settings menu. Inherits [PreferenceFragmentCompat]. * The actual fragment containing the settings menu. Inherits [PreferenceFragmentCompat].
@ -68,7 +68,7 @@ class SettingsListFragment : PreferenceFragmentCompat() {
clipToPadding = false clipToPadding = false
setOnApplyWindowInsetsListener { _, insets -> setOnApplyWindowInsetsListener { _, insets ->
updatePadding(bottom = insets.getSystemBarInsetsCompat(this).bottom) updatePadding(bottom = insets.systemBarInsetsCompat.bottom)
insets insets
} }
} }

View file

@ -45,13 +45,13 @@ import org.oxycblt.auxio.util.disableDropShadowCompat
import org.oxycblt.auxio.util.getAttrColorSafe import org.oxycblt.auxio.util.getAttrColorSafe
import org.oxycblt.auxio.util.getDimenSafe import org.oxycblt.auxio.util.getDimenSafe
import org.oxycblt.auxio.util.getDimenSizeSafe import org.oxycblt.auxio.util.getDimenSizeSafe
import org.oxycblt.auxio.util.getSystemBarInsetsCompat
import org.oxycblt.auxio.util.isUnder import org.oxycblt.auxio.util.isUnder
import org.oxycblt.auxio.util.lazyReflectedField import org.oxycblt.auxio.util.lazyReflectedField
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.pxOfDp import org.oxycblt.auxio.util.pxOfDp
import org.oxycblt.auxio.util.replaceSystemBarInsetsCompat import org.oxycblt.auxio.util.replaceSystemBarInsetsCompat
import org.oxycblt.auxio.util.stateList import org.oxycblt.auxio.util.stateList
import org.oxycblt.auxio.util.systemBarInsetsCompat
/** /**
* A layout that *properly* handles bottom sheet functionality. * A layout that *properly* handles bottom sheet functionality.
@ -387,7 +387,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
// space the sheet has consumed, and then combine that with the existing bottom inset to // space the sheet has consumed, and then combine that with the existing bottom inset to
// see which one should be applied. Note that we do not include the expanded sheet into // see which one should be applied. Note that we do not include the expanded sheet into
// this calculation, as it should be covered up by the bottom sheet. // this calculation, as it should be covered up by the bottom sheet.
val bars = insets.getSystemBarInsetsCompat(this) val bars = insets.systemBarInsetsCompat
val consumedByNonExpandedSheet = val consumedByNonExpandedSheet =
measuredHeight - calculateSheetTopPosition(min(sheetOffset, 0f)) measuredHeight - calculateSheetTopPosition(min(sheetOffset, 0f))
val adjustedBottomInset = max(consumedByNonExpandedSheet, bars.bottom) val adjustedBottomInset = max(consumedByNonExpandedSheet, bars.bottom)
@ -544,7 +544,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
// window insets as it goes upwards. Do this by progressively modifying the y // window insets as it goes upwards. Do this by progressively modifying the y
// translation with a fraction of the said inset. // translation with a fraction of the said inset.
lastInsets?.let { insets -> lastInsets?.let { insets ->
val bars = insets.getSystemBarInsetsCompat(this) val bars = insets.systemBarInsetsCompat
translationY = bars.top * halfOutRatio translationY = bars.top * halfOutRatio
} }
} }

View file

@ -28,7 +28,7 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.ResourcesCompat
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
import org.oxycblt.auxio.util.getSystemBarInsetsCompat import org.oxycblt.auxio.util.systemBarInsetsCompat
/** /**
* An [AppBarLayout] that fixes a bug with the default implementation where the lifted state will * An [AppBarLayout] that fixes a bug with the default implementation where the lifted state will
@ -63,7 +63,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets { override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets {
super.onApplyWindowInsets(insets) super.onApplyWindowInsets(insets)
updatePadding(top = insets.getSystemBarInsetsCompat(this).top) updatePadding(top = insets.systemBarInsetsCompat.top)
return insets return insets
} }

View file

@ -24,7 +24,7 @@ import android.view.WindowInsets
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.oxycblt.auxio.util.getSystemBarInsetsCompat import org.oxycblt.auxio.util.systemBarInsetsCompat
/** A [RecyclerView] that automatically applies insets to itself. */ /** A [RecyclerView] that automatically applies insets to itself. */
open class EdgeRecyclerView open class EdgeRecyclerView
@ -48,7 +48,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
initialPadding.left, initialPadding.left,
initialPadding.top, initialPadding.top,
initialPadding.right, initialPadding.right,
initialPadding.bottom + insets.getSystemBarInsetsCompat(this).bottom) initialPadding.bottom + insets.systemBarInsetsCompat.bottom)
return insets return insets
} }

View file

@ -22,6 +22,8 @@ import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.database.Cursor import android.database.Cursor
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import android.graphics.Insets
import android.graphics.Rect
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
import android.view.View import android.view.View
@ -30,9 +32,7 @@ import android.widget.TextView
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.annotation.ColorRes import androidx.annotation.ColorRes
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.graphics.Insets
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
@ -243,25 +243,61 @@ fun <R> SQLiteDatabase.queryAll(tableName: String, block: (Cursor) -> R) =
* Resolve system bar insets in a version-aware manner. This can be used to apply padding to a view * Resolve system bar insets in a version-aware manner. This can be used to apply padding to a view
* that properly follows all the frustrating changes that were made between Android 8-11. * that properly follows all the frustrating changes that were made between Android 8-11.
*/ */
fun WindowInsets.getSystemBarInsetsCompat(view: View) = val WindowInsets.systemBarInsetsCompat: Rect
WindowInsetsCompat.toWindowInsetsCompat(this, view) get() =
.getInsets(WindowInsetsCompat.Type.systemBars()) when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
getInsets(WindowInsets.Type.systemBars()).run { Rect(left, top, right, bottom) }
}
else -> {
@Suppress("DEPRECATION")
Rect(
systemWindowInsetLeft,
systemWindowInsetTop,
systemWindowInsetRight,
systemWindowInsetBottom)
}
}
/** /**
* Resolve gesture insets in a version-aware manner. This can be used to apply padding to a view * Resolve gesture insets in a version-aware manner. This can be used to apply padding to a view
* that properly follows all the frustrating changes that were made between Android 8-11. * that properly follows all the frustrating changes that were made between Android 8-11.
*/ */
fun WindowInsets.getSystemGestureInsetsCompat(view: View) = val WindowInsets.systemGestureInsetsCompat: Rect
WindowInsetsCompat.toWindowInsetsCompat(this, view) get() =
.getInsets(WindowInsetsCompat.Type.systemGestures()) when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
getInsets(WindowInsets.Type.systemGestures()).run { Rect(left, top, right, bottom) }
}
Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> {
@Suppress("DEPRECATION") val gestureInsets = systemGestureInsets
Rect(
gestureInsets.left,
gestureInsets.top,
gestureInsets.right,
gestureInsets.bottom)
}
else -> Rect(0, 0, 0, 0)
}
/** /**
* Replaces the system bar insets in a version-aware manner. This can be used to modify the insets * Replaces the system bar insets in a version-aware manner. This can be used to modify the insets
* for child views in a way that follows all of the frustrating changes that were made between 8-11. * for child views in a way that follows all of the frustrating changes that were made between 8-11.
*/ */
fun WindowInsets.replaceSystemBarInsetsCompat(left: Int, top: Int, right: Int, bottom: Int) = fun WindowInsets.replaceSystemBarInsetsCompat(
requireNotNull( left: Int,
WindowInsetsCompat.Builder(WindowInsetsCompat.toWindowInsetsCompat(this)) top: Int,
.setInsets(WindowInsetsCompat.Type.systemBars(), Insets.of(left, top, right, bottom)) right: Int,
bottom: Int
): WindowInsets {
return when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
WindowInsets.Builder(this)
.setInsets(WindowInsets.Type.systemBars(), Insets.of(left, top, right, bottom))
.build() .build()
.toWindowInsets()) }
else -> {
@Suppress("DEPRECATION") replaceSystemWindowInsets(left, top, right, bottom)
}
}
}