diff --git a/api/current.xml b/api/current.xml
index 0efc4665cbf18..bdc7f2e28d890 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -31092,6 +31092,17 @@
visibility="public"
>
+
+
+ android:permission="android.permission.MASTER_CLEAR"
+ android:priority="100" >
@@ -1381,8 +1382,11 @@
+
+
+
-
-
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 037a3627eefce..e1b5d93ce2c48 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2337,4 +2337,33 @@
Mobile data limit exceeded
Touch to learn more about mobile data use
+
+
+
+ Unmounting USB storage...
+
+ Unmounting SD card...
+
+ Erasing USB storage...
+
+ Erasing SD card...
+
+ Failed to erase USB storage.
+
+ Failed to erase SD card.
+
+ SD card was removed before being unmounted.
+
+ USB storage is currently being checked.
+
+ SD card is currently being checked.
+
+ SD card has been removed.
+
+ USB storage is currently in use by a computer.
+
+ SD card is currently in use by a computer.
+
+ External media in unknown state.
+
diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java
index 21273cce21fb7..1538003450bca 100644
--- a/services/java/com/android/server/DevicePolicyManagerService.java
+++ b/services/java/com/android/server/DevicePolicyManagerService.java
@@ -17,6 +17,7 @@
package com.android.server;
import com.android.internal.content.PackageMonitor;
+import com.android.internal.os.storage.ExternalStorageFormatter;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.JournaledFile;
import com.android.internal.util.XmlUtils;
@@ -41,6 +42,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Binder;
import android.os.IBinder;
import android.os.IPowerManager;
+import android.os.PowerManager;
import android.os.RecoverySystem;
import android.os.RemoteCallback;
import android.os.RemoteException;
@@ -71,6 +73,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
final Context mContext;
final MyPackageMonitor mMonitor;
+ final PowerManager.WakeLock mWakeLock;
IPowerManager mIPowerManager;
@@ -216,6 +219,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
mContext = context;
mMonitor = new MyPackageMonitor();
mMonitor.register(context, true);
+ mWakeLock = ((PowerManager)context.getSystemService(Context.POWER_SERVICE))
+ .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DPM");
}
private IPowerManager getIPowerManager() {
@@ -862,10 +867,17 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
}
void wipeDataLocked(int flags) {
- try {
- RecoverySystem.rebootWipeUserData(mContext);
- } catch (IOException e) {
- Slog.w(TAG, "Failed requesting data wipe", e);
+ if ((flags&DevicePolicyManager.WIPE_EXTERNAL_STORAGE) != 0) {
+ Intent intent = new Intent(ExternalStorageFormatter.FORMAT_AND_FACTORY_RESET);
+ intent.setComponent(ExternalStorageFormatter.COMPONENT_NAME);
+ mWakeLock.acquire(10000);
+ mContext.startService(intent);
+ } else {
+ try {
+ RecoverySystem.rebootWipeUserData(mContext);
+ } catch (IOException e) {
+ Slog.w(TAG, "Failed requesting data wipe", e);
+ }
}
}
diff --git a/services/java/com/android/server/MasterClearReceiver.java b/services/java/com/android/server/MasterClearReceiver.java
index 4d04cee3952d1..bdb5a24f664df 100644
--- a/services/java/com/android/server/MasterClearReceiver.java
+++ b/services/java/com/android/server/MasterClearReceiver.java
@@ -29,7 +29,7 @@ public class MasterClearReceiver extends BroadcastReceiver {
private static final String TAG = "MasterClear";
@Override
- public void onReceive(Context context, Intent intent) {
+ public void onReceive(final Context context, final Intent intent) {
if (intent.getAction().equals(Intent.ACTION_REMOTE_INTENT)) {
if (!"google.com".equals(intent.getStringExtra("from"))) {
Slog.w(TAG, "Ignoring master clear request -- not from trusted server.");
@@ -37,16 +37,23 @@ public class MasterClearReceiver extends BroadcastReceiver {
}
}
- try {
- Slog.w(TAG, "!!! FACTORY RESET !!!");
- if (intent.hasExtra("enableEFS")) {
- RecoverySystem.rebootToggleEFS(context, intent.getBooleanExtra("enableEFS", false));
- } else {
- RecoverySystem.rebootWipeUserData(context);
+ Slog.w(TAG, "!!! FACTORY RESET !!!");
+ // The reboot call is blocking, so we need to do it on another thread.
+ Thread thr = new Thread("Reboot") {
+ @Override
+ public void run() {
+ try {
+ if (intent.hasExtra("enableEFS")) {
+ RecoverySystem.rebootToggleEFS(context, intent.getBooleanExtra("enableEFS", false));
+ } else {
+ RecoverySystem.rebootWipeUserData(context);
+ }
+ Log.wtf(TAG, "Still running after master clear?!");
+ } catch (IOException e) {
+ Slog.e(TAG, "Can't perform master clear/factory reset", e);
+ }
}
- Log.wtf(TAG, "Still running after master clear?!");
- } catch (IOException e) {
- Slog.e(TAG, "Can't perform master clear/factory reset", e);
- }
+ };
+ thr.start();
}
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index de228d91be495..aa2f784dc7977 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -7036,6 +7036,9 @@ public final class ActivityManagerService extends ActivityManagerNative
if (mHeavyWeightProcess == app) {
currApp.flags |= ActivityManager.RunningAppProcessInfo.FLAG_CANT_SAVE_STATE;
}
+ if (app.persistent) {
+ currApp.flags |= ActivityManager.RunningAppProcessInfo.FLAG_PERSISTENT;
+ }
int adj = app.curAdj;
if (adj >= EMPTY_APP_ADJ) {
currApp.importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_EMPTY;