Loading services/core/java/com/android/server/pm/UserManagerService.java +64 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -121,8 +125,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Objects; import libcore.io.IoUtils; /** * Service for {@link UserManager}. * Loading Loading @@ -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"; Loading Loading @@ -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; Loading Loading @@ -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)); } }; Loading Loading @@ -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); } Loading Loading @@ -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) { Loading Loading @@ -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(); Loading @@ -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) { Loading Loading @@ -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(); Loading Loading @@ -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; Loading Loading @@ -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()); } } } } Loading @@ -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) { Loading Loading
services/core/java/com/android/server/pm/UserManagerService.java +64 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -121,8 +125,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Objects; import libcore.io.IoUtils; /** * Service for {@link UserManager}. * Loading Loading @@ -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"; Loading Loading @@ -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; Loading Loading @@ -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)); } }; Loading Loading @@ -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); } Loading Loading @@ -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) { Loading Loading @@ -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(); Loading @@ -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) { Loading Loading @@ -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(); Loading Loading @@ -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; Loading Loading @@ -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()); } } } } Loading @@ -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) { Loading