diff options
16 files changed, 61 insertions, 56 deletions
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 2f90cccec775..0c93c4427166 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -575,6 +575,7 @@ android_library { "TraceurCommon", "Traceur-res", "//frameworks/libs/systemui:motion_tool_lib", + "//frameworks/libs/systemui:contextualeducationlib", "notification_flags_lib", "PlatformComposeCore", "PlatformComposeSceneTransitionLayout", @@ -735,6 +736,7 @@ android_library { "WindowManager-Shell", "LowLightDreamLib", "//frameworks/libs/systemui:motion_tool_lib", + "//frameworks/libs/systemui:contextualeducationlib", "androidx.core_core-animation-testing", "androidx.compose.ui_ui", "flag-junit", diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/data/repository/ContextualEducationRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/data/repository/ContextualEducationRepositoryTest.kt index 3a4b14b81e07..331db525c4ee 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/data/repository/ContextualEducationRepositoryTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/data/repository/ContextualEducationRepositoryTest.kt @@ -22,10 +22,10 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestableContext import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.contextualeducation.GestureType.BACK import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope -import com.android.systemui.shared.education.GestureType.BACK_GESTURE import com.google.common.truth.Truth.assertThat import java.io.File import java.time.Clock @@ -70,8 +70,8 @@ class ContextualEducationRepositoryTest : SysuiTestCase() { fun changeRetrievedValueForNewUser() = testScope.runTest { // Update data for old user. - underTest.incrementSignalCount(BACK_GESTURE) - val model by collectLastValue(underTest.readGestureEduModelFlow(BACK_GESTURE)) + underTest.incrementSignalCount(BACK) + val model by collectLastValue(underTest.readGestureEduModelFlow(BACK)) assertThat(model?.signalCount).isEqualTo(1) // User is changed. @@ -83,17 +83,17 @@ class ContextualEducationRepositoryTest : SysuiTestCase() { @Test fun incrementSignalCount() = testScope.runTest { - underTest.incrementSignalCount(BACK_GESTURE) - val model by collectLastValue(underTest.readGestureEduModelFlow(BACK_GESTURE)) + underTest.incrementSignalCount(BACK) + val model by collectLastValue(underTest.readGestureEduModelFlow(BACK)) assertThat(model?.signalCount).isEqualTo(1) } @Test fun dataAddedOnUpdateShortcutTriggerTime() = testScope.runTest { - val model by collectLastValue(underTest.readGestureEduModelFlow(BACK_GESTURE)) + val model by collectLastValue(underTest.readGestureEduModelFlow(BACK)) assertThat(model?.lastShortcutTriggeredTime).isNull() - underTest.updateShortcutTriggerTime(BACK_GESTURE) + underTest.updateShortcutTriggerTime(BACK) assertThat(model?.lastShortcutTriggeredTime).isEqualTo(clock.instant()) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt index 01dbc6bf396c..ae3302ca658d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt @@ -20,10 +20,10 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.contextualeducation.GestureType +import com.android.systemui.contextualeducation.GestureType.BACK import com.android.systemui.education.data.repository.contextualEducationRepository import com.android.systemui.kosmos.testScope -import com.android.systemui.shared.education.GestureType -import com.android.systemui.shared.education.GestureType.BACK_GESTURE import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest @@ -47,15 +47,15 @@ class KeyboardTouchpadEduInteractorTest : SysuiTestCase() { @Test fun newEducationInfoOnMaxSignalCountReached() = testScope.runTest { - tryTriggeringEducation(BACK_GESTURE) + tryTriggeringEducation(BACK) val model by collectLastValue(underTest.educationTriggered) - assertThat(model?.gestureType).isEqualTo(BACK_GESTURE) + assertThat(model?.gestureType).isEqualTo(BACK) } @Test fun noEducationInfoBeforeMaxSignalCountReached() = testScope.runTest { - repository.incrementSignalCount(BACK_GESTURE) + repository.incrementSignalCount(BACK) val model by collectLastValue(underTest.educationTriggered) assertThat(model).isNull() } @@ -64,8 +64,8 @@ class KeyboardTouchpadEduInteractorTest : SysuiTestCase() { fun noEducationInfoWhenShortcutTriggeredPreviously() = testScope.runTest { val model by collectLastValue(underTest.educationTriggered) - repository.updateShortcutTriggerTime(BACK_GESTURE) - tryTriggeringEducation(BACK_GESTURE) + repository.updateShortcutTriggerTime(BACK) + tryTriggeringEducation(BACK) assertThat(model).isNull() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt index ee51e37faba7..cd0c58feebed 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadStatsInteractorTest.kt @@ -20,10 +20,10 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.contextualeducation.GestureType.BACK import com.android.systemui.education.data.repository.contextualEducationRepository import com.android.systemui.education.data.repository.fakeEduClock import com.android.systemui.kosmos.testScope -import com.android.systemui.shared.education.GestureType.BACK_GESTURE import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest @@ -41,11 +41,9 @@ class KeyboardTouchpadStatsInteractorTest : SysuiTestCase() { fun dataUpdatedOnIncrementSignalCount() = testScope.runTest { val model by - collectLastValue( - kosmos.contextualEducationRepository.readGestureEduModelFlow(BACK_GESTURE) - ) + collectLastValue(kosmos.contextualEducationRepository.readGestureEduModelFlow(BACK)) val originalValue = model!!.signalCount - underTest.incrementSignalCount(BACK_GESTURE) + underTest.incrementSignalCount(BACK) assertThat(model?.signalCount).isEqualTo(originalValue + 1) } @@ -53,11 +51,9 @@ class KeyboardTouchpadStatsInteractorTest : SysuiTestCase() { fun dataAddedOnUpdateShortcutTriggerTime() = testScope.runTest { val model by - collectLastValue( - kosmos.contextualEducationRepository.readGestureEduModelFlow(BACK_GESTURE) - ) + collectLastValue(kosmos.contextualEducationRepository.readGestureEduModelFlow(BACK)) assertThat(model?.lastShortcutTriggeredTime).isNull() - underTest.updateShortcutTriggerTime(BACK_GESTURE) + underTest.updateShortcutTriggerTime(BACK) assertThat(model?.lastShortcutTriggeredTime).isEqualTo(kosmos.fakeEduClock.instant()) } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/education/GestureType.kt b/packages/SystemUI/shared/src/com/android/systemui/shared/education/GestureType.kt deleted file mode 100644 index 9a5c77ac1679..000000000000 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/education/GestureType.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 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.shared.education - -enum class GestureType { - BACK_GESTURE, -} diff --git a/packages/SystemUI/src/com/android/systemui/education/dagger/ContextualEducationModule.kt b/packages/SystemUI/src/com/android/systemui/education/dagger/ContextualEducationModule.kt index b8019ab9ce0c..532b123663ad 100644 --- a/packages/SystemUI/src/com/android/systemui/education/dagger/ContextualEducationModule.kt +++ b/packages/SystemUI/src/com/android/systemui/education/dagger/ContextualEducationModule.kt @@ -19,13 +19,13 @@ package com.android.systemui.education.dagger import com.android.systemui.CoreStartable import com.android.systemui.Flags import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.contextualeducation.GestureType import com.android.systemui.education.data.repository.ContextualEducationRepository import com.android.systemui.education.data.repository.ContextualEducationRepositoryImpl import com.android.systemui.education.domain.interactor.ContextualEducationInteractor import com.android.systemui.education.domain.interactor.KeyboardTouchpadEduInteractor import com.android.systemui.education.domain.interactor.KeyboardTouchpadEduStatsInteractor import com.android.systemui.education.domain.interactor.KeyboardTouchpadEduStatsInteractorImpl -import com.android.systemui.shared.education.GestureType import dagger.Binds import dagger.Lazy import dagger.Module diff --git a/packages/SystemUI/src/com/android/systemui/education/data/repository/ContextualEducationRepository.kt b/packages/SystemUI/src/com/android/systemui/education/data/repository/ContextualEducationRepository.kt index 248b7a526256..52ccba4b65c7 100644 --- a/packages/SystemUI/src/com/android/systemui/education/data/repository/ContextualEducationRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/education/data/repository/ContextualEducationRepository.kt @@ -17,9 +17,9 @@ package com.android.systemui.education.data.repository import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.contextualeducation.GestureType import com.android.systemui.education.dagger.ContextualEducationModule.EduClock import com.android.systemui.education.data.model.GestureEduModel -import com.android.systemui.shared.education.GestureType import java.time.Clock import javax.inject.Inject import kotlinx.coroutines.flow.Flow diff --git a/packages/SystemUI/src/com/android/systemui/education/data/repository/UserContextualEducationRepository.kt b/packages/SystemUI/src/com/android/systemui/education/data/repository/UserContextualEducationRepository.kt index b7fc7733f3e6..4b37b29e88a5 100644 --- a/packages/SystemUI/src/com/android/systemui/education/data/repository/UserContextualEducationRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/education/data/repository/UserContextualEducationRepository.kt @@ -27,9 +27,9 @@ import androidx.datastore.preferences.core.longPreferencesKey import androidx.datastore.preferences.preferencesDataStoreFile import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.contextualeducation.GestureType import com.android.systemui.education.dagger.ContextualEducationModule.EduDataStoreScope import com.android.systemui.education.data.model.GestureEduModel -import com.android.systemui.shared.education.GestureType import java.time.Instant import javax.inject.Inject import javax.inject.Provider diff --git a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/ContextualEducationInteractor.kt b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/ContextualEducationInteractor.kt index 3036d970e985..bee289d4b63a 100644 --- a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/ContextualEducationInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/ContextualEducationInteractor.kt @@ -19,9 +19,10 @@ package com.android.systemui.education.domain.interactor import com.android.systemui.CoreStartable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.contextualeducation.GestureType +import com.android.systemui.contextualeducation.GestureType.BACK import com.android.systemui.education.data.model.GestureEduModel import com.android.systemui.education.data.repository.ContextualEducationRepository -import com.android.systemui.shared.education.GestureType import com.android.systemui.user.domain.interactor.SelectedUserInteractor import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher @@ -46,7 +47,7 @@ constructor( private val repository: ContextualEducationRepository, ) : CoreStartable { - val backGestureModelFlow = readEduModelsOnSignalCountChanged(GestureType.BACK_GESTURE) + val backGestureModelFlow = readEduModelsOnSignalCountChanged(BACK) override fun start() { backgroundScope.launch { diff --git a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt index 247abf1a7ecc..9016c7339c25 100644 --- a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt @@ -19,10 +19,10 @@ package com.android.systemui.education.domain.interactor import com.android.systemui.CoreStartable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.contextualeducation.GestureType.BACK import com.android.systemui.education.data.model.GestureEduModel import com.android.systemui.education.shared.model.EducationInfo import com.android.systemui.education.shared.model.EducationUiType -import com.android.systemui.shared.education.GestureType.BACK_GESTURE import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow @@ -50,7 +50,7 @@ constructor( backgroundScope.launch { contextualEducationInteractor.backGestureModelFlow .mapNotNull { getEduType(it) } - .collect { _educationTriggered.value = EducationInfo(BACK_GESTURE, it) } + .collect { _educationTriggered.value = EducationInfo(BACK, it) } } } diff --git a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduStatsInteractor.kt b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduStatsInteractor.kt index 643e571d2927..3223433568b9 100644 --- a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduStatsInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduStatsInteractor.kt @@ -18,7 +18,7 @@ package com.android.systemui.education.domain.interactor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background -import com.android.systemui.shared.education.GestureType +import com.android.systemui.contextualeducation.GestureType import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch diff --git a/packages/SystemUI/src/com/android/systemui/education/shared/model/EducationInfo.kt b/packages/SystemUI/src/com/android/systemui/education/shared/model/EducationInfo.kt index 85f4012ddbd2..d92fb9bff512 100644 --- a/packages/SystemUI/src/com/android/systemui/education/shared/model/EducationInfo.kt +++ b/packages/SystemUI/src/com/android/systemui/education/shared/model/EducationInfo.kt @@ -16,7 +16,7 @@ package com.android.systemui.education.shared.model -import com.android.systemui.shared.education.GestureType +import com.android.systemui.contextualeducation.GestureType /** * Model for education triggered. [gestureType] indicates what gesture it is trying to educate about diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java index 947336d41590..8a663bd55bec 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java @@ -74,6 +74,7 @@ import androidx.annotation.DimenRes; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.policy.GestureNavigationSettingsObserver; import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.contextualeducation.GestureType; import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.FalsingManager; @@ -1042,6 +1043,8 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack mEdgeBackPlugin.setIsLeftPanel(mIsOnLeftEdge); mEdgeBackPlugin.onMotionEvent(ev); dispatchToBackAnimation(ev); + mOverviewProxyService.updateContextualEduStats(mIsTrackpadThreeFingerSwipe, + GestureType.BACK); } if (mLogGesture || mIsTrackpadThreeFingerSwipe) { mDownPoint.set(ev.getX(), ev.getY()); diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 371707d78500..15366d592adf 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -89,6 +89,8 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; +import com.android.systemui.contextualeducation.GestureType; +import com.android.systemui.education.domain.interactor.KeyboardTouchpadEduStatsInteractor; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardWmStateRefactor; import com.android.systemui.keyguard.WakefulnessLifecycle; @@ -160,6 +162,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private final NotificationShadeWindowController mStatusBarWinController; private final Provider<SceneInteractor> mSceneInteractor; + private final KeyboardTouchpadEduStatsInteractor mKeyboardTouchpadEduStatsInteractor; + private final Runnable mConnectionRunnable = () -> internalConnectToCurrentUser("runnable: startConnectionToCurrentUser"); private final ComponentName mRecentsComponentName; @@ -661,7 +665,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis AssistUtils assistUtils, DumpManager dumpManager, Optional<UnfoldTransitionProgressForwarder> unfoldTransitionProgressForwarder, - BroadcastDispatcher broadcastDispatcher + BroadcastDispatcher broadcastDispatcher, + KeyboardTouchpadEduStatsInteractor keyboardTouchpadEduStatsInteractor ) { // b/241601880: This component should only be running for primary users or // secondaryUsers when visibleBackgroundUsers are supported. @@ -698,6 +703,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis mDisplayTracker = displayTracker; mUnfoldTransitionProgressForwarder = unfoldTransitionProgressForwarder; mBroadcastDispatcher = broadcastDispatcher; + mKeyboardTouchpadEduStatsInteractor = keyboardTouchpadEduStatsInteractor; if (!KeyguardWmStateRefactor.isEnabled()) { mSysuiUnlockAnimationController = sysuiUnlockAnimationController; @@ -929,6 +935,19 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis return isEnabled() && !QuickStepContract.isLegacyMode(mNavBarMode); } + /** + * Updates contextual education stats when a gesture is triggered + * @param isTrackpadGesture indicates if the gesture is triggered by trackpad + * @param gestureType type of gesture triggered + */ + public void updateContextualEduStats(boolean isTrackpadGesture, GestureType gestureType) { + if (isTrackpadGesture) { + mKeyboardTouchpadEduStatsInteractor.updateShortcutTriggerTime(gestureType); + } else { + mKeyboardTouchpadEduStatsInteractor.incrementSignalCount(gestureType); + } + } + public boolean isEnabled() { return mIsEnabled; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/recents/OverviewProxyServiceTest.kt b/packages/SystemUI/tests/src/com/android/systemui/recents/OverviewProxyServiceTest.kt index e1c39117f6c8..b02cccc2bb8d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/recents/OverviewProxyServiceTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/recents/OverviewProxyServiceTest.kt @@ -35,6 +35,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager +import com.android.systemui.education.domain.interactor.KeyboardTouchpadEduStatsInteractor import com.android.systemui.keyguard.KeyguardUnlockAnimationController import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.keyguard.ui.view.InWindowLauncherUnlockAnimationManager @@ -121,6 +122,9 @@ class OverviewProxyServiceTest : SysuiTestCase() { Optional<UnfoldTransitionProgressForwarder> @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher + @Mock + private lateinit var keyboardTouchpadEduStatsInteractor: KeyboardTouchpadEduStatsInteractor + @Before fun setUp() { MockitoAnnotations.initMocks(this) @@ -289,7 +293,8 @@ class OverviewProxyServiceTest : SysuiTestCase() { assistUtils, dumpManager, unfoldTransitionProgressForwarder, - broadcastDispatcher + broadcastDispatcher, + keyboardTouchpadEduStatsInteractor ) } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/education/data/repository/FakeContextualEducationRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/education/data/repository/FakeContextualEducationRepository.kt index bade91a55534..3816e1b604ce 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/education/data/repository/FakeContextualEducationRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/education/data/repository/FakeContextualEducationRepository.kt @@ -16,8 +16,8 @@ package com.android.systemui.education.data.repository +import com.android.systemui.contextualeducation.GestureType import com.android.systemui.education.data.model.GestureEduModel -import com.android.systemui.shared.education.GestureType import java.time.Clock import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow |