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:
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"],
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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) {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user