From 7050e1ca57ca600433211a229436e152fdf25955 Mon Sep 17 00:00:00 2001 From: Brad Hinegardner Date: Mon, 14 Nov 2022 12:19:21 -0500 Subject: [PATCH 1/3] Create Camera Prebuilt quick affordance Bug: 254333599 Test: New Unit test, verified manually via toggling flag and activating camera quick affordance Change-Id: I957a504c2694051f44b4aae6280945f6ce640682 --- .../src/com/android/systemui/flags/Flags.kt | 4 +- .../BuiltInKeyguardQuickAffordanceKeys.kt | 1 + .../CameraQuickAffordanceConfig.kt | 62 +++++++++++++++++++ .../KeyguardDataQuickAffordanceModule.kt | 2 + .../CameraQuickAffordanceConfigTest.kt | 61 ++++++++++++++++++ 5 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt create mode 100644 packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfigTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 19fd25db8349a..fe49d80a9cba6 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -158,9 +158,9 @@ object Flags { /** * Whether to enable the code powering customizable lock screen quick affordances. * - * Note that this flag does not enable individual implementations of quick affordances like the - * new camera quick affordance. Look for individual flags for those. + * This flag enables any new prebuilt quick affordances as well. */ + // TODO(b/255618149): Tracking Bug @JvmField val CUSTOMIZABLE_LOCK_SCREEN_QUICK_AFFORDANCES = unreleasedFlag(216, "customizable_lock_screen_quick_affordances", teamfood = false) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/BuiltInKeyguardQuickAffordanceKeys.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/BuiltInKeyguardQuickAffordanceKeys.kt index a069582f6692f..f5220b8fae92e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/BuiltInKeyguardQuickAffordanceKeys.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/BuiltInKeyguardQuickAffordanceKeys.kt @@ -24,6 +24,7 @@ package com.android.systemui.keyguard.data.quickaffordance */ object BuiltInKeyguardQuickAffordanceKeys { // Please keep alphabetical order of const names to simplify future maintenance. + const val CAMERA = "camera" const val HOME_CONTROLS = "home" const val QR_CODE_SCANNER = "qr_code_scanner" const val QUICK_ACCESS_WALLET = "wallet" diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt new file mode 100644 index 0000000000000..b7a34370165ec --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.android.systemui.keyguard.data.quickaffordance + +import android.app.StatusBarManager +import android.content.Context +import com.android.systemui.R +import com.android.systemui.animation.Expandable +import com.android.systemui.camera.CameraGestureHelper +import com.android.systemui.common.shared.model.ContentDescription +import com.android.systemui.common.shared.model.Icon +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import javax.inject.Inject + +@SysUISingleton +class CameraQuickAffordanceConfig @Inject constructor( + @Application private val context: Context, + private val cameraGestureHelper: CameraGestureHelper, +) : KeyguardQuickAffordanceConfig { + + override val key: String + get() = BuiltInKeyguardQuickAffordanceKeys.CAMERA + + override val pickerName: String + get() = context.getString(R.string.accessibility_camera_button) + + override val pickerIconResourceId: Int + get() = com.android.internal.R.drawable.perm_group_camera + + override val lockScreenState: Flow + get() = flowOf( + KeyguardQuickAffordanceConfig.LockScreenState.Visible( + icon = Icon.Resource( + com.android.internal.R.drawable.perm_group_camera, + ContentDescription.Resource(R.string.accessibility_camera_button) + ) + ) + ) + + override fun onTriggered(expandable: Expandable?): KeyguardQuickAffordanceConfig.OnTriggeredResult { + cameraGestureHelper.launchCamera(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) + return KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardDataQuickAffordanceModule.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardDataQuickAffordanceModule.kt index bea9363efc81e..f7225a249eda7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardDataQuickAffordanceModule.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardDataQuickAffordanceModule.kt @@ -29,8 +29,10 @@ object KeyguardDataQuickAffordanceModule { home: HomeControlsKeyguardQuickAffordanceConfig, quickAccessWallet: QuickAccessWalletKeyguardQuickAffordanceConfig, qrCodeScanner: QrCodeScannerKeyguardQuickAffordanceConfig, + camera: CameraQuickAffordanceConfig, ): Set { return setOf( + camera, home, quickAccessWallet, qrCodeScanner, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfigTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfigTest.kt new file mode 100644 index 0000000000000..0292cc60a2e51 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfigTest.kt @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.android.systemui.keyguard.data.quickaffordance + +import android.app.StatusBarManager +import android.content.Context +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.camera.CameraGestureHelper +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(JUnit4::class) +class CameraQuickAffordanceConfigTest : SysuiTestCase() { + + @Mock private lateinit var cameraGestureHelper: CameraGestureHelper + @Mock private lateinit var context: Context + private lateinit var underTest: CameraQuickAffordanceConfig + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + underTest = CameraQuickAffordanceConfig( + context, + cameraGestureHelper, + ) + } + + @Test + fun `affordance triggered -- camera launch called`() { + //when + val result = underTest.onTriggered(null) + + //then + verify(cameraGestureHelper) + .launchCamera(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) + assertEquals(KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled, result) + } +} \ No newline at end of file From cee121b9ee4dba617b3f300edc24222abe2b2b9b Mon Sep 17 00:00:00 2001 From: Brad Hinegardner Date: Mon, 14 Nov 2022 17:04:26 -0500 Subject: [PATCH 2/3] Add additional Camera Launch Source to StatusBarManager to not conflict with camera double tap gesture source Bug: 254333599 Test: New Unit test, verified manually via toggling flag and activating camera quick affordance Change-Id: I3390a5baabc20a194198b8b81481aee9debde8ba --- core/java/android/app/StatusBarManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index ae0fc09e35a64..719b5b64bbff9 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -229,6 +229,8 @@ public class StatusBarManager { public static final int CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP = 1; /** @hide */ public static final int CAMERA_LAUNCH_SOURCE_LIFT_TRIGGER = 2; + /** @hide */ + public static final int CAMERA_LAUNCH_SOURCE_QUICK_AFFORDANCE = 3; /** * Session flag for {@link #registerSessionListener} indicating the listener From 69fd6af185a0664c3d09916accafd359c2cea9f3 Mon Sep 17 00:00:00 2001 From: Brad Hinegardner Date: Mon, 14 Nov 2022 18:00:16 -0500 Subject: [PATCH 3/3] Change source of camera quick affordance launch Bug: 254333599 Test: Unit test, verified manually via toggling flag and activating camera quick affordance Change-Id: I2888dd87eeef2cae51e1d602f2051bb76dda07a7 --- .../data/quickaffordance/CameraQuickAffordanceConfig.kt | 2 +- .../data/quickaffordance/CameraQuickAffordanceConfigTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt index b7a34370165ec..3c09aab604434 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt @@ -56,7 +56,7 @@ class CameraQuickAffordanceConfig @Inject constructor( ) override fun onTriggered(expandable: Expandable?): KeyguardQuickAffordanceConfig.OnTriggeredResult { - cameraGestureHelper.launchCamera(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) + cameraGestureHelper.launchCamera(StatusBarManager.CAMERA_LAUNCH_SOURCE_QUICK_AFFORDANCE) return KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled } } \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfigTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfigTest.kt index 0292cc60a2e51..623becf166d36 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfigTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfigTest.kt @@ -55,7 +55,7 @@ class CameraQuickAffordanceConfigTest : SysuiTestCase() { //then verify(cameraGestureHelper) - .launchCamera(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) + .launchCamera(StatusBarManager.CAMERA_LAUNCH_SOURCE_QUICK_AFFORDANCE) assertEquals(KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled, result) } } \ No newline at end of file