Loading packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt +24 −1 Original line number Diff line number Diff line Loading @@ -187,7 +187,7 @@ class KeyboardTouchpadEduInteractorTest(private val gestureType: GestureType) : signalCount = 1, usageSessionStartTime = secondSignalReceivedTime, userId = 0, gestureType = gestureType gestureType = gestureType, ) ) } Loading Loading @@ -402,6 +402,29 @@ class KeyboardTouchpadEduInteractorTest(private val gestureType: GestureType) : eduClock.offset(initialDelayElapsedDuration) } fun logMetricsForToastEducation() = testScope.runTest { triggerMaxEducationSignals(gestureType) runCurrent() verify(kosmos.mockEduMetricsLogger) .logContextualEducationTriggered(gestureType, EducationUiType.Toast) } @Test fun logMetricsForNotificationEducation() = testScope.runTest { triggerMaxEducationSignals(gestureType) runCurrent() eduClock.offset(minDurationForNextEdu) triggerMaxEducationSignals(gestureType) runCurrent() verify(kosmos.mockEduMetricsLogger) .logContextualEducationTriggered(gestureType, EducationUiType.Notification) } @After fun clear() { testScope.launch { tutorialSchedulerRepository.clearDataStore() } Loading packages/SystemUI/src/com/android/systemui/education/ContextualEducationMetricsLogger.kt 0 → 100644 +49 −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.systemui.education import com.android.systemui.contextualeducation.GestureType import com.android.systemui.education.shared.model.EducationUiType import com.android.systemui.shared.system.SysUiStatsLog import javax.inject.Inject class ContextualEducationMetricsLogger @Inject constructor() { fun logContextualEducationTriggered(gestureType: GestureType, uiType: EducationUiType) { val statsGestureType = when (gestureType) { GestureType.BACK -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__BACK GestureType.HOME -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__HOME GestureType.OVERVIEW -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__OVERVIEW GestureType.ALL_APPS -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__ALL_APPS } val statsEducationType = when (uiType) { EducationUiType.Toast -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__EDUCATION_TYPE__TOAST EducationUiType.Notification -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__EDUCATION_TYPE__NOTIFICATION } SysUiStatsLog.write( SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED, statsGestureType, statsEducationType, ) } } packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt +5 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.systemui.contextualeducation.GestureType import com.android.systemui.contextualeducation.GestureType.ALL_APPS import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.education.ContextualEducationMetricsLogger import com.android.systemui.education.dagger.ContextualEducationModule.EduClock import com.android.systemui.education.data.model.GestureEduModel import com.android.systemui.education.shared.model.EducationInfo Loading Loading @@ -62,6 +63,7 @@ constructor( private val userInputDeviceRepository: UserInputDeviceRepository, private val tutorialRepository: TutorialSchedulerRepository, private val overviewProxyService: OverviewProxyService, private val metricsLogger: ContextualEducationMetricsLogger, @EduClock private val clock: Clock, ) : CoreStartable { Loading Loading @@ -129,9 +131,11 @@ constructor( if (isUsageSessionExpired(it)) { contextualEducationInteractor.startNewUsageSession(it.gestureType) } else if (isEducationNeeded(it)) { val educationType = getEduType(it) _educationTriggered.value = EducationInfo(it.gestureType, getEduType(it), it.userId) EducationInfo(it.gestureType, educationType, it.userId) contextualEducationInteractor.updateOnEduTriggered(it.gestureType) metricsLogger.logContextualEducationTriggered(it.gestureType, educationType) } } } Loading packages/SystemUI/tests/utils/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorKosmos.kt +5 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.education.domain.interactor import android.hardware.input.InputManager import com.android.systemui.education.ContextualEducationMetricsLogger import com.android.systemui.education.data.repository.fakeEduClock import com.android.systemui.inputdevice.data.repository.UserInputDeviceRepository import com.android.systemui.inputdevice.tutorial.tutorialSchedulerRepository Loading @@ -41,11 +42,13 @@ var Kosmos.keyboardTouchpadEduInteractor by touchpadRepository, userRepository, ), tutorialSchedulerRepository, mockOverviewProxyService, tutorialRepository = tutorialSchedulerRepository, overviewProxyService = mockOverviewProxyService, metricsLogger = mockEduMetricsLogger, clock = fakeEduClock, ) } var Kosmos.mockEduMetricsLogger by Kosmos.Fixture { mock<ContextualEducationMetricsLogger>() } var Kosmos.mockOverviewProxyService by Kosmos.Fixture { mock<OverviewProxyService>() } var Kosmos.mockEduInputManager by Kosmos.Fixture { mock<InputManager>() } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt +24 −1 Original line number Diff line number Diff line Loading @@ -187,7 +187,7 @@ class KeyboardTouchpadEduInteractorTest(private val gestureType: GestureType) : signalCount = 1, usageSessionStartTime = secondSignalReceivedTime, userId = 0, gestureType = gestureType gestureType = gestureType, ) ) } Loading Loading @@ -402,6 +402,29 @@ class KeyboardTouchpadEduInteractorTest(private val gestureType: GestureType) : eduClock.offset(initialDelayElapsedDuration) } fun logMetricsForToastEducation() = testScope.runTest { triggerMaxEducationSignals(gestureType) runCurrent() verify(kosmos.mockEduMetricsLogger) .logContextualEducationTriggered(gestureType, EducationUiType.Toast) } @Test fun logMetricsForNotificationEducation() = testScope.runTest { triggerMaxEducationSignals(gestureType) runCurrent() eduClock.offset(minDurationForNextEdu) triggerMaxEducationSignals(gestureType) runCurrent() verify(kosmos.mockEduMetricsLogger) .logContextualEducationTriggered(gestureType, EducationUiType.Notification) } @After fun clear() { testScope.launch { tutorialSchedulerRepository.clearDataStore() } Loading
packages/SystemUI/src/com/android/systemui/education/ContextualEducationMetricsLogger.kt 0 → 100644 +49 −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.systemui.education import com.android.systemui.contextualeducation.GestureType import com.android.systemui.education.shared.model.EducationUiType import com.android.systemui.shared.system.SysUiStatsLog import javax.inject.Inject class ContextualEducationMetricsLogger @Inject constructor() { fun logContextualEducationTriggered(gestureType: GestureType, uiType: EducationUiType) { val statsGestureType = when (gestureType) { GestureType.BACK -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__BACK GestureType.HOME -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__HOME GestureType.OVERVIEW -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__OVERVIEW GestureType.ALL_APPS -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__ALL_APPS } val statsEducationType = when (uiType) { EducationUiType.Toast -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__EDUCATION_TYPE__TOAST EducationUiType.Notification -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__EDUCATION_TYPE__NOTIFICATION } SysUiStatsLog.write( SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED, statsGestureType, statsEducationType, ) } }
packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt +5 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.systemui.contextualeducation.GestureType import com.android.systemui.contextualeducation.GestureType.ALL_APPS import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.education.ContextualEducationMetricsLogger import com.android.systemui.education.dagger.ContextualEducationModule.EduClock import com.android.systemui.education.data.model.GestureEduModel import com.android.systemui.education.shared.model.EducationInfo Loading Loading @@ -62,6 +63,7 @@ constructor( private val userInputDeviceRepository: UserInputDeviceRepository, private val tutorialRepository: TutorialSchedulerRepository, private val overviewProxyService: OverviewProxyService, private val metricsLogger: ContextualEducationMetricsLogger, @EduClock private val clock: Clock, ) : CoreStartable { Loading Loading @@ -129,9 +131,11 @@ constructor( if (isUsageSessionExpired(it)) { contextualEducationInteractor.startNewUsageSession(it.gestureType) } else if (isEducationNeeded(it)) { val educationType = getEduType(it) _educationTriggered.value = EducationInfo(it.gestureType, getEduType(it), it.userId) EducationInfo(it.gestureType, educationType, it.userId) contextualEducationInteractor.updateOnEduTriggered(it.gestureType) metricsLogger.logContextualEducationTriggered(it.gestureType, educationType) } } } Loading
packages/SystemUI/tests/utils/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorKosmos.kt +5 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.education.domain.interactor import android.hardware.input.InputManager import com.android.systemui.education.ContextualEducationMetricsLogger import com.android.systemui.education.data.repository.fakeEduClock import com.android.systemui.inputdevice.data.repository.UserInputDeviceRepository import com.android.systemui.inputdevice.tutorial.tutorialSchedulerRepository Loading @@ -41,11 +42,13 @@ var Kosmos.keyboardTouchpadEduInteractor by touchpadRepository, userRepository, ), tutorialSchedulerRepository, mockOverviewProxyService, tutorialRepository = tutorialSchedulerRepository, overviewProxyService = mockOverviewProxyService, metricsLogger = mockEduMetricsLogger, clock = fakeEduClock, ) } var Kosmos.mockEduMetricsLogger by Kosmos.Fixture { mock<ContextualEducationMetricsLogger>() } var Kosmos.mockOverviewProxyService by Kosmos.Fixture { mock<OverviewProxyService>() } var Kosmos.mockEduInputManager by Kosmos.Fixture { mock<InputManager>() }