diff options
| author | 2024-04-04 01:59:06 +0000 | |
|---|---|---|
| committer | 2024-04-04 18:50:23 +0000 | |
| commit | 15d0713b093d210eb016e38f9d267bce50cd0d8c (patch) | |
| tree | 32ed0fb0e1abd56228c27140feaa83cb92074357 | |
| parent | 8b86c4f574066a530c64c1889a789bb4e29fec62 (diff) | |
Have KeyguardRootViewBinder use DisposableHandles to colocate cleanup code and reduce view boilerplate with extensions.
Test: atest SystemUITests
Flag: NONE
Change-Id: I62028e5950881951a5b131ea61bde4aa2fb36e9b
3 files changed, 56 insertions, 40 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/view/ViewExt.kt b/packages/SystemUI/src/com/android/systemui/common/ui/view/ViewExt.kt index 7dd883b89db7..f7ea25c8c0ca 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/view/ViewExt.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/view/ViewExt.kt @@ -46,8 +46,25 @@ inline fun <reified T : View> View.getNearestParent(): T? { } /** Adds a [View.OnLayoutChangeListener] and provides a [DisposableHandle] for teardown. */ -fun View.onLayoutChanged(onLayoutChanged: (v: View) -> Unit): DisposableHandle { - val listener = View.OnLayoutChangeListener { v, _, _, _, _, _, _, _, _ -> onLayoutChanged(v) } +fun View.onLayoutChanged(onLayoutChanged: (v: View) -> Unit): DisposableHandle = + onLayoutChanged { v, _, _, _, _, _, _, _, _ -> + onLayoutChanged(v) + } + +/** Adds the [View.OnLayoutChangeListener] and provides a [DisposableHandle] for teardown. */ +fun View.onLayoutChanged(listener: View.OnLayoutChangeListener): DisposableHandle { addOnLayoutChangeListener(listener) return DisposableHandle { removeOnLayoutChangeListener(listener) } } + +/** Adds a [View.OnApplyWindowInsetsListener] and provides a [DisposableHandle] for teardown. */ +fun View.onApplyWindowInsets(listener: View.OnApplyWindowInsetsListener): DisposableHandle { + setOnApplyWindowInsetsListener(listener) + return DisposableHandle { setOnApplyWindowInsetsListener(null) } +} + +/** Adds a [View.OnTouchListener] and provides a [DisposableHandle] for teardown. */ +fun View.onTouchListener(listener: View.OnTouchListener): DisposableHandle { + setOnTouchListener(listener) + return DisposableHandle { setOnTouchListener(null) } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt index 0249abd684cc..44fd58267250 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt @@ -41,6 +41,9 @@ import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.Text import com.android.systemui.common.shared.model.TintedIcon import com.android.systemui.common.ui.ConfigurationState +import com.android.systemui.common.ui.view.onApplyWindowInsets +import com.android.systemui.common.ui.view.onLayoutChanged +import com.android.systemui.common.ui.view.onTouchListener import com.android.systemui.deviceentry.domain.interactor.DeviceEntryHapticsInteractor import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor import com.android.systemui.keyguard.KeyguardBottomAreaRefactor @@ -64,6 +67,7 @@ import com.android.systemui.statusbar.phone.ScreenOffAnimationController import com.android.systemui.temporarydisplay.ViewPriority import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator import com.android.systemui.temporarydisplay.chipbar.ChipbarInfo +import com.android.systemui.util.kotlin.DisposableHandles import com.android.systemui.util.ui.AnimatedValue import com.android.systemui.util.ui.isAnimating import com.android.systemui.util.ui.stopAnimating @@ -99,16 +103,19 @@ object KeyguardRootViewBinder { keyguardViewMediator: KeyguardViewMediator?, mainImmediateDispatcher: CoroutineDispatcher, ): DisposableHandle { - var onLayoutChangeListener: OnLayoutChange? = null + val disposables = DisposableHandles() val childViews = mutableMapOf<Int, View>() if (KeyguardBottomAreaRefactor.isEnabled) { - view.setOnTouchListener { _, event -> - if (falsingManager?.isFalseTap(FalsingManager.LOW_PENALTY) == false) { - viewModel.setRootViewLastTapPosition(Point(event.x.toInt(), event.y.toInt())) + disposables += + view.onTouchListener { _, event -> + if (falsingManager?.isFalseTap(FalsingManager.LOW_PENALTY) == false) { + viewModel.setRootViewLastTapPosition( + Point(event.x.toInt(), event.y.toInt()) + ) + } + false } - false - } } val burnInParams = MutableStateFlow(BurnInParameters()) @@ -117,7 +124,7 @@ object KeyguardRootViewBinder { alpha = { view.alpha }, ) - val disposableHandle = + disposables += view.repeatWhenAttached(mainImmediateDispatcher) { repeatOnLifecycle(Lifecycle.State.CREATED) { launch("$TAG#occludingAppDeviceEntryMessageViewModel.message") { @@ -346,8 +353,7 @@ object KeyguardRootViewBinder { } } - onLayoutChangeListener = OnLayoutChange(viewModel, childViews, burnInParams) - view.addOnLayoutChangeListener(onLayoutChangeListener) + disposables += view.onLayoutChanged(OnLayoutChange(viewModel, childViews, burnInParams)) // Views will be added or removed after the call to bind(). This is needed to avoid many // calls to findViewById @@ -362,24 +368,21 @@ object KeyguardRootViewBinder { } } ) - - view.setOnApplyWindowInsetsListener { v: View, insets: WindowInsets -> - val insetTypes = WindowInsets.Type.systemBars() or WindowInsets.Type.displayCutout() - burnInParams.update { current -> - current.copy(topInset = insets.getInsetsIgnoringVisibility(insetTypes).top) - } - insets + disposables += DisposableHandle { + view.setOnHierarchyChangeListener(null) + childViews.clear() } - return object : DisposableHandle { - override fun dispose() { - disposableHandle.dispose() - view.removeOnLayoutChangeListener(onLayoutChangeListener) - view.setOnHierarchyChangeListener(null) - view.setOnApplyWindowInsetsListener(null) - childViews.clear() + disposables += + view.onApplyWindowInsets { _: View, insets: WindowInsets -> + val insetTypes = WindowInsets.Type.systemBars() or WindowInsets.Type.displayCutout() + burnInParams.update { current -> + current.copy(topInset = insets.getInsetsIgnoringVisibility(insetTypes).top) + } + insets } - } + + return disposables } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt index cfd19bacdc69..4059565d9865 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt @@ -21,6 +21,8 @@ import android.view.WindowInsets import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import com.android.systemui.Flags.communalHub +import com.android.systemui.common.ui.view.onApplyWindowInsets +import com.android.systemui.common.ui.view.onLayoutChanged import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters @@ -168,22 +170,16 @@ constructor( controller.setOnHeightChangedRunnable { viewModel.notificationStackChanged() } disposables += DisposableHandle { controller.setOnHeightChangedRunnable(null) } - view.setOnApplyWindowInsetsListener { v: View, insets: WindowInsets -> - val insetTypes = WindowInsets.Type.systemBars() or WindowInsets.Type.displayCutout() - burnInParams.update { current -> - current.copy(topInset = insets.getInsetsIgnoringVisibility(insetTypes).top) + disposables += + view.onApplyWindowInsets { _: View, insets: WindowInsets -> + val insetTypes = WindowInsets.Type.systemBars() or WindowInsets.Type.displayCutout() + burnInParams.update { current -> + current.copy(topInset = insets.getInsetsIgnoringVisibility(insetTypes).top) + } + insets } - insets - } - disposables += DisposableHandle { view.setOnApplyWindowInsetsListener(null) } - // Required to capture keyguard media changes and ensure the notification count is correct - val layoutChangeListener = - View.OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> - viewModel.notificationStackChanged() - } - view.addOnLayoutChangeListener(layoutChangeListener) - disposables += DisposableHandle { view.removeOnLayoutChangeListener(layoutChangeListener) } + disposables += view.onLayoutChanged { viewModel.notificationStackChanged() } return disposables } |