Log dream_setting_changed to statsd

This change pushes a log to statsd whenever dream setting is updated.

Bug: 284029342
Test: Test: statsd_testdrive 705
Test: make -j64 RunSettingsLibRoboTests ROBOTEST_FILTER="com.android.settingslib.dream.DreamBackendTest"

Change-Id: I73d85daa0998d94c5892b7b8f5af6891383fcd3b
This commit is contained in:
Darrell Shi
2023-07-18 21:06:17 +00:00
parent f29c879cdc
commit a23db9bf30
2 changed files with 96 additions and 0 deletions

View File

@@ -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;

View File

@@ -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);
}