Merge "Quick affordances crash fix for secondary users." into tm-qpr-dev
This commit is contained in:
@@ -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`:
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user