MediaFormat.java revision 47d380f1e6c823cea444004cb799d4c791145cc6
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 com.android.internal.widget.LockPatternUtils;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.IMountService;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.ServiceManager;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.SystemProperties;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Environment;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.TextUtils;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Confirm and execute a format of the sdcard.
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Multiple confirmations are required: first, a general "are you sure
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you want to do this?" prompt, followed by a keyguard pattern trace if the user
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * has defined one, followed by a final strongly-worded "THIS WILL ERASE EVERYTHING
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * ON THE SD CARD" prompt.  If at any time the phone is allowed to go to sleep, is
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * locked, et cetera, then the confirmation sequence is abandoned.
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class MediaFormat extends Activity {
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int KEYGUARD_REQUEST = 55;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LockPatternUtils mLockUtils;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private View mInitialView;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mInitiateButton;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private View mFinalView;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mFinalButton;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
5750cb76f58554dbccc51a754a73abef2debd8b721Ying Wang    /**
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * The user has gone through the multiple confirmation, so now we go ahead
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * and invoke the Mount Service to format the SD card.
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
6350cb76f58554dbccc51a754a73abef2debd8b721Ying Wang
64a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang                if (Utils.isMonkeyRunning()) {
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    return;
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                IMountService service =
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                        IMountService.Stub.asInterface(ServiceManager.getService("mount"));
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (service != null) {
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    try {
7133b0202273269c35906d4080a7ef656a180d6f1cSan Mehat                        service.formatVolume(Environment.getExternalStorageDirectory().toString());
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    } catch (android.os.RemoteException e) {
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                        // Intentionally blank - there's nothing we can do here
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                        Log.w("MediaFormat", "Unable to invoke IMountService.formatMedia()");
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    }
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                } else {
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Log.w("MediaFormat", "Unable to locate IMountService");
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            finish();
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     *  Keyguard validation is run using the standard {@link ConfirmLockPattern}
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * component as a subactivity
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void runKeyguardConfirmation() {
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final Intent intent = new Intent();
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.setClassName("com.android.settings",
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                "com.android.settings.ConfirmLockPattern");
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // supply header and footer text in the intent
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ConfirmLockPattern.HEADER_TEXT,
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                getText(R.string.media_format_gesture_prompt));
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ConfirmLockPattern.FOOTER_TEXT,
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                getText(R.string.media_format_gesture_explanation));
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        startActivityForResult(intent, KEYGUARD_REQUEST);
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (requestCode != KEYGUARD_REQUEST) {
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return;
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // If the user entered a valid keyguard trace, present the final
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // confirmation prompt; otherwise, go back to the initial state.
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (resultCode == Activity.RESULT_OK) {
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            establishFinalConfirmationState();
111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            establishInitialState();
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * If the user clicks to begin the reset sequence, we next require a
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * keyguard confirmation if the user has currently enabled one.  If there
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * is no keyguard available, we simply go to the final confirmation prompt.
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button.OnClickListener mInitiateListener = new Button.OnClickListener() {
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (mLockUtils.isLockPatternEnabled()) {
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    runKeyguardConfirmation();
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                } else {
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    establishFinalConfirmationState();
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Configure the UI for the final confirmation interaction
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void establishFinalConfirmationState() {
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (mFinalView == null) {
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mFinalView = mInflater.inflate(R.layout.media_format_final, null);
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mFinalButton =
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    (Button) mFinalView.findViewById(R.id.execute_media_format);
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mFinalButton.setOnClickListener(mFinalClickListener);
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setContentView(mFinalView);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * In its initial state, the activity presents a button for the user to
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * click in order to initiate a confirmation sequence.  This method is
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * called from various other points in the code to reset the activity to
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * this base state.
15047d380f1e6c823cea444004cb799d4c791145cc6Jim Miller     *
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * <p>Reinflating views from resources is expensive and prevents us from
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * caching widget pointers, so we use a single-inflate pattern:  we lazy-
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * inflate each view, caching all of the widget pointers we'll need at the
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * time, then simply reuse the inflated views directly whenever we need
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * to change contents.
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void establishInitialState() {
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (mInitialView == null) {
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mInitialView = mInflater.inflate(R.layout.media_format_primary, null);
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mInitiateButton =
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    (Button) mInitialView.findViewById(R.id.initiate_media_format);
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mInitiateButton.setOnClickListener(mInitiateListener);
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setContentView(mInitialView);
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle savedState) {
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedState);
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInitialView = null;
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mFinalView = null;
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInflater = LayoutInflater.from(this);
17547d380f1e6c823cea444004cb799d4c791145cc6Jim Miller        mLockUtils = new LockPatternUtils(this);
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        establishInitialState();
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Abandon all progress through the confirmation sequence by returning
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * to the initial view any time the activity is interrupted (e.g. by
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * idle timeout).
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onPause() {
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        establishInitialState();
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
192