Implement issue #3094621 and #3094609 - wipe sd card

3094621: add "wipe sd card" option to factory data reset
3094609: collapse unmount/format into one command

Also since we have decided that it is important to consider
the Crespo storage as internal storage, DevicePolicyManager
gets a new API to be able to wipe it.  (No big deal, since
all of the work for this is now done in the implementation
of the new UI.)

Change-Id: I32a77c410f710a87dcdcbf6586c09bd2e48a8807
diff --git a/services/java/com/android/server/MasterClearReceiver.java b/services/java/com/android/server/MasterClearReceiver.java
index 4d04cee..bdb5a24 100644
--- a/services/java/com/android/server/MasterClearReceiver.java
+++ b/services/java/com/android/server/MasterClearReceiver.java
@@ -29,7 +29,7 @@
     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 @@
             }
         }
 
-        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();
     }
 }