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