diff options
| author | 2022-09-07 04:23:04 +0000 | |
|---|---|---|
| committer | 2022-09-07 04:23:04 +0000 | |
| commit | 1d9daf50c38bf9570f433ce952a2136210645d83 (patch) | |
| tree | 1c198f1ceff883d26040cae0f618fe4ce1495957 | |
| parent | 1809ffcf0e1e06995baa38d98b9e1dcf7fc7edc0 (diff) | |
| parent | 0ad4f80cbb5b2713106752c11c07e7c842647cd5 (diff) | |
Merge "Added check for user info is not null" into tm-qpr-dev
| -rw-r--r-- | core/java/android/content/Intent.java | 35 | ||||
| -rw-r--r-- | services/core/java/com/android/server/VpnManagerService.java | 18 |
2 files changed, 51 insertions, 2 deletions
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 7a88a057fb77..5ca8b0535dce 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -3920,6 +3920,12 @@ public class Intent implements Parcelable, Cloneable { * that has been started. This is sent as a foreground * broadcast, since it is part of a visible user interaction; be as quick * as possible when handling it. + * + * <p> + * <b>Note:</b> The user's actual state might have changed by the time the broadcast is + * received. For example, the user could have been removed, started or stopped already, + * regardless of which broadcast you receive. Because of that, receivers should always check + * the current state of the user. * @hide */ public static final String ACTION_USER_STARTED = @@ -3937,6 +3943,12 @@ public class Intent implements Parcelable, Cloneable { * {@link #ACTION_USER_STOPPING}. It is <b>not</b> generally safe to use with * other user state broadcasts since those are foreground broadcasts so can * execute in a different order. + * + * <p> + * <b>Note:</b> The user's actual state might have changed by the time the broadcast is + * received. For example, the user could have been removed, started or stopped already, + * regardless of which broadcast you receive. Because of that, receivers should always check + * the current state of the user. * @hide */ public static final String ACTION_USER_STARTING = @@ -3955,6 +3967,11 @@ public class Intent implements Parcelable, Cloneable { * {@link #ACTION_USER_STARTING}. It is <b>not</b> generally safe to use with * other user state broadcasts since those are foreground broadcasts so can * execute in a different order. + * <p> + * <b>Note:</b> The user's actual state might have changed by the time the broadcast is + * received. For example, the user could have been removed, started or stopped already, + * regardless of which broadcast you receive. Because of that, receivers should always check + * the current state of the user. * @hide */ public static final String ACTION_USER_STOPPING = @@ -3967,6 +3984,12 @@ public class Intent implements Parcelable, Cloneable { * specific package. This is only sent to registered receivers, not manifest * receivers. It is sent to all running users <em>except</em> the one that * has just been stopped (which is no longer running). + * + * <p> + * <b>Note:</b> The user's actual state might have changed by the time the broadcast is + * received. For example, the user could have been removed, started or stopped already, + * regardless of which broadcast you receive. Because of that, receivers should always check + * the current state of the user. * @hide */ @TestApi @@ -3999,6 +4022,12 @@ public class Intent implements Parcelable, Cloneable { * It is sent to all running users. * You must hold * {@link android.Manifest.permission#MANAGE_USERS} to receive this broadcast. + * + * <p> + * <b>Note:</b> The user's actual state might have changed by the time the broadcast is + * received. For example, the user could have been removed, started or stopped already, + * regardless of which broadcast you receive. Because of that, receivers should always check + * the current state of the user. * @hide */ @SystemApi @@ -4009,6 +4038,12 @@ public class Intent implements Parcelable, Cloneable { * Broadcast Action: Sent when the credential-encrypted private storage has * become unlocked for the target user. This is only sent to registered * receivers, not manifest receivers. + * + * <p> + * <b>Note:</b> The user's actual state might have changed by the time the broadcast is + * received. For example, the user could have been removed, started or stopped already, + * regardless of which broadcast you receive. Because of that, receivers should always check + * the current state of the user. */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_USER_UNLOCKED = "android.intent.action.USER_UNLOCKED"; diff --git a/services/core/java/com/android/server/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java index 07b6843b2feb..7cb2fd0f37af 100644 --- a/services/core/java/com/android/server/VpnManagerService.java +++ b/services/core/java/com/android/server/VpnManagerService.java @@ -28,6 +28,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.UserInfo; import android.net.ConnectivityManager; import android.net.INetd; import android.net.IVpnManager; @@ -771,6 +772,12 @@ public class VpnManagerService extends IVpnManager.Stub { @VisibleForTesting void onUserStarted(int userId) { + UserInfo user = mUserManager.getUserInfo(userId); + if (user == null) { + logw("Started user doesn't exist. UserId: " + userId); + return; + } + synchronized (mVpns) { Vpn userVpn = mVpns.get(userId); if (userVpn != null) { @@ -779,7 +786,8 @@ public class VpnManagerService extends IVpnManager.Stub { } userVpn = mDeps.createVpn(mHandler.getLooper(), mContext, mNMS, mNetd, userId); mVpns.put(userId, userVpn); - if (mUserManager.getUserInfo(userId).isPrimary() && isLockdownVpnEnabled()) { + + if (user.isPrimary() && isLockdownVpnEnabled()) { updateLockdownVpn(); } } @@ -896,9 +904,15 @@ public class VpnManagerService extends IVpnManager.Stub { } private void onUserUnlocked(int userId) { + UserInfo user = mUserManager.getUserInfo(userId); + if (user == null) { + logw("Unlocked user doesn't exist. UserId: " + userId); + return; + } + synchronized (mVpns) { // User present may be sent because of an unlock, which might mean an unlocked keystore. - if (mUserManager.getUserInfo(userId).isPrimary() && isLockdownVpnEnabled()) { + if (user.isPrimary() && isLockdownVpnEnabled()) { updateLockdownVpn(); } else { startAlwaysOnVpn(userId); |