Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d88db21 authored by Helen Cheuk's avatar Helen Cheuk Committed by Android (Google) Code Review
Browse files

Merge "[Contextual Edu] Log metrics when education is triggered" into main

parents 96ccd38c 90dd9597
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -187,7 +187,7 @@ class KeyboardTouchpadEduInteractorTest(private val gestureType: GestureType) :
                        signalCount = 1,
                        usageSessionStartTime = secondSignalReceivedTime,
                        userId = 0,
                        gestureType = gestureType
                        gestureType = gestureType,
                    )
                )
        }
@@ -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() }
+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,
        )
    }
}
+5 −1
Original line number Diff line number Diff line
@@ -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
@@ -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 {

@@ -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)
                    }
                }
        }
+5 −2
Original line number Diff line number Diff line
@@ -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
@@ -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>() }