Merge "Quick affordances crash fix for secondary users." into tm-qpr-dev am: a0c0dd2b19

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

Change-Id: I33509e7736d9e4976efb75e8093d57738852fcc8
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Ale Nijamkin
2023-01-26 15:03:50 +00:00
committed by Automerger Merge Worker
6 changed files with 26 additions and 12 deletions

View File

@@ -52,6 +52,10 @@ A picker experience may:
* Unselect an already-selected quick affordance from a slot * Unselect an already-selected quick affordance from a slot
* Unselect all already-selected quick affordances from a slot * Unselect all already-selected quick affordances from a slot
## Testing
* Add a unit test for your implementation of `KeyguardQuickAffordanceConfig`
* Manually verify that your implementation works in multi-user environments from both the main user and a secondary user
## Debugging ## Debugging
To see the current state of the system, you can run `dumpsys`: To see the current state of the system, you can run `dumpsys`:

View File

@@ -31,10 +31,12 @@ import android.os.Bundle
import android.util.Log import android.util.Log
import com.android.systemui.SystemUIAppComponentFactoryBase import com.android.systemui.SystemUIAppComponentFactoryBase
import com.android.systemui.SystemUIAppComponentFactoryBase.ContextAvailableCallback import com.android.systemui.SystemUIAppComponentFactoryBase.ContextAvailableCallback
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor
import com.android.systemui.keyguard.ui.preview.KeyguardRemotePreviewManager import com.android.systemui.keyguard.ui.preview.KeyguardRemotePreviewManager
import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
class CustomizationProvider : class CustomizationProvider :
@@ -42,6 +44,7 @@ class CustomizationProvider :
@Inject lateinit var interactor: KeyguardQuickAffordanceInteractor @Inject lateinit var interactor: KeyguardQuickAffordanceInteractor
@Inject lateinit var previewManager: KeyguardRemotePreviewManager @Inject lateinit var previewManager: KeyguardRemotePreviewManager
@Inject @Main lateinit var mainDispatcher: CoroutineDispatcher
private lateinit var contextAvailableCallback: ContextAvailableCallback private lateinit var contextAvailableCallback: ContextAvailableCallback
@@ -138,12 +141,14 @@ class CustomizationProvider :
selectionArgs: Array<out String>?, selectionArgs: Array<out String>?,
sortOrder: String?, sortOrder: String?,
): Cursor? { ): Cursor? {
return when (uriMatcher.match(uri)) { return runBlocking(mainDispatcher) {
MATCH_CODE_ALL_AFFORDANCES -> runBlocking { queryAffordances() } when (uriMatcher.match(uri)) {
MATCH_CODE_ALL_SLOTS -> querySlots() MATCH_CODE_ALL_AFFORDANCES -> queryAffordances()
MATCH_CODE_ALL_SELECTIONS -> runBlocking { querySelections() } MATCH_CODE_ALL_SLOTS -> querySlots()
MATCH_CODE_ALL_FLAGS -> queryFlags() MATCH_CODE_ALL_SELECTIONS -> querySelections()
else -> null MATCH_CODE_ALL_FLAGS -> queryFlags()
else -> null
}
} }
} }

View File

@@ -19,6 +19,7 @@ package com.android.systemui.keyguard.data.quickaffordance
import android.app.StatusBarManager import android.app.StatusBarManager
import android.content.Context import android.content.Context
import android.content.pm.PackageManager
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.animation.Expandable import com.android.systemui.animation.Expandable
import com.android.systemui.camera.CameraGestureHelper import com.android.systemui.camera.CameraGestureHelper
@@ -26,7 +27,6 @@ import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.Icon
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.statusbar.StatusBarState
import dagger.Lazy import dagger.Lazy
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -37,6 +37,7 @@ class CameraQuickAffordanceConfig
@Inject @Inject
constructor( constructor(
@Application private val context: Context, @Application private val context: Context,
private val packageManager: PackageManager,
private val cameraGestureHelper: Lazy<CameraGestureHelper>, private val cameraGestureHelper: Lazy<CameraGestureHelper>,
) : KeyguardQuickAffordanceConfig { ) : KeyguardQuickAffordanceConfig {
@@ -79,6 +80,6 @@ constructor(
} }
private fun isLaunchable(): Boolean { private fun isLaunchable(): Boolean {
return cameraGestureHelper.get().canCameraGestureBeLaunched(StatusBarState.KEYGUARD) return packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
} }
} }

View File

@@ -17,7 +17,6 @@
package com.android.systemui.statusbar.policy; package com.android.systemui.statusbar.policy;
import android.annotation.WorkerThread; import android.annotation.WorkerThread;
import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraCharacteristics;
@@ -255,7 +254,6 @@ public class FlashlightControllerImpl implements FlashlightController {
setTorchMode(enabled); setTorchMode(enabled);
mSecureSettings.putInt(Settings.Secure.FLASHLIGHT_AVAILABLE, 1); mSecureSettings.putInt(Settings.Secure.FLASHLIGHT_AVAILABLE, 1);
mSecureSettings.putInt(Secure.FLASHLIGHT_ENABLED, enabled ? 1 : 0); mSecureSettings.putInt(Secure.FLASHLIGHT_ENABLED, enabled ? 1 : 0);
mBroadcastSender.sendBroadcast(new Intent(ACTION_FLASHLIGHT_CHANGED));
} }
} }

View File

@@ -62,6 +62,7 @@ import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@@ -184,6 +185,7 @@ class CustomizationProviderTest : SysuiTestCase() {
mainDispatcher = testDispatcher, mainDispatcher = testDispatcher,
backgroundHandler = backgroundHandler, backgroundHandler = backgroundHandler,
) )
underTest.mainDispatcher = UnconfinedTestDispatcher()
underTest.attachInfoForTesting( underTest.attachInfoForTesting(
context, context,

View File

@@ -19,6 +19,7 @@ package com.android.systemui.keyguard.data.quickaffordance
import android.app.StatusBarManager import android.app.StatusBarManager
import android.content.Context import android.content.Context
import android.content.pm.PackageManager
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.camera.CameraGestureHelper import com.android.systemui.camera.CameraGestureHelper
@@ -32,7 +33,6 @@ import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.junit.runners.JUnit4 import org.junit.runners.JUnit4
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@@ -43,16 +43,19 @@ class CameraQuickAffordanceConfigTest : SysuiTestCase() {
@Mock private lateinit var cameraGestureHelper: CameraGestureHelper @Mock private lateinit var cameraGestureHelper: CameraGestureHelper
@Mock private lateinit var context: Context @Mock private lateinit var context: Context
@Mock private lateinit var packageManager: PackageManager
private lateinit var underTest: CameraQuickAffordanceConfig private lateinit var underTest: CameraQuickAffordanceConfig
@Before @Before
fun setUp() { fun setUp() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
setLaunchable(true)
underTest = underTest =
CameraQuickAffordanceConfig( CameraQuickAffordanceConfig(
context, context,
packageManager,
) { ) {
cameraGestureHelper cameraGestureHelper
} }
@@ -86,6 +89,7 @@ class CameraQuickAffordanceConfigTest : SysuiTestCase() {
} }
private fun setLaunchable(isLaunchable: Boolean) { private fun setLaunchable(isLaunchable: Boolean) {
whenever(cameraGestureHelper.canCameraGestureBeLaunched(anyInt())).thenReturn(isLaunchable) whenever(packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY))
.thenReturn(isLaunchable)
} }
} }