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
This commit is contained in:
Nicolo' Mazzucato
2022-02-14 10:57:59 +01:00
parent 5479e1e07b
commit 115e7e8664

View File

@@ -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<DisplayAreaHelper>,
@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 :