diff options
| author | 2020-12-21 19:19:23 +0000 | |
|---|---|---|
| committer | 2020-12-21 19:19:23 +0000 | |
| commit | 5d1279f2bc5e05224d41b3376d52c6065facd97f (patch) | |
| tree | 6b730144e57ba5ae5a51f767d78e04a8519816f8 | |
| parent | 2fd2954c84300c40f5f480cfa1b7d3a871e13bfb (diff) | |
| parent | 6b73b7628a19909c29704284576b399bc55696b6 (diff) | |
Merge "Clean up the multi-client ror code" am: 1fb84f4d31 am: 6b73b7628a
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1532260
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: I99289be058e781731d0b1b5ee2ab41a506e22ddf
| -rw-r--r-- | services/core/java/com/android/server/recoverysystem/RecoverySystemService.java | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java index 990055ebda9a..91f613fdbeb8 100644 --- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java +++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java @@ -32,6 +32,8 @@ import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.SystemProperties; +import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.GuardedBy; @@ -49,10 +51,6 @@ import java.io.FileDescriptor; import java.io.FileWriter; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; /** * The recovery system service is responsible for coordinating recovery related @@ -84,9 +82,9 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo private final Context mContext; @GuardedBy("this") - private final Map<String, IntentSender> mCallerPendingRequest = new HashMap<>(); + private final ArrayMap<String, IntentSender> mCallerPendingRequest = new ArrayMap<>(); @GuardedBy("this") - private final Set<String> mCallerPreparedForReboot = new HashSet<>(); + private final ArraySet<String> mCallerPreparedForReboot = new ArraySet<>(); /** * Need to prepare for resume on reboot. @@ -121,7 +119,7 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo @IntDef({ ROR_NEED_PREPARATION, ROR_SKIP_PREPARATION_AND_NOTIFY, ROR_SKIP_PREPARATION_NOT_NOTIFY }) - @interface ResumeOnRebootActionsOnRequest {} + private @interface ResumeOnRebootActionsOnRequest {} /** * The action to perform upon resume on reboot clear request for a given client. @@ -129,7 +127,7 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo @IntDef({ROR_NOT_REQUESTED, ROR_REQUESTED_NEED_CLEAR, ROR_REQUESTED_SKIP_CLEAR}) - @interface ResumeOnRebootActionsOnClear{} + private @interface ResumeOnRebootActionsOnClear{} static class Injector { protected final Context mContext; @@ -342,9 +340,8 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo != PackageManager.PERMISSION_GRANTED && mContext.checkCallingOrSelfPermission(android.Manifest.permission.REBOOT) != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("Caller or self must have " - + android.Manifest.permission.RECOVERY + " or " - + android.Manifest.permission.REBOOT + " for resume on reboot."); + throw new SecurityException("Caller must have " + android.Manifest.permission.RECOVERY + + " or " + android.Manifest.permission.REBOOT + " for resume on reboot."); } } @@ -414,10 +411,14 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo Slog.w(TAG, "onPreparedForReboot called when some clients have prepared."); } + if (mCallerPendingRequest.isEmpty()) { + Slog.w(TAG, "onPreparedForReboot called but no client has requested."); + } + // Send intents to notify callers - for (Map.Entry<String, IntentSender> entry : mCallerPendingRequest.entrySet()) { - sendPreparedForRebootIntentIfNeeded(entry.getValue()); - mCallerPreparedForReboot.add(entry.getKey()); + for (int i = 0; i < mCallerPendingRequest.size(); i++) { + sendPreparedForRebootIntentIfNeeded(mCallerPendingRequest.valueAt(i)); + mCallerPreparedForReboot.add(mCallerPendingRequest.keyAt(i)); } mCallerPendingRequest.clear(); } @@ -499,10 +500,16 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo } @Override // Binder call - public synchronized boolean isLskfCaptured(String packageName) { + public boolean isLskfCaptured(String packageName) { enforcePermissionForResumeOnReboot(); - if (!mCallerPreparedForReboot.contains(packageName)) { - Slog.i(TAG, "Reboot requested before prepare completed for caller " + packageName); + boolean captured; + synchronized (this) { + captured = mCallerPreparedForReboot.contains(packageName); + } + + if (!captured) { + Slog.i(TAG, "Reboot requested before prepare completed for caller " + + packageName); return false; } return true; |