Merge "Do not use private APIs in unfold module" into tm-qpr-dev am: 7c4a157adb

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21523184

Change-Id: I9e79867b309053cc20df885f66f567967665b18d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Nick Chameyev
2023-03-03 17:26:01 +00:00
committed by Automerger Merge Worker
8 changed files with 67 additions and 48 deletions

View File

@@ -16,22 +16,24 @@
package com.android.systemui.unfold.updates package com.android.systemui.unfold.updates
import android.content.Context
import android.hardware.display.DisplayManager
import android.os.Looper
import android.testing.AndroidTestingRunner import android.testing.AndroidTestingRunner
import android.view.IRotationWatcher import android.view.Display
import android.view.IWindowManager
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.unfold.updates.RotationChangeProvider.RotationListener import com.android.systemui.unfold.updates.RotationChangeProvider.RotationListener
import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.utils.os.FakeHandler
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Captor import org.mockito.Captor
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@@ -42,19 +44,23 @@ class RotationChangeProviderTest : SysuiTestCase() {
private lateinit var rotationChangeProvider: RotationChangeProvider private lateinit var rotationChangeProvider: RotationChangeProvider
@Mock lateinit var windowManagerInterface: IWindowManager @Mock lateinit var displayManager: DisplayManager
@Mock lateinit var listener: RotationListener @Mock lateinit var listener: RotationListener
@Captor lateinit var rotationWatcher: ArgumentCaptor<IRotationWatcher> @Mock lateinit var display: Display
private val fakeExecutor = FakeExecutor(FakeSystemClock()) @Captor lateinit var displayListener: ArgumentCaptor<DisplayManager.DisplayListener>
private val fakeHandler = FakeHandler(Looper.getMainLooper())
private lateinit var spyContext: Context
@Before @Before
fun setup() { fun setup() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
rotationChangeProvider = spyContext = spy(context)
RotationChangeProvider(windowManagerInterface, context, fakeExecutor) whenever(spyContext.display).thenReturn(display)
rotationChangeProvider = RotationChangeProvider(displayManager, spyContext, fakeHandler)
rotationChangeProvider.addCallback(listener) rotationChangeProvider.addCallback(listener)
fakeExecutor.runAllReady() fakeHandler.dispatchQueuedMessages()
verify(windowManagerInterface).watchRotation(rotationWatcher.capture(), anyInt()) verify(displayManager).registerDisplayListener(displayListener.capture(), any())
} }
@Test @Test
@@ -70,15 +76,16 @@ class RotationChangeProviderTest : SysuiTestCase() {
verify(listener).onRotationChanged(42) verify(listener).onRotationChanged(42)
rotationChangeProvider.removeCallback(listener) rotationChangeProvider.removeCallback(listener)
fakeExecutor.runAllReady() fakeHandler.dispatchQueuedMessages()
sendRotationUpdate(43) sendRotationUpdate(43)
verify(windowManagerInterface).removeRotationWatcher(any()) verify(displayManager).unregisterDisplayListener(any())
verifyNoMoreInteractions(listener) verifyNoMoreInteractions(listener)
} }
private fun sendRotationUpdate(newRotation: Int) { private fun sendRotationUpdate(newRotation: Int) {
rotationWatcher.value.onRotationChanged(newRotation) whenever(display.rotation).thenReturn(newRotation)
fakeExecutor.runAllReady() displayListener.allValues.forEach { it.onDisplayChanged(display.displayId) }
fakeHandler.dispatchQueuedMessages()
} }
} }

View File

@@ -35,6 +35,7 @@ android_library {
], ],
kotlincflags: ["-Xjvm-default=enable"], kotlincflags: ["-Xjvm-default=enable"],
java_version: "1.8", java_version: "1.8",
sdk_version: "current",
min_sdk_version: "current", min_sdk_version: "current",
plugins: ["dagger2-compiler"], plugins: ["dagger2-compiler"],
} }

View File

