Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 870a23d1 authored by Maryam Dehaini's avatar Maryam Dehaini Committed by Android (Google) Code Review
Browse files

Merge "Update touchable region on appHandle state and status bar bounds changes" into main

parents 9ca5dd09 74407ffe
Loading
Loading
Loading
Loading
+30 −4
Original line number Diff line number Diff line
@@ -19,9 +19,12 @@ package com.android.systemui.statusbar.pipeline.shared.ui.binder
import android.graphics.Rect
import android.graphics.Region
import android.window.DesktopExperienceFlags
import com.android.systemui.common.ui.view.onLayoutChanged
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.lifecycle.setSnapshotBinding
import com.android.systemui.statusbar.layout.ui.viewmodel.AppHandlesViewModel
import com.android.systemui.statusbar.phone.PhoneStatusBarView
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.awaitCancellation

/** Binds a [PhoneStatusBarView] to [AppHandlesViewModel]'s touch exclusion region. */
@@ -31,16 +34,39 @@ object HomeStatusBarTouchExclusionRegionBinder {
     * Reports the updated touchable region to the [PhoneStatusBarView] calculated from the touch
     * exclusion region provided.
     */
    fun bind(view: PhoneStatusBarView, touchExclusionRegion: Region) {
    fun bind(view: PhoneStatusBarView, appHandlesViewModel: AppHandlesViewModel): DisposableHandle {
        if (!DesktopExperienceFlags.ENABLE_REMOVE_STATUS_BAR_INPUT_LAYER.isTrue) {
            return
            return DisposableHandle {}
        }

        // Update touchable regions when touchableExclusionRegion changes
        view.repeatWhenAttached {
            view.setSnapshotBinding {
                view.updateTouchableRegion(calculateTouchableRegion(view, touchExclusionRegion))
                view.updateTouchableRegion(
                    calculateTouchableRegion(view, appHandlesViewModel.touchableExclusionRegion)
                )
            }
            awaitCancellation()
        }

        // Update touchable region when status bar bounds change
        return view.onLayoutChanged {
            _,
            left,
            top,
            right,
            bottom,
            oldLeft,
            oldTop,
            oldRight,
            oldBottom ->
            if (top == oldTop && left == oldLeft && right == oldRight && bottom == oldBottom) {
                return@onLayoutChanged
            }
            view.updateTouchableRegion(
                calculateTouchableRegion(view, appHandlesViewModel.touchableExclusionRegion)
            )
        }
    }

    private fun calculateTouchableRegion(
@@ -52,7 +78,7 @@ object HomeStatusBarTouchExclusionRegionBinder {
        val touchableRegion =
            Region.obtain().apply {
                set(outBounds)
                op(touchExclusionRegion, android.graphics.Region.Op.DIFFERENCE)
                op(touchExclusionRegion, Region.Op.DIFFERENCE)
            }
        return touchableRegion
    }
+8 −4
Original line number Diff line number Diff line
@@ -110,6 +110,7 @@ import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.SystemStatu
import com.android.systemui.statusbar.ui.viewmodel.StatusBarRegionSamplingViewModel
import javax.inject.Inject
import javax.inject.Named
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.awaitCancellation

/** Factory to simplify the dependency management for [StatusBarRoot] */
@@ -209,6 +210,7 @@ fun StatusBarRoot(
        rememberViewModel("AppHandleBounds") {
            statusBarViewModel.appHandlesViewModelFactory.create(displayId)
        }
    lateinit var touchableExclusionRegionDisposableHandle: DisposableHandle

    // Let the DesktopStatusBar compose all the UI if [isDesktopStatusBarEnabled] is true.
    if (StatusBarForDesktop.isEnabled && statusBarViewModel.isDesktopStatusBarEnabled) {
@@ -238,9 +240,10 @@ fun StatusBarRoot(
                )
            }

            touchableExclusionRegionDisposableHandle =
                HomeStatusBarTouchExclusionRegionBinder.bind(
                    phoneStatusBarView,
                appHandlesViewModel.touchableExclusionRegion,
                    appHandlesViewModel,
                )

            if (StatusBarChipsModernization.isEnabled) {
@@ -361,6 +364,7 @@ fun StatusBarRoot(
            phoneStatusBarView
        },
        modifier = modifier,
        onRelease = { touchableExclusionRegionDisposableHandle.dispose() },
    )
}