diff options
| author | 2023-08-03 13:29:42 +0000 | |
|---|---|---|
| committer | 2023-08-03 13:29:42 +0000 | |
| commit | 953513838f841ec8dfe0181c3a40f235c424ddea (patch) | |
| tree | 46246a4bfe687cd7c58c65b4f3fbe23e351a685e | |
| parent | 3479c8b87a76a1a9479f9a434228eefc7deec8ad (diff) | |
| parent | 880aef88d3b0d0207926640e52a4a167ae97c660 (diff) | |
Merge "Check 'DeviceFoldStateProvider' is already started" into udc-qpr-dev am: 880aef88d3
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24025613
Change-Id: Ibcc922d99930147c41b3583efc570c25ce206b74
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
3 files changed, 55 insertions, 3 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt index 86940ca8581b..863ba8d15b47 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt @@ -82,7 +82,9 @@ constructor( ) : LogContextInteractor { init { - foldProvider.start() + applicationScope.launch { + foldProvider.start() + } } override val displayState = diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt index bf54d4297ad8..aa492871a079 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt @@ -20,6 +20,7 @@ import android.content.Context import android.content.res.Configuration import android.content.res.Resources import android.os.Handler +import android.os.Looper import android.testing.AndroidTestingRunner import androidx.core.util.Consumer import androidx.test.filters.SmallTest @@ -38,6 +39,7 @@ import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat +import junit.framework.Assert.fail import java.util.concurrent.Executor import org.junit.Before import org.junit.Test @@ -55,16 +57,20 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Mock private lateinit var activityTypeProvider: ActivityManagerActivityTypeProvider - @Mock private lateinit var handler: Handler - @Mock private lateinit var rotationChangeProvider: RotationChangeProvider @Mock private lateinit var unfoldKeyguardVisibilityProvider: UnfoldKeyguardVisibilityProvider @Mock private lateinit var resources: Resources + @Mock private lateinit var handler: Handler + + @Mock private lateinit var mainLooper: Looper + @Mock private lateinit var context: Context + @Mock private lateinit var thread: Thread + @Captor private lateinit var rotationListener: ArgumentCaptor<RotationListener> private val foldProvider = TestFoldProvider() @@ -89,6 +95,11 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { override val halfFoldedTimeoutMillis: Int get() = HALF_OPENED_TIMEOUT_MILLIS.toInt() } + whenever(mainLooper.isCurrentThread).thenReturn(true) + whenever(handler.looper).thenReturn(mainLooper) + whenever(mainLooper.isCurrentThread).thenReturn(true) + whenever(mainLooper.thread).thenReturn(thread) + whenever(thread.name).thenReturn("backgroundThread") whenever(context.resources).thenReturn(resources) whenever(context.mainExecutor).thenReturn(mContext.mainExecutor) @@ -435,6 +446,26 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { } @Test + fun startOnlyOnce_whenStartTriggeredThrice_startOnlyOnce() { + foldStateProvider.start() + foldStateProvider.start() + foldStateProvider.start() + + assertThat(foldProvider.getNumberOfCallbacks()).isEqualTo(1) + } + + @Test(expected = AssertionError::class) + fun startMethod_whileNotOnMainThread_throwsException() { + whenever(mainLooper.isCurrentThread).thenReturn(true) + try { + foldStateProvider.start() + fail("Should have thrown AssertionError: should be called from the main thread.") + } catch (e: AssertionError) { + assertThat(e.message).contains("backgroundThread") + } + } + + @Test fun startClosingEvent_whileNotOnKeyguard_triggersAfterThreshold() { setKeyguardVisibility(visible = false) setInitialHingeAngle(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) @@ -658,6 +689,10 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { fun notifyFolded(isFolded: Boolean) { callbacks.forEach { it.onFoldUpdated(isFolded) } } + + fun getNumberOfCallbacks(): Int{ + return callbacks.size + } } private class TestScreenOnStatusProvider : ScreenStatusProvider { 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 8c5244e2cf00..6743515c2ec7 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 @@ -62,6 +62,7 @@ constructor( private val hingeAngleListener = HingeAngleListener() private val screenListener = ScreenStatusListener() private val foldStateListener = FoldStateListener() + private val mainLooper = handler.looper private val timeoutRunnable = Runnable { cancelAnimation() } private val rotationListener = RotationListener { if (isTransitionInProgress) cancelAnimation() @@ -77,22 +78,28 @@ constructor( private var isFolded = false private var isScreenOn = false private var isUnfoldHandled = true + private var isStarted = false override fun start() { + assertMainThread() + if (isStarted) return foldProvider.registerCallback(foldStateListener, mainExecutor) screenStatusProvider.addCallback(screenListener) hingeAngleProvider.addCallback(hingeAngleListener) rotationChangeProvider.addCallback(rotationListener) activityTypeProvider.init() + isStarted = true } override fun stop() { + assertMainThread() screenStatusProvider.removeCallback(screenListener) foldProvider.unregisterCallback(foldStateListener) hingeAngleProvider.removeCallback(hingeAngleListener) hingeAngleProvider.stop() rotationChangeProvider.removeCallback(rotationListener) activityTypeProvider.uninit() + isStarted = false } override fun addCallback(listener: FoldUpdatesListener) { @@ -292,6 +299,14 @@ constructor( onHingeAngle(angle) } } + + private fun assertMainThread() { + check(mainLooper.isCurrentThread) { + ("should be called from the main thread." + + " sMainLooper.threadName=" + mainLooper.thread.name + + " Thread.currentThread()=" + Thread.currentThread().name) + } + } } fun @receiver:FoldUpdate Int.name() = |