Add a DevicePolicyEvent metric for requestQuietModeEnabled.
Bug: 120678486
Test: Manual
Change-Id: If34ce2b567f0e836e1fd83a51c6e464e2cf6e0a9
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index c18ca25..d1d5818 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -31,6 +31,7 @@
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.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.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.List;
import java.util.Objects;
-import libcore.io.IoUtils;
-
/**
* Service for {@link UserManager}.
*
@@ -173,6 +175,8 @@
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 @@
/** 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 @@
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 @@
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 @@
+ "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 @@
ActivityManager.getService().startUserInBackgroundWithListener(
userHandle, callback);
}
+ logQuietModeEnabled(userHandle, enableQuietMode, callingPackage);
} catch (RemoteException e) {
// Should not happen, same process.
e.rethrowAsRuntimeException();
@@ -935,6 +953,28 @@
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 @@
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 @@
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 @@
} 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 @@
userData.seedAccountType = seedAccountType;
userData.persistSeedData = persistSeedData;
userData.seedAccountOptions = seedAccountOptions;
+ userData.setLastRequestQuietModeEnabledMillis(lastRequestQuietModeEnabledTimestamp);
synchronized (mRestrictionsLock) {
if (baseRestrictions != null) {