Loading services/core/java/com/android/server/recoverysystem/RecoverySystemService.java +24 −17 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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. Loading Loading @@ -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. Loading @@ -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; Loading Loading @@ -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."); } } Loading Loading @@ -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(); } Loading Loading @@ -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; Loading Loading
services/core/java/com/android/server/recoverysystem/RecoverySystemService.java +24 −17 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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. Loading Loading @@ -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. Loading @@ -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; Loading Loading @@ -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."); } } Loading Loading @@ -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(); } Loading Loading @@ -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; Loading