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

Commit e3e518a7 authored by Fengjiang Li's avatar Fengjiang Li
Browse files

[Launcher Jank] Add bg handler and callback handler to RotationChangeProvider

1. Make DisplayManager#registerDisplayListener()/unsubscribeToRotation()  binder calls on background thread
2. Receive callback from DisplayManager on handler at choice of owner of RotationChangeProvider

Fix: 333771185
Test: record prefetto trace
Flag: NONE not exist
Change-Id: I7091d000ad9a5c17987438b25ff464a0a83114d1
parent 26eab8d3
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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)
+13 −5
Original line number Diff line number Diff line
@@ -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()
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -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)
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -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
+5 −4
Original line number Diff line number Diff line
@@ -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)
    }
}
Loading