diff options
Diffstat (limited to 'src/com/android/customization/module/logging/ThemesUserEventLoggerImpl.kt')
-rw-r--r-- | src/com/android/customization/module/logging/ThemesUserEventLoggerImpl.kt | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/src/com/android/customization/module/logging/ThemesUserEventLoggerImpl.kt b/src/com/android/customization/module/logging/ThemesUserEventLoggerImpl.kt new file mode 100644 index 00000000..3f4a6dc4 --- /dev/null +++ b/src/com/android/customization/module/logging/ThemesUserEventLoggerImpl.kt @@ -0,0 +1,299 @@ +/* + * Copyright (C) 2019 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.customization.module.logging + +import android.app.WallpaperManager +import android.content.Intent +import android.stats.style.StyleEnums.APP_LAUNCHED +import android.stats.style.StyleEnums.CLOCK_APPLIED +import android.stats.style.StyleEnums.CLOCK_COLOR_APPLIED +import android.stats.style.StyleEnums.CLOCK_SIZE_APPLIED +import android.stats.style.StyleEnums.DARK_THEME_APPLIED +import android.stats.style.StyleEnums.GRID_APPLIED +import android.stats.style.StyleEnums.LAUNCHED_CROP_AND_SET_ACTION +import android.stats.style.StyleEnums.LAUNCHED_DEEP_LINK +import android.stats.style.StyleEnums.LAUNCHED_KEYGUARD +import android.stats.style.StyleEnums.LAUNCHED_LAUNCHER +import android.stats.style.StyleEnums.LAUNCHED_LAUNCH_ICON +import android.stats.style.StyleEnums.LAUNCHED_PREFERENCE_UNSPECIFIED +import android.stats.style.StyleEnums.LAUNCHED_SETTINGS +import android.stats.style.StyleEnums.LAUNCHED_SETTINGS_SEARCH +import android.stats.style.StyleEnums.LAUNCHED_SUW +import android.stats.style.StyleEnums.LAUNCHED_TIPS +import android.stats.style.StyleEnums.LOCK_SCREEN_NOTIFICATION_APPLIED +import android.stats.style.StyleEnums.RESET_APPLIED +import android.stats.style.StyleEnums.SHORTCUT_APPLIED +import android.stats.style.StyleEnums.SNAPSHOT +import android.stats.style.StyleEnums.THEMED_ICON_APPLIED +import android.stats.style.StyleEnums.THEME_COLOR_APPLIED +import android.stats.style.StyleEnums.WALLPAPER_APPLIED +import android.stats.style.StyleEnums.WALLPAPER_DESTINATION_HOME_AND_LOCK_SCREEN +import android.stats.style.StyleEnums.WALLPAPER_DESTINATION_HOME_SCREEN +import android.stats.style.StyleEnums.WALLPAPER_DESTINATION_LOCK_SCREEN +import android.stats.style.StyleEnums.WALLPAPER_EFFECT_APPLIED +import android.stats.style.StyleEnums.WALLPAPER_EFFECT_FG_DOWNLOAD +import android.stats.style.StyleEnums.WALLPAPER_EFFECT_PROBE +import android.stats.style.StyleEnums.WALLPAPER_EXPLORE +import android.text.TextUtils +import com.android.customization.model.color.ColorCustomizationManager +import com.android.customization.model.grid.GridOption +import com.android.customization.module.logging.ThemesUserEventLogger.ClockSize +import com.android.customization.module.logging.ThemesUserEventLogger.ColorSource +import com.android.wallpaper.module.WallpaperPreferences +import com.android.wallpaper.module.logging.UserEventLogger.EffectStatus +import com.android.wallpaper.module.logging.UserEventLogger.SetWallpaperEntryPoint +import com.android.wallpaper.module.logging.UserEventLogger.WallpaperDestination +import com.android.wallpaper.util.ActivityUtils +import com.android.wallpaper.util.LaunchSourceUtils +import javax.inject.Inject +import javax.inject.Singleton + +/** StatsLog-backed implementation of [ThemesUserEventLogger]. */ +@Singleton +class ThemesUserEventLoggerImpl +@Inject +constructor( + private val preferences: WallpaperPreferences, + private val colorManager: ColorCustomizationManager, + private val appSessionId: AppSessionId, +) : ThemesUserEventLogger { + + override fun logSnapshot() { + SysUiStatsLogger(SNAPSHOT) + .setWallpaperCategoryHash(preferences.getHomeCategoryHash()) + .setWallpaperIdHash(preferences.getHomeWallpaperIdHash()) + .setLockWallpaperCategoryHash(preferences.getLockCategoryHash()) + .setLockWallpaperIdHash(preferences.getLockWallpaperIdHash()) + .setEffectIdHash(preferences.getHomeWallpaperEffectsIdHash()) + .setColorSource(colorManager.currentColorSourceForLogging) + .setColorVariant(colorManager.currentStyleForLogging) + .setSeedColor(colorManager.currentSeedColorForLogging) + .log() + } + + override fun logAppLaunched(launchSource: Intent) { + SysUiStatsLogger(APP_LAUNCHED) + .setAppSessionId(appSessionId.createNewId().getId()) + .setLaunchedPreference(launchSource.getAppLaunchSource()) + .log() + } + + override fun logWallpaperApplied( + collectionId: String?, + wallpaperId: String?, + effects: String?, + @SetWallpaperEntryPoint setWallpaperEntryPoint: Int, + @WallpaperDestination destination: Int, + ) { + val categoryHash = getIdHashCode(collectionId) + val wallpaperIdHash = getIdHashCode(wallpaperId) + val isHomeWallpaperSet = + destination == WALLPAPER_DESTINATION_HOME_SCREEN || + destination == WALLPAPER_DESTINATION_HOME_AND_LOCK_SCREEN + val isLockWallpaperSet = + destination == WALLPAPER_DESTINATION_LOCK_SCREEN || + destination == WALLPAPER_DESTINATION_HOME_AND_LOCK_SCREEN + SysUiStatsLogger(WALLPAPER_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setWallpaperCategoryHash(if (isHomeWallpaperSet) categoryHash else 0) + .setWallpaperIdHash(if (isHomeWallpaperSet) wallpaperIdHash else 0) + .setLockWallpaperCategoryHash(if (isLockWallpaperSet) categoryHash else 0) + .setLockWallpaperIdHash(if (isLockWallpaperSet) wallpaperIdHash else 0) + .setEffectIdHash(getIdHashCode(effects)) + .setSetWallpaperEntryPoint(setWallpaperEntryPoint) + .setWallpaperDestination(destination) + .log() + } + + override fun logEffectApply( + effect: String, + @EffectStatus status: Int, + timeElapsedMillis: Long, + resultCode: Int + ) { + SysUiStatsLogger(WALLPAPER_EFFECT_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setEffectPreference(status) + .setEffectIdHash(getIdHashCode(effect)) + .setTimeElapsed(timeElapsedMillis) + .setEffectResultCode(resultCode) + .log() + } + + override fun logEffectProbe(effect: String, @EffectStatus status: Int) { + SysUiStatsLogger(WALLPAPER_EFFECT_PROBE) + .setAppSessionId(appSessionId.getId()) + .setEffectPreference(status) + .setEffectIdHash(getIdHashCode(effect)) + .log() + } + + override fun logEffectForegroundDownload( + effect: String, + @EffectStatus status: Int, + timeElapsedMillis: Long + ) { + SysUiStatsLogger(WALLPAPER_EFFECT_FG_DOWNLOAD) + .setAppSessionId(appSessionId.getId()) + .setEffectPreference(status) + .setEffectIdHash(getIdHashCode(effect)) + .setTimeElapsed(timeElapsedMillis) + .log() + } + + override fun logResetApplied() { + SysUiStatsLogger(RESET_APPLIED).setAppSessionId(appSessionId.getId()).log() + } + + override fun logWallpaperExploreButtonClicked() { + SysUiStatsLogger(WALLPAPER_EXPLORE).setAppSessionId(appSessionId.getId()).log() + } + + override fun logThemeColorApplied( + @ColorSource source: Int, + style: Int, + seedColor: Int, + ) { + SysUiStatsLogger(THEME_COLOR_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setColorSource(source) + .setColorVariant(style) + .setSeedColor(seedColor) + .log() + } + + override fun logGridApplied(grid: GridOption) { + SysUiStatsLogger(GRID_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setLauncherGrid(grid.getLauncherGridInt()) + .log() + } + + override fun logClockApplied(clockId: String) { + SysUiStatsLogger(CLOCK_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setClockPackageHash(getIdHashCode(clockId)) + .log() + } + + override fun logClockColorApplied(seedColor: Int) { + SysUiStatsLogger(CLOCK_COLOR_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setSeedColor(seedColor) + .log() + } + + override fun logClockSizeApplied(@ClockSize clockSize: Int) { + SysUiStatsLogger(CLOCK_SIZE_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setClockSize(clockSize) + .log() + } + + override fun logThemedIconApplied(useThemeIcon: Boolean) { + SysUiStatsLogger(THEMED_ICON_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setToggleOn(useThemeIcon) + .log() + } + + override fun logLockScreenNotificationApplied(showLockScreenNotifications: Boolean) { + SysUiStatsLogger(LOCK_SCREEN_NOTIFICATION_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setToggleOn(showLockScreenNotifications) + .log() + } + + override fun logShortcutApplied(shortcut: String, shortcutSlotId: String) { + SysUiStatsLogger(SHORTCUT_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setShortcut(shortcut) + .setShortcutSlotId(shortcutSlotId) + .log() + } + + override fun logDarkThemeApplied(useDarkTheme: Boolean) { + SysUiStatsLogger(DARK_THEME_APPLIED) + .setAppSessionId(appSessionId.getId()) + .setToggleOn(useDarkTheme) + .log() + } + + /** + * The grid integer depends on the column and row numbers. For example: 4x5 is 405 13x37 is 1337 + * The upper limit for the column / row count is 99. + */ + private fun GridOption.getLauncherGridInt(): Int { + return cols * 100 + rows + } + + private fun Intent.getAppLaunchSource(): Int { + return if (hasExtra(LaunchSourceUtils.WALLPAPER_LAUNCH_SOURCE)) { + when (getStringExtra(LaunchSourceUtils.WALLPAPER_LAUNCH_SOURCE)) { + LaunchSourceUtils.LAUNCH_SOURCE_LAUNCHER -> LAUNCHED_LAUNCHER + LaunchSourceUtils.LAUNCH_SOURCE_SETTINGS -> LAUNCHED_SETTINGS + LaunchSourceUtils.LAUNCH_SOURCE_SUW -> LAUNCHED_SUW + LaunchSourceUtils.LAUNCH_SOURCE_TIPS -> LAUNCHED_TIPS + LaunchSourceUtils.LAUNCH_SOURCE_DEEP_LINK -> LAUNCHED_DEEP_LINK + LaunchSourceUtils.LAUNCH_SOURCE_KEYGUARD -> LAUNCHED_KEYGUARD + else -> LAUNCHED_PREFERENCE_UNSPECIFIED + } + } else if (ActivityUtils.isLaunchedFromSettingsSearch(this)) { + LAUNCHED_SETTINGS_SEARCH + } else if (action != null && action == WallpaperManager.ACTION_CROP_AND_SET_WALLPAPER) { + LAUNCHED_CROP_AND_SET_ACTION + } else if (categories != null && categories.contains(Intent.CATEGORY_LAUNCHER)) { + LAUNCHED_LAUNCH_ICON + } else { + LAUNCHED_PREFERENCE_UNSPECIFIED + } + } + + /** If not set, the output hash is 0. */ + private fun WallpaperPreferences.getHomeCategoryHash(): Int { + return getIdHashCode(getHomeWallpaperCollectionId()) + } + + /** If not set, the output hash is 0. */ + private fun WallpaperPreferences.getHomeWallpaperIdHash(): Int { + val remoteId = getHomeWallpaperRemoteId() + val wallpaperId = + if (!TextUtils.isEmpty(remoteId)) remoteId else getHomeWallpaperServiceName() + return getIdHashCode(wallpaperId) + } + + /** If not set, the output hash is 0. */ + private fun WallpaperPreferences.getLockCategoryHash(): Int { + return getIdHashCode(getLockWallpaperCollectionId()) + } + + /** If not set, the output hash is 0. */ + private fun WallpaperPreferences.getLockWallpaperIdHash(): Int { + val remoteId = getLockWallpaperRemoteId() + val wallpaperId = + if (!TextUtils.isEmpty(remoteId)) remoteId else getLockWallpaperServiceName() + return getIdHashCode(wallpaperId) + } + + /** If not set, the output hash is 0. */ + private fun WallpaperPreferences.getHomeWallpaperEffectsIdHash(): Int { + return getIdHashCode(getHomeWallpaperEffects()) + } + + private fun getIdHashCode(id: String?): Int { + return id?.hashCode() ?: 0 + } +} |