Loading api/current.xml +11 −0 Original line number Diff line number Diff line Loading @@ -37902,6 +37902,17 @@ visibility="public" > </field> <field name="WIPE_EXTERNAL_STORAGE" type="int" transient="false" volatile="false" value="1" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> </class> </package> <package name="android.app.backup" core/java/android/app/ActivityManager.java +7 −0 Original line number Diff line number Diff line Loading @@ -762,6 +762,13 @@ public class ActivityManager { */ public static final int FLAG_CANT_SAVE_STATE = 1<<0; /** * Constant for {@link #flags}: this process is associated with a * persistent system app. * @hide */ public static final int FLAG_PERSISTENT = 1<<1; /** * Flags of information. May be any of * {@link #FLAG_CANT_SAVE_STATE}. Loading core/java/android/app/admin/DevicePolicyManager.java +6 −0 Original line number Diff line number Diff line Loading @@ -895,6 +895,12 @@ public class DevicePolicyManager { } } /** * Flag for {@link #wipeData(int)}: also erase the device's external * storage. */ public static final int WIPE_EXTERNAL_STORAGE = 0x0001; /** * Ask the user date be wiped. This will cause the device to reboot, * erasing all user data while next booting up. External storage such Loading core/java/com/android/internal/os/storage/ExternalStorageFormatter.java 0 → 100644 +228 −0 Original line number Diff line number Diff line package com.android.internal.os.storage; import android.app.ProgressDialog; import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Environment; import android.os.IBinder; import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.storage.IMountService; import android.os.storage.StorageEventListener; import android.os.storage.StorageManager; import android.util.Log; import android.view.WindowManager; import android.widget.Toast; import com.android.internal.R; /** * Takes care of unmounting and formatting external storage. */ public class ExternalStorageFormatter extends Service implements DialogInterface.OnCancelListener { static final String TAG = "ExternalStorageFormatter"; public static final String FORMAT_ONLY = "com.android.internal.os.storage.FORMAT_ONLY"; public static final String FORMAT_AND_FACTORY_RESET = "com.android.internal.os.storage.FORMAT_AND_FACTORY_RESET"; public static final String EXTRA_ALWAYS_RESET = "always_reset"; public static final ComponentName COMPONENT_NAME = new ComponentName("android", ExternalStorageFormatter.class.getName()); // Access using getMountService() private IMountService mMountService = null; private StorageManager mStorageManager = null; private PowerManager.WakeLock mWakeLock; private ProgressDialog mProgressDialog = null; private boolean mFactoryReset = false; private boolean mAlwaysReset = false; StorageEventListener mStorageListener = new StorageEventListener() { @Override public void onStorageStateChanged(String path, String oldState, String newState) { Log.i(TAG, "Received storage state changed notification that " + path + " changed state from " + oldState + " to " + newState); updateProgressState(); } }; @Override public void onCreate() { super.onCreate(); if (mStorageManager == null) { mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); mStorageManager.registerListener(mStorageListener); } mWakeLock = ((PowerManager)getSystemService(Context.POWER_SERVICE)) .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ExternalStorageFormatter"); mWakeLock.acquire(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (FORMAT_AND_FACTORY_RESET.equals(intent.getAction())) { mFactoryReset = true; } if (intent.getBooleanExtra(EXTRA_ALWAYS_RESET, false)) { mAlwaysReset = true; } if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setIndeterminate(true); mProgressDialog.setCancelable(true); mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); if (!mAlwaysReset) { mProgressDialog.setOnCancelListener(this); } updateProgressState(); mProgressDialog.show(); } return Service.START_REDELIVER_INTENT; } @Override public void onDestroy() { if (mStorageManager != null) { mStorageManager.unregisterListener(mStorageListener); } if (mProgressDialog != null) { mProgressDialog.dismiss(); } mWakeLock.release(); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCancel(DialogInterface dialog) { IMountService mountService = getMountService(); String extStoragePath = Environment.getExternalStorageDirectory().toString(); try { mountService.mountVolume(extStoragePath); } catch (RemoteException e) { Log.w(TAG, "Failed talking with mount service", e); } stopSelf(); } void fail(int msg) { Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); if (mAlwaysReset) { sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR")); } stopSelf(); } void updateProgressState() { String status = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(status) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(status)) { updateProgressDialog(R.string.progress_unmounting); IMountService mountService = getMountService(); String extStoragePath = Environment.getExternalStorageDirectory().toString(); try { mountService.unmountVolume(extStoragePath, true); } catch (RemoteException e) { Log.w(TAG, "Failed talking with mount service", e); } } else if (Environment.MEDIA_NOFS.equals(status) || Environment.MEDIA_UNMOUNTED.equals(status) || Environment.MEDIA_UNMOUNTABLE.equals(status)) { updateProgressDialog(R.string.progress_erasing); final IMountService mountService = getMountService(); final String extStoragePath = Environment.getExternalStorageDirectory().toString(); if (mountService != null) { new Thread() { public void run() { boolean success = false; try { mountService.formatVolume(extStoragePath); success = true; } catch (Exception e) { Toast.makeText(ExternalStorageFormatter.this, R.string.format_error, Toast.LENGTH_LONG).show(); } if (success) { if (mFactoryReset) { sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR")); // Intent handling is asynchronous -- assume it will happen soon. stopSelf(); return; } } // If we didn't succeed, or aren't doing a full factory // reset, then it is time to remount the storage. if (!success && mAlwaysReset) { sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR")); } else { try { mountService.mountVolume(extStoragePath); } catch (RemoteException e) { Log.w(TAG, "Failed talking with mount service", e); } } stopSelf(); return; } }.start(); } else { Log.w("MediaFormat", "Unable to locate IMountService"); } } else if (Environment.MEDIA_BAD_REMOVAL.equals(status)) { fail(R.string.media_bad_removal); } else if (Environment.MEDIA_CHECKING.equals(status)) { fail(R.string.media_checking); } else if (Environment.MEDIA_REMOVED.equals(status)) { fail(R.string.media_removed); } else if (Environment.MEDIA_SHARED.equals(status)) { fail(R.string.media_shared); } else { fail(R.string.media_unknown_state); Log.w(TAG, "Unknown storage state: " + status); stopSelf(); } } public void updateProgressDialog(int msg) { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setIndeterminate(true); mProgressDialog.setCancelable(false); mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); mProgressDialog.show(); } mProgressDialog.setMessage(getText(msg)); } IMountService getMountService() { if (mMountService == null) { IBinder service = ServiceManager.getService("mount"); if (service != null) { mMountService = IMountService.Stub.asInterface(service); } else { Log.e(TAG, "Can't get mount service"); } } return mMountService; } } core/res/AndroidManifest.xml +7 −3 Original line number Diff line number Diff line Loading @@ -1389,7 +1389,8 @@ </receiver> <receiver android:name="com.android.server.MasterClearReceiver" android:permission="android.permission.MASTER_CLEAR" > android:permission="android.permission.MASTER_CLEAR" android:priority="100" > <intent-filter> <!-- For Checkin, Settings, etc.: action=MASTER_CLEAR --> <action android:name="android.intent.action.MASTER_CLEAR" /> Loading @@ -1399,8 +1400,11 @@ <category android:name="android.intent.category.MASTER_CLEAR" /> </intent-filter> </receiver> </application> </manifest> <service android:name="com.android.internal.os.storage.ExternalStorageFormatter" android:permission="android.permission.MASTER_CLEAR" android:exported="true" /> </application> </manifest> Loading
api/current.xml +11 −0 Original line number Diff line number Diff line Loading @@ -37902,6 +37902,17 @@ visibility="public" > </field> <field name="WIPE_EXTERNAL_STORAGE" type="int" transient="false" volatile="false" value="1" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> </class> </package> <package name="android.app.backup"
core/java/android/app/ActivityManager.java +7 −0 Original line number Diff line number Diff line Loading @@ -762,6 +762,13 @@ public class ActivityManager { */ public static final int FLAG_CANT_SAVE_STATE = 1<<0; /** * Constant for {@link #flags}: this process is associated with a * persistent system app. * @hide */ public static final int FLAG_PERSISTENT = 1<<1; /** * Flags of information. May be any of * {@link #FLAG_CANT_SAVE_STATE}. Loading
core/java/android/app/admin/DevicePolicyManager.java +6 −0 Original line number Diff line number Diff line Loading @@ -895,6 +895,12 @@ public class DevicePolicyManager { } } /** * Flag for {@link #wipeData(int)}: also erase the device's external * storage. */ public static final int WIPE_EXTERNAL_STORAGE = 0x0001; /** * Ask the user date be wiped. This will cause the device to reboot, * erasing all user data while next booting up. External storage such Loading
core/java/com/android/internal/os/storage/ExternalStorageFormatter.java 0 → 100644 +228 −0 Original line number Diff line number Diff line package com.android.internal.os.storage; import android.app.ProgressDialog; import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Environment; import android.os.IBinder; import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.storage.IMountService; import android.os.storage.StorageEventListener; import android.os.storage.StorageManager; import android.util.Log; import android.view.WindowManager; import android.widget.Toast; import com.android.internal.R; /** * Takes care of unmounting and formatting external storage. */ public class ExternalStorageFormatter extends Service implements DialogInterface.OnCancelListener { static final String TAG = "ExternalStorageFormatter"; public static final String FORMAT_ONLY = "com.android.internal.os.storage.FORMAT_ONLY"; public static final String FORMAT_AND_FACTORY_RESET = "com.android.internal.os.storage.FORMAT_AND_FACTORY_RESET"; public static final String EXTRA_ALWAYS_RESET = "always_reset"; public static final ComponentName COMPONENT_NAME = new ComponentName("android", ExternalStorageFormatter.class.getName()); // Access using getMountService() private IMountService mMountService = null; private StorageManager mStorageManager = null; private PowerManager.WakeLock mWakeLock; private ProgressDialog mProgressDialog = null; private boolean mFactoryReset = false; private boolean mAlwaysReset = false; StorageEventListener mStorageListener = new StorageEventListener() { @Override public void onStorageStateChanged(String path, String oldState, String newState) { Log.i(TAG, "Received storage state changed notification that " + path + " changed state from " + oldState + " to " + newState); updateProgressState(); } }; @Override public void onCreate() { super.onCreate(); if (mStorageManager == null) { mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); mStorageManager.registerListener(mStorageListener); } mWakeLock = ((PowerManager)getSystemService(Context.POWER_SERVICE)) .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ExternalStorageFormatter"); mWakeLock.acquire(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (FORMAT_AND_FACTORY_RESET.equals(intent.getAction())) { mFactoryReset = true; } if (intent.getBooleanExtra(EXTRA_ALWAYS_RESET, false)) { mAlwaysReset = true; } if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setIndeterminate(true); mProgressDialog.setCancelable(true); mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); if (!mAlwaysReset) { mProgressDialog.setOnCancelListener(this); } updateProgressState(); mProgressDialog.show(); } return Service.START_REDELIVER_INTENT; } @Override public void onDestroy() { if (mStorageManager != null) { mStorageManager.unregisterListener(mStorageListener); } if (mProgressDialog != null) { mProgressDialog.dismiss(); } mWakeLock.release(); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCancel(DialogInterface dialog) { IMountService mountService = getMountService(); String extStoragePath = Environment.getExternalStorageDirectory().toString(); try { mountService.mountVolume(extStoragePath); } catch (RemoteException e) { Log.w(TAG, "Failed talking with mount service", e); } stopSelf(); } void fail(int msg) { Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); if (mAlwaysReset) { sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR")); } stopSelf(); } void updateProgressState() { String status = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(status) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(status)) { updateProgressDialog(R.string.progress_unmounting); IMountService mountService = getMountService(); String extStoragePath = Environment.getExternalStorageDirectory().toString(); try { mountService.unmountVolume(extStoragePath, true); } catch (RemoteException e) { Log.w(TAG, "Failed talking with mount service", e); } } else if (Environment.MEDIA_NOFS.equals(status) || Environment.MEDIA_UNMOUNTED.equals(status) || Environment.MEDIA_UNMOUNTABLE.equals(status)) { updateProgressDialog(R.string.progress_erasing); final IMountService mountService = getMountService(); final String extStoragePath = Environment.getExternalStorageDirectory().toString(); if (mountService != null) { new Thread() { public void run() { boolean success = false; try { mountService.formatVolume(extStoragePath); success = true; } catch (Exception e) { Toast.makeText(ExternalStorageFormatter.this, R.string.format_error, Toast.LENGTH_LONG).show(); } if (success) { if (mFactoryReset) { sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR")); // Intent handling is asynchronous -- assume it will happen soon. stopSelf(); return; } } // If we didn't succeed, or aren't doing a full factory // reset, then it is time to remount the storage. if (!success && mAlwaysReset) { sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR")); } else { try { mountService.mountVolume(extStoragePath); } catch (RemoteException e) { Log.w(TAG, "Failed talking with mount service", e); } } stopSelf(); return; } }.start(); } else { Log.w("MediaFormat", "Unable to locate IMountService"); } } else if (Environment.MEDIA_BAD_REMOVAL.equals(status)) { fail(R.string.media_bad_removal); } else if (Environment.MEDIA_CHECKING.equals(status)) { fail(R.string.media_checking); } else if (Environment.MEDIA_REMOVED.equals(status)) { fail(R.string.media_removed); } else if (Environment.MEDIA_SHARED.equals(status)) { fail(R.string.media_shared); } else { fail(R.string.media_unknown_state); Log.w(TAG, "Unknown storage state: " + status); stopSelf(); } } public void updateProgressDialog(int msg) { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setIndeterminate(true); mProgressDialog.setCancelable(false); mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); mProgressDialog.show(); } mProgressDialog.setMessage(getText(msg)); } IMountService getMountService() { if (mMountService == null) { IBinder service = ServiceManager.getService("mount"); if (service != null) { mMountService = IMountService.Stub.asInterface(service); } else { Log.e(TAG, "Can't get mount service"); } } return mMountService; } }
core/res/AndroidManifest.xml +7 −3 Original line number Diff line number Diff line Loading @@ -1389,7 +1389,8 @@ </receiver> <receiver android:name="com.android.server.MasterClearReceiver" android:permission="android.permission.MASTER_CLEAR" > android:permission="android.permission.MASTER_CLEAR" android:priority="100" > <intent-filter> <!-- For Checkin, Settings, etc.: action=MASTER_CLEAR --> <action android:name="android.intent.action.MASTER_CLEAR" /> Loading @@ -1399,8 +1400,11 @@ <category android:name="android.intent.category.MASTER_CLEAR" /> </intent-filter> </receiver> </application> </manifest> <service android:name="com.android.internal.os.storage.ExternalStorageFormatter" android:permission="android.permission.MASTER_CLEAR" android:exported="true" /> </application> </manifest>