Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bd019a86 authored by Darrell Shi's avatar Darrell Shi Committed by Android (Google) Code Review
Browse files

Merge "Log dream_setting_changed to statsd" into udc-qpr-dev

parents 1509cd7a a23db9bf
Loading
Loading
Loading
Loading
+93 −0
Original line number Diff line number Diff line
@@ -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;

+3 −0
Original line number Diff line number Diff line
@@ -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);
    }