Loading packages/SystemUI/src/com/android/systemui/navigationbar/gestural/DisplayBackGestureHandler.kt +59 −0 Original line number Diff line number Diff line Loading @@ -20,9 +20,14 @@ import android.content.Context import android.content.res.Configuration import android.graphics.PixelFormat import android.graphics.Point import android.graphics.Region import android.os.Trace import android.util.Log import android.view.ISystemGestureExclusionListener import android.view.IWindowManager import android.view.InputEvent import android.view.MotionEvent import android.view.WindowInsets import android.view.WindowManager import com.android.systemui.plugins.NavigationEdgeBackPlugin import com.android.systemui.res.R Loading @@ -47,6 +52,8 @@ interface DisplayBackGestureHandler { fun pilferPointers() fun isValidTrackpadBackGesture(): Boolean fun dispose() fun dump(prefix: String, writer: PrintWriter) Loading @@ -62,6 +69,7 @@ constructor( @BackPanelUiThread private val uiThreadContext: UiThreadContext, private val backPanelControllerFactory: BackPanelController.Factory, configurationControllerFactory: ConfigurationControllerImpl.Factory, private val windowManagerService: IWindowManager, ) : DisplayBackGestureHandler { @AssistedFactory Loading @@ -82,6 +90,7 @@ constructor( set(bounds.width(), bounds.height()) } private val edgeBackPlugin = createEdgeBackPlugin(backCallback) private val excludeRegion = Region() private val inputMonitorCompat = InputMonitorCompat("edge-swipe", displayId) private val inputEventReceiver: InputChannelCompat.InputEventReceiver = Loading @@ -102,8 +111,21 @@ constructor( } } private val gestureExclusionListener: ISystemGestureExclusionListener = object : ISystemGestureExclusionListener.Stub() { override fun onSystemGestureExclusionChanged( displayId: Int, systemGestureExclusion: Region, unrestrictedOrNull: Region?, ) { if (displayId != this@DisplayBackGestureHandlerImpl.displayId) return uiThreadContext.executor.execute { excludeRegion.set(systemGestureExclusion) } } } init { configurationController.addCallback(configurationListener) registerSystemGestureExclusionListener() } override fun onMotionEvent(ev: MotionEvent) = edgeBackPlugin.onMotionEvent(ev) Loading @@ -115,11 +137,25 @@ constructor( override fun pilferPointers() = inputMonitorCompat.pilferPointers() override fun isValidTrackpadBackGesture(): Boolean { // for trackpad gestures, unless the whole screen is excluded region, 3-finger swipe // gestures are allowed even if the cursor is in the excluded region. val insets = windowManager.currentWindowMetrics.windowInsets .getInsets(WindowInsets.Type.systemBars()) return !excludeRegion.bounds.contains( insets.left, insets.top, displaySize.x - insets.right, displaySize.y - insets.bottom, ) } override fun dispose() { inputEventReceiver.dispose() inputMonitorCompat.dispose() edgeBackPlugin.onDestroy() configurationController.removeCallback(configurationListener) unregisterSystemGestureExclusionListener() } private fun createEdgeBackPlugin( Loading @@ -140,6 +176,28 @@ constructor( return backPanelController } private fun registerSystemGestureExclusionListener() { try { windowManagerService.registerSystemGestureExclusionListener( gestureExclusionListener, displayId, ) } catch (e: Exception) { Log.e(TAG, "Failed to register window manager callbacks", e) } } private fun unregisterSystemGestureExclusionListener() { try { windowManagerService.unregisterSystemGestureExclusionListener( gestureExclusionListener, displayId, ) } catch (e: Exception) { Log.e(TAG, "Failed to unregister window manager callbacks", e) } } private fun createLayoutParams(): WindowManager.LayoutParams { val resources = context.resources val layoutParams = Loading Loading @@ -168,6 +226,7 @@ constructor( pw.println("$prefix$TAG (displayId=$displayId)") pw.println("$prefix displaySize=$displaySize") pw.println("$prefix edgeBackPlugin=$edgeBackPlugin") pw.println("$prefix excludeRegion=$excludeRegion") edgeBackPlugin.dump("$prefix ", pw) } Loading packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +10 −8 Original line number Diff line number Diff line Loading @@ -1016,12 +1016,9 @@ public class EdgeBackGestureHandler { return true; } private boolean isValidTrackpadBackGesture(int displayId) { if (enableMultidisplayTrackpadBackGesture() && displayId != mMainDisplayId) { //TODO(b/382774299): Handle exclude regions on connected displays return true; } // TODO(b/382774299): Remove this function when the enableMultidisplayTrackpadBackGesture flag // is cleaned up private boolean isValidTrackpadBackGesture() { // for trackpad gestures, unless the whole screen is excluded region, 3-finger swipe // gestures are allowed even if the cursor is in the excluded region. WindowInsets windowInsets = Loading Loading @@ -1183,8 +1180,13 @@ public class EdgeBackGestureHandler { // event is within insets. boolean trackpadGesturesEnabled = (mSysUiFlags & SYSUI_STATE_TOUCHPAD_GESTURES_DISABLED) == 0; if (enableMultidisplayTrackpadBackGesture()) { mAllowGesture = isBackAllowedCommon && trackpadGesturesEnabled && isValidTrackpadBackGesture(ev.getDisplayId()); && displayBackGestureHandler.isValidTrackpadBackGesture(); } else { mAllowGesture = isBackAllowedCommon && trackpadGesturesEnabled && isValidTrackpadBackGesture(); } } else { mAllowGesture = isBackAllowedCommon && !mUsingThreeButtonNav && isWithinInsets && isWithinTouchRegion(ev) && !isButtonPressFromTrackpad(ev); Loading Loading
packages/SystemUI/src/com/android/systemui/navigationbar/gestural/DisplayBackGestureHandler.kt +59 −0 Original line number Diff line number Diff line Loading @@ -20,9 +20,14 @@ import android.content.Context import android.content.res.Configuration import android.graphics.PixelFormat import android.graphics.Point import android.graphics.Region import android.os.Trace import android.util.Log import android.view.ISystemGestureExclusionListener import android.view.IWindowManager import android.view.InputEvent import android.view.MotionEvent import android.view.WindowInsets import android.view.WindowManager import com.android.systemui.plugins.NavigationEdgeBackPlugin import com.android.systemui.res.R Loading @@ -47,6 +52,8 @@ interface DisplayBackGestureHandler { fun pilferPointers() fun isValidTrackpadBackGesture(): Boolean fun dispose() fun dump(prefix: String, writer: PrintWriter) Loading @@ -62,6 +69,7 @@ constructor( @BackPanelUiThread private val uiThreadContext: UiThreadContext, private val backPanelControllerFactory: BackPanelController.Factory, configurationControllerFactory: ConfigurationControllerImpl.Factory, private val windowManagerService: IWindowManager, ) : DisplayBackGestureHandler { @AssistedFactory Loading @@ -82,6 +90,7 @@ constructor( set(bounds.width(), bounds.height()) } private val edgeBackPlugin = createEdgeBackPlugin(backCallback) private val excludeRegion = Region() private val inputMonitorCompat = InputMonitorCompat("edge-swipe", displayId) private val inputEventReceiver: InputChannelCompat.InputEventReceiver = Loading @@ -102,8 +111,21 @@ constructor( } } private val gestureExclusionListener: ISystemGestureExclusionListener = object : ISystemGestureExclusionListener.Stub() { override fun onSystemGestureExclusionChanged( displayId: Int, systemGestureExclusion: Region, unrestrictedOrNull: Region?, ) { if (displayId != this@DisplayBackGestureHandlerImpl.displayId) return uiThreadContext.executor.execute { excludeRegion.set(systemGestureExclusion) } } } init { configurationController.addCallback(configurationListener) registerSystemGestureExclusionListener() } override fun onMotionEvent(ev: MotionEvent) = edgeBackPlugin.onMotionEvent(ev) Loading @@ -115,11 +137,25 @@ constructor( override fun pilferPointers() = inputMonitorCompat.pilferPointers() override fun isValidTrackpadBackGesture(): Boolean { // for trackpad gestures, unless the whole screen is excluded region, 3-finger swipe // gestures are allowed even if the cursor is in the excluded region. val insets = windowManager.currentWindowMetrics.windowInsets .getInsets(WindowInsets.Type.systemBars()) return !excludeRegion.bounds.contains( insets.left, insets.top, displaySize.x - insets.right, displaySize.y - insets.bottom, ) } override fun dispose() { inputEventReceiver.dispose() inputMonitorCompat.dispose() edgeBackPlugin.onDestroy() configurationController.removeCallback(configurationListener) unregisterSystemGestureExclusionListener() } private fun createEdgeBackPlugin( Loading @@ -140,6 +176,28 @@ constructor( return backPanelController } private fun registerSystemGestureExclusionListener() { try { windowManagerService.registerSystemGestureExclusionListener( gestureExclusionListener, displayId, ) } catch (e: Exception) { Log.e(TAG, "Failed to register window manager callbacks", e) } } private fun unregisterSystemGestureExclusionListener() { try { windowManagerService.unregisterSystemGestureExclusionListener( gestureExclusionListener, displayId, ) } catch (e: Exception) { Log.e(TAG, "Failed to unregister window manager callbacks", e) } } private fun createLayoutParams(): WindowManager.LayoutParams { val resources = context.resources val layoutParams = Loading Loading @@ -168,6 +226,7 @@ constructor( pw.println("$prefix$TAG (displayId=$displayId)") pw.println("$prefix displaySize=$displaySize") pw.println("$prefix edgeBackPlugin=$edgeBackPlugin") pw.println("$prefix excludeRegion=$excludeRegion") edgeBackPlugin.dump("$prefix ", pw) } Loading
packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +10 −8 Original line number Diff line number Diff line Loading @@ -1016,12 +1016,9 @@ public class EdgeBackGestureHandler { return true; } private boolean isValidTrackpadBackGesture(int displayId) { if (enableMultidisplayTrackpadBackGesture() && displayId != mMainDisplayId) { //TODO(b/382774299): Handle exclude regions on connected displays return true; } // TODO(b/382774299): Remove this function when the enableMultidisplayTrackpadBackGesture flag // is cleaned up private boolean isValidTrackpadBackGesture() { // for trackpad gestures, unless the whole screen is excluded region, 3-finger swipe // gestures are allowed even if the cursor is in the excluded region. WindowInsets windowInsets = Loading Loading @@ -1183,8 +1180,13 @@ public class EdgeBackGestureHandler { // event is within insets. boolean trackpadGesturesEnabled = (mSysUiFlags & SYSUI_STATE_TOUCHPAD_GESTURES_DISABLED) == 0; if (enableMultidisplayTrackpadBackGesture()) { mAllowGesture = isBackAllowedCommon && trackpadGesturesEnabled && isValidTrackpadBackGesture(ev.getDisplayId()); && displayBackGestureHandler.isValidTrackpadBackGesture(); } else { mAllowGesture = isBackAllowedCommon && trackpadGesturesEnabled && isValidTrackpadBackGesture(); } } else { mAllowGesture = isBackAllowedCommon && !mUsingThreeButtonNav && isWithinInsets && isWithinTouchRegion(ev) && !isButtonPressFromTrackpad(ev); Loading