From 115e7e8664dd43897022e70b6832d620a143760b Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Mon, 14 Feb 2022 10:57:59 +0100 Subject: [PATCH] Remove getRotation binder call on each fold/unfold By registering with RotationWatcher, it is possible to avoid context.display.rotation binder call on each DisplayListener displayChanged callback. Bug: 197515205 Test: Manual Change-Id: I54240cb4c8495ee94a367d10840ee6794792b94b --- .../UnfoldLightRevealOverlayAnimation.kt | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt index 4b09a583645c3..cbdf87ea0fcc7 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt @@ -22,11 +22,12 @@ import android.hardware.devicestate.DeviceStateManager import android.hardware.devicestate.DeviceStateManager.FoldStateListener import android.hardware.display.DisplayManager import android.hardware.input.InputManager -import android.os.Handler import android.os.Trace import android.view.Choreographer import android.view.Display import android.view.DisplayInfo +import android.view.IRotationWatcher +import android.view.IWindowManager import android.view.Surface import android.view.SurfaceControl import android.view.SurfaceControlViewHost @@ -39,6 +40,7 @@ import com.android.systemui.statusbar.LightRevealEffect import com.android.systemui.statusbar.LightRevealScrim import com.android.systemui.statusbar.LinearLightRevealEffect import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener +import com.android.systemui.util.traceSection import com.android.wm.shell.displayareahelper.DisplayAreaHelper import java.util.Optional import java.util.concurrent.Executor @@ -55,12 +57,12 @@ constructor( private val unfoldTransitionProgressProvider: UnfoldTransitionProgressProvider, private val displayAreaHelper: Optional, @Main private val executor: Executor, - @Main private val handler: Handler, - @UiBackground private val backgroundExecutor: Executor + @UiBackground private val backgroundExecutor: Executor, + private val windowManagerInterface: IWindowManager ) { private val transitionListener = TransitionListener() - private val displayListener = DisplayChangeListener() + private val rotationWatcher = RotationWatcher() private lateinit var wwm: WindowlessWindowManager private lateinit var unfoldedDisplayInfo: DisplayInfo @@ -76,6 +78,7 @@ constructor( fun init() { deviceStateManager.registerCallback(executor, FoldListener()) unfoldTransitionProgressProvider.addCallback(transitionListener) + windowManagerInterface.watchRotation(rotationWatcher, context.display.displayId) val containerBuilder = SurfaceControl.Builder(SurfaceSession()) @@ -97,9 +100,6 @@ constructor( } } - displayManager.registerDisplayListener( - displayListener, handler, DisplayManager.EVENT_FLAG_DISPLAY_CHANGED) - // Get unfolded display size immediately as 'current display info' might be // not up-to-date during unfolding unfoldedDisplayInfo = getUnfoldedDisplayInfo() @@ -180,7 +180,7 @@ constructor( private fun getLayoutParams(): WindowManager.LayoutParams { val params: WindowManager.LayoutParams = WindowManager.LayoutParams() - val rotation = context.display!!.rotation + val rotation = currentRotation val isNatural = rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180 params.height = @@ -243,20 +243,15 @@ constructor( } } - private inner class DisplayChangeListener : DisplayManager.DisplayListener { - - override fun onDisplayChanged(displayId: Int) { - val newRotation: Int = context.display!!.rotation - if (currentRotation != newRotation) { - currentRotation = newRotation - scrimView?.revealEffect = createLightRevealEffect() - root?.relayout(getLayoutParams()) + private inner class RotationWatcher : IRotationWatcher.Stub() { + override fun onRotationChanged(newRotation: Int) = + traceSection("UnfoldLightRevealOverlayAnimation#onRotationChanged") { + if (currentRotation != newRotation) { + currentRotation = newRotation + scrimView?.revealEffect = createLightRevealEffect() + root?.relayout(getLayoutParams()) + } } - } - - override fun onDisplayAdded(displayId: Int) {} - - override fun onDisplayRemoved(displayId: Int) {} } private inner class FoldListener :