Loading packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java +93 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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)) Loading Loading @@ -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. */ Loading @@ -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 */ Loading Loading @@ -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() { Loading Loading @@ -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); } Loading Loading @@ -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; Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/dream/DreamBackendTest.java +3 −0 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading
packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java +93 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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)) Loading Loading @@ -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. */ Loading @@ -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 */ Loading Loading @@ -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() { Loading Loading @@ -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); } Loading Loading @@ -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; Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/dream/DreamBackendTest.java +3 −0 Original line number Diff line number Diff line Loading @@ -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); } Loading