diff options
-rw-r--r-- | core/java/android/os/RecoverySystem.java | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 6a01e56cdf52..7cc7ccd2ad16 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -30,6 +30,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.os.storage.IStorageManager; import android.provider.Settings; import android.telephony.euicc.EuiccManager; import android.text.TextUtils; @@ -38,6 +39,8 @@ import android.util.Log; import android.view.Display; import android.view.WindowManager; +import com.android.internal.content.PackageHelper; + import libcore.io.Streams; import java.io.ByteArrayInputStream; @@ -854,6 +857,21 @@ public class RecoverySystem { /** {@hide} */ public static void rebootPromptAndWipeUserData(Context context, String reason) throws IOException { + boolean checkpointing = false; + + // If we are running in checkpointing mode, we should not prompt a wipe. + // Checkpointing may save us. If it doesn't, we will wind up here again. + try { + IStorageManager storageManager = PackageHelper.getStorageManager(); + if (storageManager.needsCheckpoint()) { + Log.i(TAG, "Rescue Party requested wipe. Aborting update instead."); + storageManager.abortChanges("rescueparty", false); + } + return; + } catch (RemoteException e) { + Log.i(TAG, "Failed to handle with checkpointing. Continuing with wipe."); + } + String reasonArg = null; if (!TextUtils.isEmpty(reason)) { reasonArg = "--reason=" + sanitizeArg(reason); |