@@ -19,8 +19,8 @@ package com.android.systemui.unfold
import android.content.ContentResolver import android.content.ContentResolver
import android.content.Context import android.content.Context
import android.hardware.SensorManager import android.hardware.SensorManager
import android.hardware.display.DisplayManager
import android.os.Handler import android.os.Handler
import android.view.IWindowManager
import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.dagger.UnfoldMain import com.android.systemui.unfold.dagger.UnfoldMain
import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg
@@ -61,7 +61,7 @@ interface UnfoldSharedComponent {
@BindsInstance @UnfoldMain executor: Executor, @BindsInstance @UnfoldMain executor: Executor,
@BindsInstance @UnfoldSingleThreadBg singleThreadBgExecutor: Executor, @BindsInstance @UnfoldSingleThreadBg singleThreadBgExecutor: Executor,
@BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String, @BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String,
@BindsInstance windowManager: IWindowManager, @BindsInstance displayManager: DisplayManager,
@BindsInstance contentResolver: ContentResolver = context.contentResolver @BindsInstance contentResolver: ContentResolver = context.contentResolver
): UnfoldSharedComponent ): UnfoldSharedComponent
} }
@@ -84,8 +84,9 @@ interface RemoteUnfoldSharedComponent {
@BindsInstance context: Context, @BindsInstance context: Context,
@BindsInstance config: UnfoldTransitionConfig, @BindsInstance config: UnfoldTransitionConfig,
@BindsInstance @UnfoldMain executor: Executor, @BindsInstance @UnfoldMain executor: Executor,
@BindsInstance @UnfoldMain handler: Handler,
@BindsInstance @UnfoldSingleThreadBg singleThreadBgExecutor: Executor, @BindsInstance @UnfoldSingleThreadBg singleThreadBgExecutor: Executor,
@BindsInstance windowManager: IWindowManager, @BindsInstance displayManager: DisplayManager,
@BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String, @BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String,
): RemoteUnfoldSharedComponent ): RemoteUnfoldSharedComponent
} }

View File

