/* * 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; import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR; import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_FONT; import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SHAPE; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__ACTION__APP_LAUNCHED; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_CROP_AND_SET_ACTION; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_DEEP_LINK; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_LAUNCHER; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_LAUNCH_ICON; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_PREFERENCE_UNSPECIFIED; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_SETTINGS; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_SETTINGS_SEARCH; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_SUW; import static com.android.systemui.shared.system.SysUiStatsLog.STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_TIPS; import static com.android.wallpaper.util.LaunchSourceUtils.LAUNCH_SETTINGS_SEARCH; import static com.android.wallpaper.util.LaunchSourceUtils.LAUNCH_SOURCE_DEEP_LINK; import static com.android.wallpaper.util.LaunchSourceUtils.LAUNCH_SOURCE_LAUNCHER; import static com.android.wallpaper.util.LaunchSourceUtils.LAUNCH_SOURCE_SETTINGS; import static com.android.wallpaper.util.LaunchSourceUtils.LAUNCH_SOURCE_SUW; import static com.android.wallpaper.util.LaunchSourceUtils.LAUNCH_SOURCE_TIPS; import static com.android.wallpaper.util.LaunchSourceUtils.WALLPAPER_LAUNCH_SOURCE; import android.app.WallpaperManager; import android.content.Context; import android.content.Intent; import android.stats.style.StyleEnums; import android.text.TextUtils; import androidx.annotation.Nullable; import com.android.customization.model.clock.Clockface; import com.android.customization.model.color.ColorOption; import com.android.customization.model.grid.GridOption; import com.android.customization.model.theme.ThemeBundle; import com.android.wallpaper.module.Injector; import com.android.wallpaper.module.InjectorProvider; import com.android.wallpaper.module.NoOpUserEventLogger; import com.android.wallpaper.module.WallpaperPreferences; import com.android.wallpaper.module.WallpaperStatusChecker; import java.util.Map; import java.util.Objects; /** * StatsLog-backed implementation of {@link ThemesUserEventLogger}. */ public class StatsLogUserEventLogger extends NoOpUserEventLogger implements ThemesUserEventLogger { private static final String TAG = "StatsLogUserEventLogger"; private final Context mContext; private final WallpaperPreferences mPreferences; private final WallpaperStatusChecker mWallpaperStatusChecker; public StatsLogUserEventLogger(Context appContext) { mContext = appContext; Injector injector = InjectorProvider.getInjector(); mPreferences = injector.getPreferences(appContext); mWallpaperStatusChecker = injector.getWallpaperStatusChecker(); } @Override public void logAppLaunched(Intent launchSource) { new SysUiStatsLogger() .setAction(STYLE_UICHANGED__ACTION__APP_LAUNCHED) .setLaunchedPreference(getAppLaunchSource(launchSource)) .log(); } @Override public void logResumed(boolean provisioned, boolean wallpaper) { new SysUiStatsLogger() .setAction(StyleEnums.ONRESUME) .log(); } @Override public void logStopped() { new SysUiStatsLogger() .setAction(StyleEnums.ONSTOP) .log(); } @Override public void logActionClicked(String collectionId, int actionLabelResId) { new SysUiStatsLogger() .setAction(StyleEnums.WALLPAPER_EXPLORE) .setWallpaperCategoryHash(getIdHashCode(collectionId)) .log(); } @Override public void logIndividualWallpaperSelected(String collectionId) { new SysUiStatsLogger() .setAction(StyleEnums.WALLPAPER_SELECT) .setWallpaperCategoryHash(getIdHashCode(collectionId)) .log(); } @Override public void logCategorySelected(String collectionId) { new SysUiStatsLogger() .setAction(StyleEnums.WALLPAPER_OPEN_CATEGORY) .setWallpaperCategoryHash(getIdHashCode(collectionId)) .log(); } @Override public void logLiveWallpaperInfoSelected(String collectionId, @Nullable String wallpaperId) { new SysUiStatsLogger() .setAction(StyleEnums.LIVE_WALLPAPER_INFO_SELECT) .setWallpaperCategoryHash(getIdHashCode(collectionId)) .setWallpaperIdHash(getIdHashCode(wallpaperId)) .log(); } @Override public void logLiveWallpaperCustomizeSelected(String collectionId, @Nullable String wallpaperId) { new SysUiStatsLogger().setAction(StyleEnums.LIVE_WALLPAPER_CUSTOMIZE_SELECT) .setWallpaperCategoryHash(getIdHashCode(collectionId)) .setWallpaperIdHash(getIdHashCode(wallpaperId)) .log(); } @Override public void logSnapshot() { final boolean isLockWallpaperSet = mWallpaperStatusChecker.isLockWallpaperSet(mContext); final String homeCollectionId = mPreferences.getHomeWallpaperCollectionId(); final String homeRemoteId = mPreferences.getHomeWallpaperRemoteId(); final String effects = mPreferences.getHomeWallpaperEffects(); String homeWallpaperId = TextUtils.isEmpty(homeRemoteId) ? mPreferences.getHomeWallpaperServiceName() : homeRemoteId; String lockCollectionId = isLockWallpaperSet ? mPreferences.getLockWallpaperCollectionId() : homeCollectionId; String lockWallpaperId = isLockWallpaperSet ? mPreferences.getLockWallpaperRemoteId() : homeWallpaperId; new SysUiStatsLogger().setAction(StyleEnums.SNAPSHOT) .setWallpaperCategoryHash(getIdHashCode(homeCollectionId)) .setWallpaperIdHash(getIdHashCode(homeWallpaperId)) .setLockWallpaperCategoryHash(getIdHashCode(lockCollectionId)) .setLockWallpaperIdHash(getIdHashCode(lockWallpaperId)) .setFirstLaunchDateSinceSetup(mPreferences.getFirstLaunchDateSinceSetup()) .setFirstWallpaperApplyDateSinceSetup( mPreferences.getFirstWallpaperApplyDateSinceSetup()) .setAppLaunchCount(mPreferences.getAppLaunchCount()) .setEffectIdHash(getIdHashCode(effects)) .log(); } @Override public void logWallpaperSet(String collectionId, @Nullable String wallpaperId, @Nullable String effects) { new SysUiStatsLogger() .setAction(StyleEnums.WALLPAPER_APPLIED) .setWallpaperCategoryHash(getIdHashCode(collectionId)) .setWallpaperIdHash(getIdHashCode(wallpaperId)) .setEffectIdHash(getIdHashCode(effects)) .log(); } @Override public void logEffectApply(String effect, @EffectStatus int status, long timeElapsedMillis, int resultCode) { new SysUiStatsLogger() .setAction(StyleEnums.WALLPAPER_EFFECT_APPLIED) .setEffectPreference(status) .setEffectIdHash(getIdHashCode(effect)) .setTimeElapsed(timeElapsedMillis) .setEffectResultCode(resultCode) .log(); } @Override public void logEffectProbe(String effect, @EffectStatus int status) { new SysUiStatsLogger() .setAction(StyleEnums.WALLPAPER_EFFECT_PROBE) .setEffectPreference(status) .setEffectIdHash(getIdHashCode(effect)) .log(); } @Nullable private String getThemePackage(ThemeBundle theme, String category) { Map packages = theme.getPackagesByCategory(); return packages.get(category); } @Override public void logThemeSelected(ThemeBundle theme, boolean isCustomTheme) { new SysUiStatsLogger() .setAction(StyleEnums.PICKER_SELECT) .setColorPackageHash( Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR))) .setFontPackageHash(Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_FONT))) .setShapePackageHash( Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE))) .log(); } @Override public void logThemeApplied(ThemeBundle theme, boolean isCustomTheme) { new SysUiStatsLogger() .setAction(StyleEnums.PICKER_APPLIED) .setColorPackageHash( Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR))) .setFontPackageHash(Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_FONT))) .setShapePackageHash( Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE))) .log(); } @Override public void logColorApplied(int action, ColorOption colorOption) { new SysUiStatsLogger() .setAction(action) .setColorPreference(colorOption.getIndex()) .setColorVariant(colorOption.getStyle().ordinal() + 1) .log(); } @Override public void logClockSelected(Clockface clock) { new SysUiStatsLogger() .setAction(StyleEnums.PICKER_SELECT) .setClockPackageHash(Objects.hashCode(clock.getId())) .log(); } @Override public void logClockApplied(Clockface clock) { new SysUiStatsLogger() .setAction(StyleEnums.PICKER_APPLIED) .setClockPackageHash(Objects.hashCode(clock.getId())) .log(); } @Override public void logGridSelected(GridOption grid) { new SysUiStatsLogger() .setAction(StyleEnums.PICKER_SELECT) .setLauncherGrid(grid.cols) .log(); } @Override public void logGridApplied(GridOption grid) { new SysUiStatsLogger() .setAction(StyleEnums.PICKER_APPLIED) .setLauncherGrid(grid.cols) .log(); } private int getAppLaunchSource(Intent launchSource) { if (launchSource.hasExtra(WALLPAPER_LAUNCH_SOURCE)) { switch (launchSource.getStringExtra(WALLPAPER_LAUNCH_SOURCE)) { case LAUNCH_SOURCE_LAUNCHER: return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_LAUNCHER; case LAUNCH_SOURCE_SETTINGS: return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_SETTINGS; case LAUNCH_SOURCE_SUW: return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_SUW; case LAUNCH_SOURCE_TIPS: return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_TIPS; case LAUNCH_SOURCE_DEEP_LINK: return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_DEEP_LINK; default: return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_PREFERENCE_UNSPECIFIED; } } else if (launchSource.hasExtra(LAUNCH_SETTINGS_SEARCH)) { return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_SETTINGS_SEARCH; } else if (launchSource.getAction() != null && launchSource.getAction().equals( WallpaperManager.ACTION_CROP_AND_SET_WALLPAPER)) { return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_CROP_AND_SET_ACTION; } else if (launchSource.getCategories() != null && launchSource.getCategories().contains(Intent.CATEGORY_LAUNCHER)) { return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_LAUNCH_ICON; } else { return STYLE_UICHANGED__LAUNCHED_PREFERENCE__LAUNCHED_PREFERENCE_UNSPECIFIED; } } private int getIdHashCode(String id) { return id != null ? id.hashCode() : 0; } }