Merge "Log dream_setting_changed to statsd" into udc-qpr-dev am: bd019a8693

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24136085

Change-Id: Ib5565abcdf698c57de946f5b041d861829c5d611
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Darrell Shi
2023-07-20 18:05:48 +00:00
committed by Automerger Merge Worker
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.graphics.drawable.Drawable;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.service.dreams.DreamService; import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager; import android.service.dreams.IDreamManager;
@@ -35,6 +36,7 @@ import android.util.ArraySet;
import android.util.Log; import android.util.Log;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; 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 SCREENSAVER_HOME_CONTROLS_ENABLED_DEFAULT = 1;
private static final int LOCKSCREEN_SHOW_CONTROLS_DEFAULT = 0; 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 Context mContext;
private final IDreamManager mDreamManager; private final IDreamManager mDreamManager;
private final DreamInfoComparator mComparator; private final DreamInfoComparator mComparator;
@@ -121,6 +143,7 @@ public class DreamBackend {
private final boolean mDreamsActivatedOnSleepByDefault; private final boolean mDreamsActivatedOnSleepByDefault;
private final boolean mDreamsActivatedOnDockByDefault; private final boolean mDreamsActivatedOnDockByDefault;
private final Set<ComponentName> mDisabledDreams; private final Set<ComponentName> mDisabledDreams;
private final List<String> mLoggableDreamPrefixes;
private Set<Integer> mSupportedComplications; private Set<Integer> mSupportedComplications;
private static DreamBackend sInstance; private static DreamBackend sInstance;
@@ -148,6 +171,8 @@ public class DreamBackend {
com.android.internal.R.array.config_disabledDreamComponents)) com.android.internal.R.array.config_disabledDreamComponents))
.map(ComponentName::unflattenFromString) .map(ComponentName::unflattenFromString)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
mLoggableDreamPrefixes = Arrays.stream(resources.getStringArray(
com.android.internal.R.array.config_loggable_dream_prefixes)).toList();
mSupportedComplications = Arrays.stream(resources.getIntArray( mSupportedComplications = Arrays.stream(resources.getIntArray(
com.android.internal.R.array.config_supportedDreamComplications)) com.android.internal.R.array.config_supportedDreamComplications))
@@ -282,6 +307,8 @@ public class DreamBackend {
default: default:
break; break;
} }
logDreamSettingChangeToStatsd(DS_TYPE_WHEN_TO_DREAM);
} }
/** Gets all complications which have been enabled by the user. */ /** Gets all complications which have been enabled by the user. */
@@ -304,12 +331,14 @@ public class DreamBackend {
public void setComplicationsEnabled(boolean enabled) { public void setComplicationsEnabled(boolean enabled) {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.SCREENSAVER_COMPLICATIONS_ENABLED, enabled ? 1 : 0); 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 */ /** Sets whether home controls are enabled by the user on the dream */
public void setHomeControlsEnabled(boolean enabled) { public void setHomeControlsEnabled(boolean enabled) {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.SCREENSAVER_HOME_CONTROLS_ENABLED, enabled ? 1 : 0); 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 */ /** Gets whether home controls button is enabled on the dream */
@@ -353,6 +382,7 @@ public class DreamBackend {
public void setEnabled(boolean value) { public void setEnabled(boolean value) {
logd("setEnabled(%s)", value); logd("setEnabled(%s)", value);
setBoolean(Settings.Secure.SCREENSAVER_ENABLED, value); setBoolean(Settings.Secure.SCREENSAVER_ENABLED, value);
logDreamSettingChangeToStatsd(DS_TYPE_ENABLED);
} }
public boolean isActivatedOnDock() { public boolean isActivatedOnDock() {
@@ -391,6 +421,7 @@ public class DreamBackend {
try { try {
ComponentName[] dreams = {dream}; ComponentName[] dreams = {dream};
mDreamManager.setDreamComponents(dream == null ? null : dreams); mDreamManager.setDreamComponents(dream == null ? null : dreams);
logDreamSettingChangeToStatsd(DS_TYPE_DREAM_COMPONENT);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.w(TAG, "Failed to set active dream to " + dream, 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 static class DreamInfoComparator implements Comparator<DreamInfo> {
private final ComponentName mDefaultDream; private final ComponentName mDefaultDream;

View File

@@ -75,6 +75,9 @@ public final class DreamBackendTest {
when(res.getStringArray( when(res.getStringArray(
com.android.internal.R.array.config_disabledDreamComponents)).thenReturn( com.android.internal.R.array.config_disabledDreamComponents)).thenReturn(
new String[]{}); new String[]{});
when(res.getStringArray(
com.android.internal.R.array.config_loggable_dream_prefixes)).thenReturn(
new String[]{});
mBackend = new DreamBackend(mContext); mBackend = new DreamBackend(mContext);
} }