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