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

Commit 9b632d74 authored by arangelov's avatar arangelov
Browse files

Add a DevicePolicyEvent metric for requestQuietModeEnabled.

Bug: 120678486
Test: Manual
Change-Id: If34ce2b567f0e836e1fd83a51c6e464e2cf6e0a9
parent 3fbeb923
Loading
Loading
Loading
Loading
+64 −11
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.app.IActivityManager;
import android.app.IStopUserCallback;
import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.app.admin.DevicePolicyEventLogger;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -73,6 +74,7 @@ import android.os.UserManagerInternal.UserRestrictionsListener;
import android.os.storage.StorageManager;
import android.security.GateKeeper;
import android.service.gatekeeper.IGateKeeperService;
import android.stats.devicepolicy.DevicePolicyEnums;
import android.util.AtomicFile;
import android.util.IntArray;
import android.util.Log;
@@ -100,6 +102,8 @@ import com.android.server.am.UserState;
import com.android.server.storage.DeviceStorageMonitorInternal;
import com.android.server.wm.ActivityTaskManagerInternal;

import libcore.io.IoUtils;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -121,8 +125,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

import libcore.io.IoUtils;

/**
 * Service for {@link UserManager}.
 *
@@ -173,6 +175,8 @@ public class UserManagerService extends IUserManager.Stub {
    private static final String TAG_ENTRY = "entry";
    private static final String TAG_VALUE = "value";
    private static final String TAG_SEED_ACCOUNT_OPTIONS = "seedAccountOptions";
    private static final String TAG_LAST_REQUEST_QUIET_MODE_ENABLED_CALL =
            "lastRequestQuietModeEnabledCall";
    private static final String ATTR_KEY = "key";
    private static final String ATTR_VALUE_TYPE = "type";
    private static final String ATTR_MULTIPLE = "m";
@@ -268,6 +272,16 @@ public class UserManagerService extends IUserManager.Stub {
        /** Elapsed realtime since boot when the user was unlocked. */
        long unlockRealtime;

        private long mLastRequestQuietModeEnabledMillis;

        void setLastRequestQuietModeEnabledMillis(long millis) {
            mLastRequestQuietModeEnabledMillis = millis;
        }

        long getLastRequestQuietModeEnabledMillis() {
            return mLastRequestQuietModeEnabledMillis;
        }

        void clearSeedAccountData() {
            seedAccountName = null;
            seedAccountType = null;
@@ -389,8 +403,8 @@ public class UserManagerService extends IUserManager.Stub {
            final IntentSender target = intent.getParcelableExtra(Intent.EXTRA_INTENT);
            final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL);
            // Call setQuietModeEnabled on bg thread to avoid ANR
            BackgroundThread.getHandler()
                    .post(() -> setQuietModeEnabled(userHandle, false, target));
            BackgroundThread.getHandler().post(() ->
                    setQuietModeEnabled(userHandle, false, target, /* callingPackage */ null));
        }
    };

