Loading packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/BottomAreaSection.kt +3 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.core.content.res.ResourcesCompat import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.SceneScope import com.android.keyguard.logging.KeyguardQuickAffordancesLogger import com.android.systemui.animation.view.LaunchableImageView import com.android.systemui.keyguard.ui.binder.KeyguardIndicationAreaBinder import com.android.systemui.keyguard.ui.binder.KeyguardQuickAffordanceViewBinder Loading @@ -55,6 +56,7 @@ constructor( private val vibratorHelper: VibratorHelper, private val indicationController: KeyguardIndicationController, private val indicationAreaViewModel: KeyguardIndicationAreaViewModel, private val shortcutsLogger: KeyguardQuickAffordancesLogger, ) { /** * Renders a single lockscreen shortcut. Loading Loading @@ -162,6 +164,7 @@ constructor( transitionAlpha, falsingManager, vibratorHelper, shortcutsLogger, ) { indicationController.showTransientIndication(it) } Loading packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt +4 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.UserHandle import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.internal.widget.LockPatternUtils import com.android.keyguard.logging.KeyguardQuickAffordancesLogger import com.android.systemui.SysuiTestCase import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.common.shared.model.ContentDescription Loading Loading @@ -86,7 +87,8 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { @Mock private lateinit var launchAnimator: DialogTransitionAnimator @Mock private lateinit var devicePolicyManager: DevicePolicyManager @Mock private lateinit var shadeInteractor: ShadeInteractor @Mock private lateinit var logger: KeyguardQuickAffordancesMetricsLogger @Mock private lateinit var logger: KeyguardQuickAffordancesLogger @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger private val kosmos = testKosmos() Loading Loading @@ -194,6 +196,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { repository = { quickAffordanceRepository }, launchAnimator = launchAnimator, logger = logger, metricsLogger = metricsLogger, devicePolicyManager = devicePolicyManager, dockManager = dockManager, biometricSettingsRepository = biometricSettingsRepository, Loading packages/SystemUI/src/com/android/keyguard/logging/KeyguardQuickAffordancesLogger.kt 0 → 100644 +75 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.keyguard.logging import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.KeyguardQuickAffordancesLog import javax.inject.Inject class KeyguardQuickAffordancesLogger @Inject constructor( @KeyguardQuickAffordancesLog val buffer: LogBuffer, ) { fun logQuickAffordanceTapped(configKey: String?) { val (slotId, affordanceId) = configKey?.decode() ?: ("" to "") buffer.log( TAG, LogLevel.DEBUG, { str1 = affordanceId str2 = slotId }, { "QuickAffordance tapped with id: $str1, in slot: $str2" } ) } fun logQuickAffordanceTriggered(slotId: String, affordanceId: String) { buffer.log( TAG, LogLevel.DEBUG, { str1 = affordanceId str2 = slotId }, { "QuickAffordance triggered with id: $str1, in slot: $str2" } ) } fun logQuickAffordanceSelected(slotId: String, affordanceId: String) { buffer.log( TAG, LogLevel.DEBUG, { str1 = affordanceId str2 = slotId }, { "QuickAffordance selected with id: $str1, in slot: $str2" } ) } private fun String.decode(): Pair<String, String> { val splitUp = this.split(DELIMITER) return Pair(splitUp[0], splitUp[1]) } companion object { private const val TAG = "KeyguardQuickAffordancesLogger" private const val DELIMITER = "::" } } packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt +7 −3 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.util.Log import com.android.app.tracing.coroutines.withContext import com.android.compose.animation.scene.ObservableTransitionState import com.android.internal.widget.LockPatternUtils import com.android.keyguard.logging.KeyguardQuickAffordancesLogger import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.animation.Expandable import com.android.systemui.dagger.SysUISingleton Loading Loading @@ -80,7 +81,8 @@ constructor( private val featureFlags: FeatureFlags, private val repository: Lazy<KeyguardQuickAffordanceRepository>, private val launchAnimator: DialogTransitionAnimator, private val logger: KeyguardQuickAffordancesMetricsLogger, private val logger: KeyguardQuickAffordancesLogger, private val metricsLogger: KeyguardQuickAffordancesMetricsLogger, private val devicePolicyManager: DevicePolicyManager, private val dockManager: DockManager, private val biometricSettingsRepository: BiometricSettingsRepository, Loading Loading @@ -171,7 +173,8 @@ constructor( Log.e(TAG, "Affordance config with key of \"$configKey\" not found!") return } logger.logOnShortcutTriggered(slotId, configKey) logger.logQuickAffordanceTriggered(decodedSlotId, decodedConfigKey) metricsLogger.logOnShortcutTriggered(slotId, configKey) when (val result = config.onTriggered(expandable)) { is KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity -> Loading Loading @@ -223,7 +226,8 @@ constructor( affordanceIds = selections, ) logger.logOnShortcutSelected(slotId, affordanceId) logger.logQuickAffordanceSelected(slotId, affordanceId) metricsLogger.logOnShortcutSelected(slotId, affordanceId) return true } Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import com.android.keyguard.logging.KeyguardQuickAffordancesLogger import com.android.settingslib.Utils import com.android.systemui.animation.Expandable import com.android.systemui.animation.view.LaunchableImageView Loading Loading @@ -74,6 +75,7 @@ object KeyguardQuickAffordanceViewBinder { alpha: Flow<Float>, falsingManager: FalsingManager?, vibratorHelper: VibratorHelper?, logger: KeyguardQuickAffordancesLogger, messageDisplayer: (Int) -> Unit, ): Binding { val button = view as ImageView Loading @@ -89,6 +91,7 @@ object KeyguardQuickAffordanceViewBinder { falsingManager = falsingManager, messageDisplayer = messageDisplayer, vibratorHelper = vibratorHelper, logger = logger, ) } } Loading Loading @@ -131,6 +134,7 @@ object KeyguardQuickAffordanceViewBinder { falsingManager: FalsingManager?, messageDisplayer: (Int) -> Unit, vibratorHelper: VibratorHelper?, logger: KeyguardQuickAffordancesLogger, ) { if (!viewModel.isVisible) { view.isInvisible = true Loading Loading @@ -228,6 +232,7 @@ object KeyguardQuickAffordanceViewBinder { shakeAnimator.start() vibratorHelper?.vibrate(KeyguardBottomAreaVibrations.Shake) logger.logQuickAffordanceTapped(viewModel.configKey) } view.onLongClickListener = OnLongClickListener(falsingManager, viewModel, vibratorHelper, onTouchListener) Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/BottomAreaSection.kt +3 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.core.content.res.ResourcesCompat import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.SceneScope import com.android.keyguard.logging.KeyguardQuickAffordancesLogger import com.android.systemui.animation.view.LaunchableImageView import com.android.systemui.keyguard.ui.binder.KeyguardIndicationAreaBinder import com.android.systemui.keyguard.ui.binder.KeyguardQuickAffordanceViewBinder Loading @@ -55,6 +56,7 @@ constructor( private val vibratorHelper: VibratorHelper, private val indicationController: KeyguardIndicationController, private val indicationAreaViewModel: KeyguardIndicationAreaViewModel, private val shortcutsLogger: KeyguardQuickAffordancesLogger, ) { /** * Renders a single lockscreen shortcut. Loading Loading @@ -162,6 +164,7 @@ constructor( transitionAlpha, falsingManager, vibratorHelper, shortcutsLogger, ) { indicationController.showTransientIndication(it) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt +4 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.UserHandle import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.internal.widget.LockPatternUtils import com.android.keyguard.logging.KeyguardQuickAffordancesLogger import com.android.systemui.SysuiTestCase import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.common.shared.model.ContentDescription Loading Loading @@ -86,7 +87,8 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { @Mock private lateinit var launchAnimator: DialogTransitionAnimator @Mock private lateinit var devicePolicyManager: DevicePolicyManager @Mock private lateinit var shadeInteractor: ShadeInteractor @Mock private lateinit var logger: KeyguardQuickAffordancesMetricsLogger @Mock private lateinit var logger: KeyguardQuickAffordancesLogger @Mock private lateinit var metricsLogger: KeyguardQuickAffordancesMetricsLogger private val kosmos = testKosmos() Loading Loading @@ -194,6 +196,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { repository = { quickAffordanceRepository }, launchAnimator = launchAnimator, logger = logger, metricsLogger = metricsLogger, devicePolicyManager = devicePolicyManager, dockManager = dockManager, biometricSettingsRepository = biometricSettingsRepository, Loading
packages/SystemUI/src/com/android/keyguard/logging/KeyguardQuickAffordancesLogger.kt 0 → 100644 +75 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.keyguard.logging import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.KeyguardQuickAffordancesLog import javax.inject.Inject class KeyguardQuickAffordancesLogger @Inject constructor( @KeyguardQuickAffordancesLog val buffer: LogBuffer, ) { fun logQuickAffordanceTapped(configKey: String?) { val (slotId, affordanceId) = configKey?.decode() ?: ("" to "") buffer.log( TAG, LogLevel.DEBUG, { str1 = affordanceId str2 = slotId }, { "QuickAffordance tapped with id: $str1, in slot: $str2" } ) } fun logQuickAffordanceTriggered(slotId: String, affordanceId: String) { buffer.log( TAG, LogLevel.DEBUG, { str1 = affordanceId str2 = slotId }, { "QuickAffordance triggered with id: $str1, in slot: $str2" } ) } fun logQuickAffordanceSelected(slotId: String, affordanceId: String) { buffer.log( TAG, LogLevel.DEBUG, { str1 = affordanceId str2 = slotId }, { "QuickAffordance selected with id: $str1, in slot: $str2" } ) } private fun String.decode(): Pair<String, String> { val splitUp = this.split(DELIMITER) return Pair(splitUp[0], splitUp[1]) } companion object { private const val TAG = "KeyguardQuickAffordancesLogger" private const val DELIMITER = "::" } }
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt +7 −3 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.util.Log import com.android.app.tracing.coroutines.withContext import com.android.compose.animation.scene.ObservableTransitionState import com.android.internal.widget.LockPatternUtils import com.android.keyguard.logging.KeyguardQuickAffordancesLogger import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.animation.Expandable import com.android.systemui.dagger.SysUISingleton Loading Loading @@ -80,7 +81,8 @@ constructor( private val featureFlags: FeatureFlags, private val repository: Lazy<KeyguardQuickAffordanceRepository>, private val launchAnimator: DialogTransitionAnimator, private val logger: KeyguardQuickAffordancesMetricsLogger, private val logger: KeyguardQuickAffordancesLogger, private val metricsLogger: KeyguardQuickAffordancesMetricsLogger, private val devicePolicyManager: DevicePolicyManager, private val dockManager: DockManager, private val biometricSettingsRepository: BiometricSettingsRepository, Loading Loading @@ -171,7 +173,8 @@ constructor( Log.e(TAG, "Affordance config with key of \"$configKey\" not found!") return } logger.logOnShortcutTriggered(slotId, configKey) logger.logQuickAffordanceTriggered(decodedSlotId, decodedConfigKey) metricsLogger.logOnShortcutTriggered(slotId, configKey) when (val result = config.onTriggered(expandable)) { is KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity -> Loading Loading @@ -223,7 +226,8 @@ constructor( affordanceIds = selections, ) logger.logOnShortcutSelected(slotId, affordanceId) logger.logQuickAffordanceSelected(slotId, affordanceId) metricsLogger.logOnShortcutSelected(slotId, affordanceId) return true } Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import com.android.keyguard.logging.KeyguardQuickAffordancesLogger import com.android.settingslib.Utils import com.android.systemui.animation.Expandable import com.android.systemui.animation.view.LaunchableImageView Loading Loading @@ -74,6 +75,7 @@ object KeyguardQuickAffordanceViewBinder { alpha: Flow<Float>, falsingManager: FalsingManager?, vibratorHelper: VibratorHelper?, logger: KeyguardQuickAffordancesLogger, messageDisplayer: (Int) -> Unit, ): Binding { val button = view as ImageView Loading @@ -89,6 +91,7 @@ object KeyguardQuickAffordanceViewBinder { falsingManager = falsingManager, messageDisplayer = messageDisplayer, vibratorHelper = vibratorHelper, logger = logger, ) } } Loading Loading @@ -131,6 +134,7 @@ object KeyguardQuickAffordanceViewBinder { falsingManager: FalsingManager?, messageDisplayer: (Int) -> Unit, vibratorHelper: VibratorHelper?, logger: KeyguardQuickAffordancesLogger, ) { if (!viewModel.isVisible) { view.isInvisible = true Loading Loading @@ -228,6 +232,7 @@ object KeyguardQuickAffordanceViewBinder { shakeAnimator.start() vibratorHelper?.vibrate(KeyguardBottomAreaVibrations.Shake) logger.logQuickAffordanceTapped(viewModel.configKey) } view.onLongClickListener = OnLongClickListener(falsingManager, viewModel, vibratorHelper, onTouchListener) Loading