19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xuimport android.app.ProgressDialog; 2018e939623556928f73fcc7511c85a537929a4a7eDan Egnorimport android.content.BroadcastReceiver; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 23e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xuimport android.os.AsyncTask; 2418e939623556928f73fcc7511c85a537929a4a7eDan Egnorimport android.os.RecoverySystem; 25e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xuimport android.os.storage.StorageManager; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 278a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 28e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xuimport android.view.WindowManager; 29e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu 30e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xuimport com.android.internal.R; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3218e939623556928f73fcc7511c85a537929a4a7eDan Egnorimport java.io.IOException; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3418e939623556928f73fcc7511c85a537929a4a7eDan Egnorpublic class MasterClearReceiver extends BroadcastReceiver { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "MasterClear"; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 38424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn public void onReceive(final Context context, final Intent intent) { 3997ecc9cbe7eccafc0923d7655daf07f4c2ea9791Wei Huang if (intent.getAction().equals(Intent.ACTION_REMOTE_INTENT)) { 4063cfebf2dbe628508cccc10f47754fdacd48c1a0Costin Manolache if (!"google.com".equals(intent.getStringExtra("from"))) { 418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Ignoring master clear request -- not from trusted server."); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4518e939623556928f73fcc7511c85a537929a4a7eDan Egnor 46cdf008883921c2eb7daf10c82687e9a36461eb16Doug Zongker final boolean shutdown = intent.getBooleanExtra("shutdown", false); 47004a4b20f8d3116e6a711525960d433fcfea4ee4Jeff Sharkey final String reason = intent.getStringExtra(Intent.EXTRA_REASON); 48e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu final boolean wipeExternalStorage = intent.getBooleanExtra( 49e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu Intent.EXTRA_WIPE_EXTERNAL_STORAGE, false); 50cdf008883921c2eb7daf10c82687e9a36461eb16Doug Zongker 51424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn Slog.w(TAG, "!!! FACTORY RESET !!!"); 52424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn // The reboot call is blocking, so we need to do it on another thread. 53424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn Thread thr = new Thread("Reboot") { 54424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn @Override 55424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn public void run() { 56424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn try { 57004a4b20f8d3116e6a711525960d433fcfea4ee4Jeff Sharkey RecoverySystem.rebootWipeUserData(context, shutdown, reason); 58424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn Log.wtf(TAG, "Still running after master clear?!"); 59424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn } catch (IOException e) { 60424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn Slog.e(TAG, "Can't perform master clear/factory reset", e); 61fe0538098403b49ebd9219bf77236471bb5ca63bJulia Reynolds } catch (SecurityException e) { 62fe0538098403b49ebd9219bf77236471bb5ca63bJulia Reynolds Slog.e(TAG, "Can't perform master clear/factory reset", e); 63424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn }; 66e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu 67e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu if (wipeExternalStorage) { 68e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu // thr will be started at the end of this task. 69e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu new WipeAdoptableDisksTask(context, thr).execute(); 70e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu } else { 71e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu thr.start(); 72e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu } 73e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu } 74e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu 75e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu private class WipeAdoptableDisksTask extends AsyncTask<Void, Void, Void> { 76e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu private final Thread mChainedTask; 77e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu private final Context mContext; 78e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu private final ProgressDialog mProgressDialog; 79e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu 80e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu public WipeAdoptableDisksTask(Context context, Thread chainedTask) { 81e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu mContext = context; 82e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu mChainedTask = chainedTask; 83e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu mProgressDialog = new ProgressDialog(context); 84e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu } 85e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu 86e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu @Override 87e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu protected void onPreExecute() { 88e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu mProgressDialog.setIndeterminate(true); 89e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 90e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu mProgressDialog.setMessage(mContext.getText(R.string.progress_erasing)); 91e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu mProgressDialog.show(); 92e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu } 93e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu 94e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu @Override 95e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu protected Void doInBackground(Void... params) { 96e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu Slog.w(TAG, "Wiping adoptable disks"); 97e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu StorageManager sm = (StorageManager) mContext.getSystemService( 98e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu Context.STORAGE_SERVICE); 99e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu sm.wipeAdoptableDisks(); 100e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu return null; 101e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu } 102e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu 103e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu @Override 104e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu protected void onPostExecute(Void result) { 105e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu mProgressDialog.dismiss(); 106e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu mChainedTask.start(); 107e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu } 108e8490f1d78a62826742ddf4af8943e6666a1a8d0Rubin Xu 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 111