diff options
8 files changed, 42 insertions, 19 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FullscreenLightRevealAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/FullscreenLightRevealAnimation.kt index ca5ea3bc1caa..135edfcb6a42 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/FullscreenLightRevealAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/FullscreenLightRevealAnimation.kt @@ -32,6 +32,7 @@ import android.view.SurfaceControlViewHost import android.view.SurfaceSession import android.view.WindowManager import android.view.WindowlessWindowManager +import androidx.annotation.WorkerThread import com.android.app.tracing.traceSection import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main @@ -235,8 +236,10 @@ constructor( } private inner class RotationWatcher : RotationChangeProvider.RotationListener { + @WorkerThread override fun onRotationChanged(newRotation: Int) { traceSection("$TAG#onRotationChanged") { + ensureInBackground() if (currentRotation != newRotation) { currentRotation = newRotation scrimView?.revealEffect = lightRevealEffectFactory(currentRotation) diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/RotationChangeProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/RotationChangeProviderTest.kt index fd368eb07b5b..eaef0073b6fb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/RotationChangeProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/RotationChangeProviderTest.kt @@ -18,8 +18,11 @@ package com.android.systemui.unfold.updates import android.content.Context import android.hardware.display.DisplayManager +import android.os.HandlerThread import android.os.Looper +import android.os.Process import android.testing.AndroidTestingRunner +import android.testing.TestableLooper.RunWithLooper import android.view.Display import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase @@ -40,6 +43,7 @@ import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) @SmallTest +@RunWithLooper class RotationChangeProviderTest : SysuiTestCase() { private lateinit var rotationChangeProvider: RotationChangeProvider @@ -48,7 +52,10 @@ class RotationChangeProviderTest : SysuiTestCase() { @Mock lateinit var listener: RotationListener @Mock lateinit var display: Display @Captor lateinit var displayListener: ArgumentCaptor<DisplayManager.DisplayListener> - private val fakeHandler = FakeHandler(Looper.getMainLooper()) + private val bgThread = + HandlerThread("UnfoldBgTest", Process.THREAD_PRIORITY_FOREGROUND).apply { start() } + private val bgHandler = FakeHandler(bgThread.looper) + private val callbackHandler = FakeHandler(Looper.getMainLooper()) private lateinit var spyContext: Context @@ -57,9 +64,10 @@ class RotationChangeProviderTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) spyContext = spy(context) whenever(spyContext.display).thenReturn(display) - rotationChangeProvider = RotationChangeProvider(displayManager, spyContext, fakeHandler) + rotationChangeProvider = + RotationChangeProvider(displayManager, spyContext, bgHandler, callbackHandler) rotationChangeProvider.addCallback(listener) - fakeHandler.dispatchQueuedMessages() + bgHandler.dispatchQueuedMessages() verify(displayManager).registerDisplayListener(displayListener.capture(), any()) } @@ -76,7 +84,7 @@ class RotationChangeProviderTest : SysuiTestCase() { verify(listener).onRotationChanged(42) rotationChangeProvider.removeCallback(listener) - fakeHandler.dispatchQueuedMessages() + bgHandler.dispatchQueuedMessages() sendRotationUpdate(43) verify(displayManager).unregisterDisplayListener(any()) @@ -86,6 +94,6 @@ class RotationChangeProviderTest : SysuiTestCase() { private fun sendRotationUpdate(newRotation: Int) { whenever(display.rotation).thenReturn(newRotation) displayListener.allValues.forEach { it.onDisplayChanged(display.displayId) } - fakeHandler.dispatchQueuedMessages() + callbackHandler.dispatchQueuedMessages() } } diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldRemoteModule.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldRemoteModule.kt index 2bc2db3ba629..fe102448a6cb 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldRemoteModule.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldRemoteModule.kt @@ -53,8 +53,8 @@ class UnfoldRemoteModule { @UnfoldMain fun provideMainRotationChangeProvider( rotationChangeProviderFactory: RotationChangeProvider.Factory, - @UnfoldMain mainHandler: Handler, + @UnfoldMain callbackHandler: Handler, ): RotationChangeProvider { - return rotationChangeProviderFactory.create(mainHandler) + return rotationChangeProviderFactory.create(callbackHandler) } } diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedComponent.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedComponent.kt index 31b7ccca49ac..f382070f8fa7 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedComponent.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedComponent.kt @@ -87,6 +87,7 @@ interface RemoteUnfoldSharedComponent { @BindsInstance @UnfoldMain executor: Executor, @BindsInstance @UnfoldMain handler: Handler, @BindsInstance @UnfoldSingleThreadBg singleThreadBgExecutor: Executor, + @BindsInstance @UnfoldBg bgHandler: Handler, @BindsInstance displayManager: DisplayManager, @BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String, ): RemoteUnfoldSharedComponent diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedModule.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedModule.kt index 1b7e71a42c22..f83ea845809c 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedModule.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedModule.kt @@ -270,9 +270,9 @@ internal class UnfoldRotationProviderInternalModule { @UnfoldMain fun provideRotationChangeProvider( rotationChangeProviderFactory: RotationChangeProvider.Factory, - @UnfoldMain mainHandler: Handler, + @UnfoldMain callbackHandler: Handler, ): RotationChangeProvider { - return rotationChangeProviderFactory.create(mainHandler) + return rotationChangeProviderFactory.create(callbackHandler) } @Provides @@ -280,8 +280,9 @@ internal class UnfoldRotationProviderInternalModule { @UnfoldBg fun provideBgRotationChangeProvider( rotationChangeProviderFactory: RotationChangeProvider.Factory, - @UnfoldBg bgHandler: Handler, + @UnfoldBg callbackHandler: Handler, ): RotationChangeProvider { - return rotationChangeProviderFactory.create(bgHandler) + // For UnfoldBg RotationChangeProvider we use bgHandler as callbackHandler + return rotationChangeProviderFactory.create(callbackHandler) } } diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt index 1cbaf3135c4d..8a4f9857603a 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt @@ -77,6 +77,7 @@ fun createRemoteUnfoldSharedComponent( mainExecutor: Executor, mainHandler: Handler, singleThreadBgExecutor: Executor, + bgHandler: Handler, tracingTagPrefix: String, displayManager: DisplayManager, ): RemoteUnfoldSharedComponent = @@ -87,6 +88,7 @@ fun createRemoteUnfoldSharedComponent( mainExecutor, mainHandler, singleThreadBgExecutor, + bgHandler, displayManager, tracingTagPrefix, ) diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt index 77f637bb8ba1..a10097427ae5 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt @@ -20,6 +20,7 @@ import android.os.Handler import android.util.Log import androidx.annotation.FloatRange import androidx.annotation.VisibleForTesting +import androidx.annotation.WorkerThread import androidx.core.util.Consumer import com.android.systemui.unfold.compat.INNER_SCREEN_SMALLEST_SCREEN_WIDTH_THRESHOLD_DP import com.android.systemui.unfold.config.UnfoldTransitionConfig @@ -215,6 +216,7 @@ constructor( } private inner class FoldRotationListener : RotationChangeProvider.RotationListener { + @WorkerThread override fun onRotationChanged(newRotation: Int) { assertInProgressThread() if (isTransitionInProgress) cancelAnimation() diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/RotationChangeProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/RotationChangeProvider.kt index bb91f9b8cf0b..4f3aee99c206 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/RotationChangeProvider.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/RotationChangeProvider.kt @@ -21,6 +21,8 @@ import android.hardware.display.DisplayManager import android.os.Handler import android.os.RemoteException import android.os.Trace +import androidx.annotation.AnyThread +import com.android.systemui.unfold.dagger.UnfoldBg import com.android.systemui.unfold.util.CallbackController import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -35,7 +37,8 @@ class RotationChangeProvider constructor( private val displayManager: DisplayManager, private val context: Context, - @Assisted private val handler: Handler, + @UnfoldBg private val bgHandler: Handler, + @Assisted private val callbackHandler: Handler, ) : CallbackController<RotationChangeProvider.RotationListener> { private val listeners = mutableListOf<RotationListener>() @@ -44,7 +47,7 @@ constructor( private var lastRotation: Int? = null override fun addCallback(listener: RotationListener) { - handler.post { + bgHandler.post { if (listeners.isEmpty()) { subscribeToRotation() } @@ -53,7 +56,7 @@ constructor( } override fun removeCallback(listener: RotationListener) { - handler.post { + bgHandler.post { listeners -= listener if (listeners.isEmpty()) { unsubscribeToRotation() @@ -64,7 +67,7 @@ constructor( private fun subscribeToRotation() { try { - displayManager.registerDisplayListener(displayListener, handler) + displayManager.registerDisplayListener(displayListener, callbackHandler) } catch (e: RemoteException) { throw e.rethrowFromSystemServer() } @@ -80,8 +83,11 @@ constructor( /** Gets notified of rotation changes. */ fun interface RotationListener { - /** Called once rotation changes. */ - fun onRotationChanged(newRotation: Int) + /** + * Called once rotation changes. This callback is called on the handler provided to + * [RotationChangeProvider.Factory.create]. + */ + @AnyThread fun onRotationChanged(newRotation: Int) } private inner class RotationDisplayListener : DisplayManager.DisplayListener { @@ -110,7 +116,7 @@ constructor( @AssistedFactory interface Factory { - /** Creates a new [RotationChangeProvider] that provides updated using [handler]. */ - fun create(handler: Handler): RotationChangeProvider + /** Creates a new [RotationChangeProvider] that provides updated using [callbackHandler]. */ + fun create(callbackHandler: Handler): RotationChangeProvider } } |