1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
226d36fd3a03299b9b1bdaaceef2bfaa8714c3fa72Gilles Debunneimport android.os.storage.StorageVolume;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
271337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport com.android.internal.os.storage.ExternalStorageFormatter;
281337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Confirm and execute a format of the sdcard.
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Multiple confirmations are required: first, a general "are you sure
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you want to do this?" prompt, followed by a keyguard pattern trace if the user
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * has defined one, followed by a final strongly-worded "THIS WILL ERASE EVERYTHING
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * ON THE SD CARD" prompt.  If at any time the phone is allowed to go to sleep, is
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * locked, et cetera, then the confirmation sequence is abandoned.
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class MediaFormat extends Activity {
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int KEYGUARD_REQUEST = 55;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private View mInitialView;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mInitiateButton;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private View mFinalView;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mFinalButton;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4950cb76f58554dbccc51a754a73abef2debd8b721Ying Wang    /**
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * The user has gone through the multiple confirmation, so now we go ahead
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * and invoke the Mount Service to format the SD card.
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
5550cb76f58554dbccc51a754a73abef2debd8b721Ying Wang
56a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang                if (Utils.isMonkeyRunning()) {
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    return;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
591337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                Intent intent = new Intent(ExternalStorageFormatter.FORMAT_ONLY);
601337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                intent.setComponent(ExternalStorageFormatter.COMPONENT_NAME);
616d36fd3a03299b9b1bdaaceef2bfaa8714c3fa72Gilles Debunne                // Transfer the storage volume to the new intent
626d36fd3a03299b9b1bdaaceef2bfaa8714c3fa72Gilles Debunne                final StorageVolume storageVolume = getIntent().getParcelableExtra(
636d36fd3a03299b9b1bdaaceef2bfaa8714c3fa72Gilles Debunne                        StorageVolume.EXTRA_STORAGE_VOLUME);
646d36fd3a03299b9b1bdaaceef2bfaa8714c3fa72Gilles Debunne                intent.putExtra(StorageVolume.EXTRA_STORAGE_VOLUME, storageVolume);
651337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                startService(intent);
661337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                finish();
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     *  Keyguard validation is run using the standard {@link ConfirmLockPattern}
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * component as a subactivity
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
742deec7edc937b1d19df0a74c4cd0c5ee3ef33070Jim Miller    private boolean runKeyguardConfirmation(int request) {
752deec7edc937b1d19df0a74c4cd0c5ee3ef33070Jim Miller        return new ChooseLockSettingsHelper(this)
762deec7edc937b1d19df0a74c4cd0c5ee3ef33070Jim Miller                .launchConfirmationActivity(request,
772deec7edc937b1d19df0a74c4cd0c5ee3ef33070Jim Miller                        getText(R.string.media_format_gesture_prompt),
782deec7edc937b1d19df0a74c4cd0c5ee3ef33070Jim Miller                        getText(R.string.media_format_gesture_explanation));
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (requestCode != KEYGUARD_REQUEST) {
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return;
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // If the user entered a valid keyguard trace, present the final
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // confirmation prompt; otherwise, go back to the initial state.
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (resultCode == Activity.RESULT_OK) {
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            establishFinalConfirmationState();
932deec7edc937b1d19df0a74c4cd0c5ee3ef33070Jim Miller        } else if (resultCode == Activity.RESULT_CANCELED) {
942deec7edc937b1d19df0a74c4cd0c5ee3ef33070Jim Miller            finish();
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            establishInitialState();
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * If the user clicks to begin the reset sequence, we next require a
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * keyguard confirmation if the user has currently enabled one.  If there
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * is no keyguard available, we simply go to the final confirmation prompt.
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button.OnClickListener mInitiateListener = new Button.OnClickListener() {
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
1072deec7edc937b1d19df0a74c4cd0c5ee3ef33070Jim Miller                if (!runKeyguardConfirmation(KEYGUARD_REQUEST)) {
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    establishFinalConfirmationState();
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Configure the UI for the final confirmation interaction
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void establishFinalConfirmationState() {
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (mFinalView == null) {
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mFinalView = mInflater.inflate(R.layout.media_format_final, null);
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mFinalButton =
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    (Button) mFinalView.findViewById(R.id.execute_media_format);
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mFinalButton.setOnClickListener(mFinalClickListener);
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setContentView(mFinalView);
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * In its initial state, the activity presents a button for the user to
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * click in order to initiate a confirmation sequence.  This method is
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * called from various other points in the code to reset the activity to
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * this base state.
13247d380f1e6c823cea444004cb799d4c791145cc6Jim Miller     *
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * <p>Reinflating views from resources is expensive and prevents us from
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * caching widget pointers, so we use a single-inflate pattern:  we lazy-
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * inflate each view, caching all of the widget pointers we'll need at the
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * time, then simply reuse the inflated views directly whenever we need
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * to change contents.
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void establishInitialState() {
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (mInitialView == null) {
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mInitialView = mInflater.inflate(R.layout.media_format_primary, null);
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mInitiateButton =
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    (Button) mInitialView.findViewById(R.id.initiate_media_format);
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mInitiateButton.setOnClickListener(mInitiateListener);
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setContentView(mInitialView);
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle savedState) {
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedState);
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInitialView = null;
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mFinalView = null;
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInflater = LayoutInflater.from(this);
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        establishInitialState();
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Abandon all progress through the confirmation sequence by returning
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * to the initial view any time the activity is interrupted (e.g. by
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * idle timeout).
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onPause() {
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1691337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        if (!isFinishing()) {
1701337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            establishInitialState();
1711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
174