@@ -834,21 +848,24 @@ public class UserManagerService extends IUserManager.Stub {
        ensureCanModifyQuietMode(callingPackage, Binder.getCallingUid(), target != null);
        final long identity = Binder.clearCallingIdentity();
        try {
            boolean result = false;
            if (enableQuietMode) {
                setQuietModeEnabled(userHandle, true /* enableQuietMode */, target);
                return true;
                setQuietModeEnabled(
                        userHandle, true /* enableQuietMode */, target, callingPackage);
                result = true;
            } else {
                boolean needToShowConfirmCredential =
                        mLockPatternUtils.isSecure(userHandle)
                                && !StorageManager.isUserKeyUnlocked(userHandle);
                if (needToShowConfirmCredential) {
                    showConfirmCredentialToDisableQuietMode(userHandle, target);
                    return false;
                } else {
                    setQuietModeEnabled(userHandle, false /* enableQuietMode */, target);
                    return true;
                    setQuietModeEnabled(
                            userHandle, false /* enableQuietMode */, target, callingPackage);
                    result = true;
                }
            }
            return result;
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
@@ -894,8 +911,8 @@ public class UserManagerService extends IUserManager.Stub {
                + "default launcher nor has MANAGE_USERS/MODIFY_QUIET_MODE permission");
    }

    private void setQuietModeEnabled(
            int userHandle, boolean enableQuietMode, IntentSender target) {
    private void setQuietModeEnabled(int userHandle, boolean enableQuietMode,
            IntentSender target, @Nullable String callingPackage) {
        final UserInfo profile, parent;
        final UserData profileUserData;
        synchronized (mUsersLock) {
@@ -927,6 +944,7 @@ public class UserManagerService extends IUserManager.Stub {
                ActivityManager.getService().startUserInBackgroundWithListener(
                        userHandle, callback);
            }
            logQuietModeEnabled(userHandle, enableQuietMode, callingPackage);
        } catch (RemoteException e) {
            // Should not happen, same process.
            e.rethrowAsRuntimeException();
@@ -935,6 +953,28 @@ public class UserManagerService extends IUserManager.Stub {
                enableQuietMode);
    }

    private void logQuietModeEnabled(int userHandle, boolean enableQuietMode,
            @Nullable String callingPackage) {
        UserData userData;
        synchronized (mUsersLock) {
            userData = getUserDataLU(userHandle);
        }
        if (userData == null) {
            return;
        }
        final long now = System.currentTimeMillis();
        final long period = (userData.getLastRequestQuietModeEnabledMillis() != 0L
                ? now - userData.getLastRequestQuietModeEnabledMillis()
                : now - userData.info.creationTime);
        DevicePolicyEventLogger
                .createEvent(DevicePolicyEnums.REQUEST_QUIET_MODE_ENABLED)
                .setStrings(callingPackage)
                .setBoolean(enableQuietMode)
                .setTimePeriod(period)
                .write();
        userData.setLastRequestQuietModeEnabledMillis(now);
    }

    @Override
    public boolean isQuietModeEnabled(int userHandle) {
        synchronized (mPackagesLock) {
@@ -2314,6 +2354,12 @@ public class UserManagerService extends IUserManager.Stub {
            serializer.endTag(null, TAG_SEED_ACCOUNT_OPTIONS);
        }

        if (userData.getLastRequestQuietModeEnabledMillis() != 0L) {
            serializer.startTag(/* namespace */ null, TAG_LAST_REQUEST_QUIET_MODE_ENABLED_CALL);
            serializer.text(String.valueOf(userData.getLastRequestQuietModeEnabledMillis()));
            serializer.endTag(/* namespace */ null, TAG_LAST_REQUEST_QUIET_MODE_ENABLED_CALL);
        }

        serializer.endTag(null, TAG_USER);

        serializer.endDocument();
@@ -2408,6 +2454,7 @@ public class UserManagerService extends IUserManager.Stub {
        String iconPath = null;
        long creationTime = 0L;
        long lastLoggedInTime = 0L;
        long lastRequestQuietModeEnabledTimestamp = 0L;
        String lastLoggedInFingerprint = null;
        int profileGroupId = UserInfo.NO_PROFILE_GROUP_ID;
        int profileBadge = 0;
@@ -2494,6 +2541,11 @@ public class UserManagerService extends IUserManager.Stub {
                } else if (TAG_SEED_ACCOUNT_OPTIONS.equals(tag)) {
                    seedAccountOptions = PersistableBundle.restoreFromXml(parser);
                    persistSeedData = true;
                } else if (TAG_LAST_REQUEST_QUIET_MODE_ENABLED_CALL.equals(tag)) {
                    type = parser.next();
                    if (type == XmlPullParser.TEXT) {
                        lastRequestQuietModeEnabledTimestamp = Long.parseLong(parser.getText());
                    }
                }
            }
        }
@@ -2518,6 +2570,7 @@ public class UserManagerService extends IUserManager.Stub {
        userData.seedAccountType = seedAccountType;
        userData.persistSeedData = persistSeedData;
        userData.seedAccountOptions = seedAccountOptions;
        userData.setLastRequestQuietModeEnabledMillis(lastRequestQuietModeEnabledTimestamp);

        synchronized (mRestrictionsLock) {
            if (baseRestrictions != null) {