summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java93
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/dream/DreamBackendTest.java3
2 files changed, 96 insertions, 0 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
index f911d35757f6..a617bf3278d6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
+++ b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
@@ -28,6 +28,7 @@ import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.UserHandle;
import android.provider.Settings;
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
@@ -35,6 +36,7 @@ import android.util.ArraySet;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.FrameworkStatsLog;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -114,6 +116,26 @@ public class DreamBackend {
private static final int SCREENSAVER_HOME_CONTROLS_ENABLED_DEFAULT = 1;
private static final int LOCKSCREEN_SHOW_CONTROLS_DEFAULT = 0;
+ private static final int DS_TYPE_ENABLED = FrameworkStatsLog
+ .DREAM_SETTING_CHANGED__DREAM_SETTING_TYPE__DREAM_SETTING_TYPE_ENABLED;
+ private static final int DS_TYPE_WHEN_TO_DREAM = FrameworkStatsLog
+ .DREAM_SETTING_CHANGED__DREAM_SETTING_TYPE__DREAM_SETTING_TYPE_WHEN_TO_DREAM;
+ private static final int DS_TYPE_DREAM_COMPONENT = FrameworkStatsLog
+ .DREAM_SETTING_CHANGED__DREAM_SETTING_TYPE__DREAM_SETTING_TYPE_DREAM_COMPONENT;
+ private static final int DS_TYPE_SHOW_ADDITIONAL_INFO = FrameworkStatsLog
+ .DREAM_SETTING_CHANGED__DREAM_SETTING_TYPE__DREAM_SETTING_TYPE_SHOW_ADDITIONAL_INFO;
+ private static final int DS_TYPE_SHOW_HOME_CONTROLS = FrameworkStatsLog
+ .DREAM_SETTING_CHANGED__DREAM_SETTING_TYPE__DREAM_SETTING_TYPE_SHOW_HOME_CONTROLS;
+
+ private static final int WHEN_TO_DREAM_UNSPECIFIED = FrameworkStatsLog
+ .DREAM_SETTING_CHANGED__WHEN_TO_DREAM__WHEN_TO_DREAM_UNSPECIFIED;
+ private static final int WHEN_TO_DREAM_CHARGING = FrameworkStatsLog
+ .DREAM_SETTING_CHANGED__WHEN_TO_DREAM__WHEN_TO_DREAM_WHILE_CHARGING_ONLY;
+ private static final int WHEN_TO_DREAM_DOCKED = FrameworkStatsLog
+ .DREAM_SETTING_CHANGED__WHEN_TO_DREAM__WHEN_TO_DREAM_WHILE_DOCKED_ONLY;
+ private static final int WHEN_TO_DREAM_CHARGING_OR_DOCKED = FrameworkStatsLog
+ .DREAM_SETTING_CHANGED__WHEN_TO_DREAM__WHEN_TO_DREAM_EITHER_CHARGING_OR_DOCKED;
+
private final Context mContext;
private final IDreamManager mDreamManager;
private final DreamInfoComparator mComparator;
@@ -121,6 +143,7 @@ public class DreamBackend {
private final boolean mDreamsActivatedOnSleepByDefault;
private final boolean mDreamsActivatedOnDockByDefault;
private final Set<ComponentName> mDisabledDreams;
+ private final List<String> mLoggableDreamPrefixes;
private Set<Integer> mSupportedComplications;
private static DreamBackend sInstance;
@@ -148,6 +171,8 @@ public class DreamBackend {
com.android.internal.R.array.config_disabledDreamComponents))
.map(ComponentName::unflattenFromString)
.collect(Collectors.toSet());
+ mLoggableDreamPrefixes = Arrays.stream(resources.getStringArray(
+ com.android.internal.R.array.config_loggable_dream_prefixes)).toList();
mSupportedComplications = Arrays.stream(resources.getIntArray(
com.android.internal.R.array.config_supportedDreamComplications))
@@ -282,6 +307,8 @@ public class DreamBackend {
default:
break;
}
+
+ logDreamSettingChangeToStatsd(DS_TYPE_WHEN_TO_DREAM);
}
/** Gets all complications which have been enabled by the user. */
@@ -304,12 +331,14 @@ public class DreamBackend {
public void setComplicationsEnabled(boolean enabled) {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.SCREENSAVER_COMPLICATIONS_ENABLED, enabled ? 1 : 0);
+ logDreamSettingChangeToStatsd(DS_TYPE_SHOW_ADDITIONAL_INFO);
}
/** Sets whether home controls are enabled by the user on the dream */
public void setHomeControlsEnabled(boolean enabled) {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.SCREENSAVER_HOME_CONTROLS_ENABLED, enabled ? 1 : 0);
+ logDreamSettingChangeToStatsd(DS_TYPE_SHOW_HOME_CONTROLS);
}
/** Gets whether home controls button is enabled on the dream */
@@ -353,6 +382,7 @@ public class DreamBackend {
public void setEnabled(boolean value) {
logd("setEnabled(%s)", value);
setBoolean(Settings.Secure.SCREENSAVER_ENABLED, value);
+ logDreamSettingChangeToStatsd(DS_TYPE_ENABLED);
}
public boolean isActivatedOnDock() {
@@ -391,6 +421,7 @@ public class DreamBackend {
try {
ComponentName[] dreams = {dream};
mDreamManager.setDreamComponents(dream == null ? null : dreams);
+ logDreamSettingChangeToStatsd(DS_TYPE_DREAM_COMPONENT);
} catch (RemoteException e) {
Log.w(TAG, "Failed to set active dream to " + dream, e);
}
@@ -461,6 +492,68 @@ public class DreamBackend {
}
}
+ private void logDreamSettingChangeToStatsd(int dreamSettingType) {
+ FrameworkStatsLog.write(
+ FrameworkStatsLog.DREAM_SETTING_CHANGED, /*atom_tag*/
+ UserHandle.myUserId(), /*uid*/
+ isEnabled(), /*enabled*/
+ getActiveDreamComponentForStatsd(), /*dream_component*/
+ getWhenToDreamForStatsd(), /*when_to_dream*/
+ getComplicationsEnabled(), /*show_additional_info*/
+ getHomeControlsEnabled(), /*show_home_controls*/
+ dreamSettingType /*dream_setting_type*/
+ );
+ }
+
+ /**
+ * Returns the user selected dream component in string format for stats logging. If the dream
+ * component is not loggable, returns "other".
+ */
+ private String getActiveDreamComponentForStatsd() {
+ final ComponentName activeDream = getActiveDream();
+ if (activeDream == null) {
+ return "";
+ }
+
+ final String component = activeDream.flattenToShortString();
+ if (isLoggableDreamComponentForStatsd(component)) {
+ return component;
+ } else {
+ return "other";
+ }
+ }
+
+ /**
+ * Whether the dream component is loggable. Only components from the predefined packages are
+ * allowed to be logged for privacy.
+ */
+ private boolean isLoggableDreamComponentForStatsd(String component) {
+ for (int i = 0; i < mLoggableDreamPrefixes.size(); i++) {
+ if (component.startsWith(mLoggableDreamPrefixes.get(i))) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the enum of "when to dream" setting for statsd logging.
+ */
+ private int getWhenToDreamForStatsd() {
+ switch (getWhenToDreamSetting()) {
+ case WHILE_CHARGING:
+ return WHEN_TO_DREAM_CHARGING;
+ case WHILE_DOCKED:
+ return WHEN_TO_DREAM_DOCKED;
+ case EITHER:
+ return WHEN_TO_DREAM_CHARGING_OR_DOCKED;
+ case NEVER:
+ default:
+ return WHEN_TO_DREAM_UNSPECIFIED;
+ }
+ }
+
private static class DreamInfoComparator implements Comparator<DreamInfo> {
private final ComponentName mDefaultDream;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/dream/DreamBackendTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/dream/DreamBackendTest.java
index 2edf403e5c00..00ae96cfab50 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/dream/DreamBackendTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/dream/DreamBackendTest.java
@@ -75,6 +75,9 @@ public final class DreamBackendTest {
when(res.getStringArray(
com.android.internal.R.array.config_disabledDreamComponents)).thenReturn(
new String[]{});
+ when(res.getStringArray(
+ com.android.internal.R.array.config_loggable_dream_prefixes)).thenReturn(
+ new String[]{});
mBackend = new DreamBackend(mContext);
}