@@ -19,8 +19,8 @@ package com.android.systemui.unfold
import android.content.Context import android.content.Context
import android.hardware.SensorManager import android.hardware.SensorManager
import android.hardware.display.DisplayManager
import android.os.Handler import android.os.Handler
import android.view.IWindowManager
import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.updates.FoldProvider import com.android.systemui.unfold.updates.FoldProvider
import com.android.systemui.unfold.updates.screen.ScreenStatusProvider import com.android.systemui.unfold.updates.screen.ScreenStatusProvider
@@ -47,7 +47,7 @@ fun createUnfoldSharedComponent(
mainExecutor: Executor, mainExecutor: Executor,
singleThreadBgExecutor: Executor, singleThreadBgExecutor: Executor,
tracingTagPrefix: String, tracingTagPrefix: String,
windowManager: IWindowManager, displayManager: DisplayManager,
): UnfoldSharedComponent = ): UnfoldSharedComponent =
DaggerUnfoldSharedComponent.factory() DaggerUnfoldSharedComponent.factory()
.create( .create(
@@ -61,7 +61,7 @@ fun createUnfoldSharedComponent(
mainExecutor, mainExecutor,
singleThreadBgExecutor, singleThreadBgExecutor,
tracingTagPrefix, tracingTagPrefix,
windowManager, displayManager,
) )
/** /**
@@ -73,16 +73,18 @@ fun createRemoteUnfoldSharedComponent(
context: Context, context: Context,
config: UnfoldTransitionConfig, config: UnfoldTransitionConfig,
mainExecutor: Executor, mainExecutor: Executor,
mainHandler: Handler,
singleThreadBgExecutor: Executor, singleThreadBgExecutor: Executor,
tracingTagPrefix: String, tracingTagPrefix: String,
windowManager: IWindowManager, displayManager: DisplayManager,
): RemoteUnfoldSharedComponent = ): RemoteUnfoldSharedComponent =
DaggerRemoteUnfoldSharedComponent.factory() DaggerRemoteUnfoldSharedComponent.factory()
.create( .create(
context, context,
config, config,
mainExecutor, mainExecutor,
mainHandler,
singleThreadBgExecutor, singleThreadBgExecutor,
windowManager, displayManager,
tracingTagPrefix, tracingTagPrefix,
) )

View File

@@ -16,7 +16,6 @@
package com.android.systemui.unfold.progress package com.android.systemui.unfold.progress
import android.os.Trace import android.os.Trace
import android.os.Trace.TRACE_TAG_APP
import android.util.Log import android.util.Log
import androidx.dynamicanimation.animation.DynamicAnimation import androidx.dynamicanimation.animation.DynamicAnimation
import androidx.dynamicanimation.animation.FloatPropertyCompat import androidx.dynamicanimation.animation.FloatPropertyCompat
@@ -110,7 +109,7 @@ class PhysicsBasedUnfoldTransitionProgressProvider @Inject constructor(
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "onFoldUpdate = ${update.name()}") Log.d(TAG, "onFoldUpdate = ${update.name()}")
Trace.traceCounter(Trace.TRACE_TAG_APP, "fold_update", update) Trace.setCounter("fold_update", update.toLong())
} }
} }

View File

@@ -119,7 +119,7 @@ constructor(
"lastHingeAngle: $lastHingeAngle, " + "lastHingeAngle: $lastHingeAngle, " +
"lastHingeAngleBeforeTransition: $lastHingeAngleBeforeTransition" "lastHingeAngleBeforeTransition: $lastHingeAngleBeforeTransition"
) )
Trace.traceCounter(Trace.TRACE_TAG_APP, "hinge_angle", angle.toInt()) Trace.setCounter( "hinge_angle", angle.toLong())
} }
val currentDirection = val currentDirection =

View File

@@ -17,36 +17,32 @@
package com.android.systemui.unfold.updates package com.android.systemui.unfold.updates
import android.content.Context import android.content.Context
import android.hardware.display.DisplayManager
import android.os.Handler
import android.os.RemoteException import android.os.RemoteException
import android.view.IRotationWatcher
import android.view.IWindowManager
import android.view.Surface.Rotation
import com.android.systemui.unfold.dagger.UnfoldMain import com.android.systemui.unfold.dagger.UnfoldMain
import com.android.systemui.unfold.util.CallbackController import com.android.systemui.unfold.util.CallbackController
import java.util.concurrent.Executor
import javax.inject.Inject import javax.inject.Inject
/** /**
* Allows to subscribe to rotation changes. * Allows to subscribe to rotation changes. Updates are provided for the display associated
*
* This is needed as rotation updates from [IWindowManager] are received in a binder thread, while
* most of the times we want them in the main one. Updates are provided for the display associated
* to [context]. * to [context].
*/ */
class RotationChangeProvider class RotationChangeProvider
@Inject @Inject
constructor( constructor(
private val windowManagerInterface: IWindowManager, private val displayManager: DisplayManager,
private val context: Context, private val context: Context,
@UnfoldMain private val mainExecutor: Executor, @UnfoldMain private val mainHandler: Handler,
) : CallbackController<RotationChangeProvider.RotationListener> { ) : CallbackController<RotationChangeProvider.RotationListener> {
private val listeners = mutableListOf<RotationListener>() private val listeners = mutableListOf<RotationListener>()
private val rotationWatcher = RotationWatcher() private val displayListener = RotationDisplayListener()
private var lastRotation: Int? = null
override fun addCallback(listener: RotationListener) { override fun addCallback(listener: RotationListener) {
mainExecutor.execute { mainHandler.post {
if (listeners.isEmpty()) { if (listeners.isEmpty()) {
subscribeToRotation() subscribeToRotation()
} }
@@ -55,17 +51,18 @@ constructor(
} }
override fun removeCallback(listener: RotationListener) { override fun removeCallback(listener: RotationListener) {
mainExecutor.execute { mainHandler.post {
listeners -= listener listeners -= listener
if (listeners.isEmpty()) { if (listeners.isEmpty()) {
unsubscribeToRotation() unsubscribeToRotation()
lastRotation = null
} }
} }
} }
private fun subscribeToRotation() { private fun subscribeToRotation() {
try { try {
windowManagerInterface.watchRotation(rotationWatcher, context.displayId) displayManager.registerDisplayListener(displayListener, mainHandler)
} catch (e: RemoteException) { } catch (e: RemoteException) {
throw e.rethrowFromSystemServer() throw e.rethrowFromSystemServer()
} }
@@ -73,7 +70,7 @@ constructor(
private fun unsubscribeToRotation() { private fun unsubscribeToRotation() {
try { try {
windowManagerInterface.removeRotationWatcher(rotationWatcher) displayManager.unregisterDisplayListener(displayListener)
} catch (e: RemoteException) { } catch (e: RemoteException) {
throw e.rethrowFromSystemServer() throw e.rethrowFromSystemServer()
} }
@@ -82,12 +79,25 @@ constructor(
/** Gets notified of rotation changes. */ /** Gets notified of rotation changes. */
fun interface RotationListener { fun interface RotationListener {
/** Called once rotation changes. */ /** Called once rotation changes. */
fun onRotationChanged(@Rotation newRotation: Int) fun onRotationChanged(newRotation: Int)
} }
private inner class RotationWatcher : IRotationWatcher.Stub() { private inner class RotationDisplayListener : DisplayManager.DisplayListener {
override fun onRotationChanged(rotation: Int) {
mainExecutor.execute { listeners.forEach { it.onRotationChanged(rotation) } } override fun onDisplayChanged(displayId: Int) {
val display = context.display ?: return
if (displayId == display.displayId) {
val currentRotation = display.rotation
if (lastRotation == null || lastRotation != currentRotation) {
listeners.forEach { it.onRotationChanged(currentRotation) }
lastRotation = currentRotation
}
}
} }
override fun onDisplayAdded(displayId: Int) {}
override fun onDisplayRemoved(displayId: Int) {}
} }
} }

View File

@@ -79,10 +79,9 @@ constructor(
companion object { companion object {
fun ContentResolver.areAnimationsEnabled(): Boolean { fun ContentResolver.areAnimationsEnabled(): Boolean {
val animationScale = val animationScale =
Settings.Global.getStringForUser( Settings.Global.getString(
this, this,
Settings.Global.ANIMATOR_DURATION_SCALE, Settings.Global.ANIMATOR_DURATION_SCALE,
this.userId
) )
?.toFloatOrNull() ?.toFloatOrNull()
?: 1f ?: 1f