1b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/* 2b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 4b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * you may not use this file except in compliance with the License. 6b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * You may obtain a copy of the License at 7b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 8b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 10b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * See the License for the specific language governing permissions and 14b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * limitations under the License. 15b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 16b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 17b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpackage com.android.phone; 18b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 19b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.Activity; 20b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.Application; 21b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.ProgressDialog; 22b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Intent; 23b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.AsyncResult; 24b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Bundle; 25b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Handler; 26b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Message; 27b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.provider.Settings; 28b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.telephony.ServiceState; 2902d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brownimport android.util.Log; 30b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.WindowManager; 31b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 3202d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brownimport com.android.internal.telephony.Phone; 3302d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brownimport com.android.internal.telephony.PhoneFactory; 3402d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown 3559fa9153a2678d11f7fe362ecd9c2da035a98071David Brown/** 3659fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * Helper class used by the InCallScreen to handle certain special 3759fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * cases when making an emergency call. 3859fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * 3959fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * Specifically, if the user tries to dial an emergency number but the 4059fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * radio is off, e.g. if the device is in airplane mode, this class is 4159fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * responsible for turning the radio back on and retrying the call. 4259fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * 4359fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * This class is initially launched using the same intent originally 4459fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * passed to the InCallScreen (presumably an ACTION_CALL_EMERGENCY intent) 4559fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * but with this class explicitly set as the className/component. Later, 4659fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * we retry the emergency call by firing off that same intent, with the 4759fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * component cleared, and using an integer extra called 4859fa9153a2678d11f7fe362ecd9c2da035a98071David Brown * EMERGENCY_CALL_RETRY_KEY to convey information about the current state. 49b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 50b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpublic class EmergencyCallHandler extends Activity { 5102d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown private static final String TAG = "EmergencyCallHandler"; 5202d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown private static final boolean DBG = true; // OK to have this on by default 5302d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown 54b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** the key used to get the count from our Intent's extra(s) */ 55b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public static final String EMERGENCY_CALL_RETRY_KEY = "emergency_call_retry_count"; 56b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 57b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** count indicating an initial attempt at the call should be made. */ 58b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public static final int INITIAL_ATTEMPT = -1; 59b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 60b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** number of times to retry the call and the time spent in between attempts*/ 61b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public static final int NUMBER_OF_RETRIES = 6; 62b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public static final int TIME_BETWEEN_RETRIES_MS = 5000; 63b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 64b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // constant events 65b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final int EVENT_SERVICE_STATE_CHANGED = 100; 66b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final int EVENT_TIMEOUT_EMERGENCY_CALL = 200; 67b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 68b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 69b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Package holding information needed for the callback. 70b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 71b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static class EmergencyCallInfo { 72b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public Phone phone; 73b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public Intent intent; 74b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public ProgressDialog dialog; 75b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public Application app; 76b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 77b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 78b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 79b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * static handler class, used to handle the two relevent events. 80b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 81b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static EmergencyCallEventHandler sHandler; 82b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static class EmergencyCallEventHandler extends Handler { 83b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public void handleMessage(Message msg) { 84b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch(msg.what) { 85b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case EVENT_SERVICE_STATE_CHANGED: { 86b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // make the initial call attempt after the radio is turned on. 87b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ServiceState state = (ServiceState) ((AsyncResult) msg.obj).result; 8802d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown if (DBG) Log.d(TAG, "EVENT_SERVICE_STATE_CHANGED: state = " + state); 89b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (state.getState() != ServiceState.STATE_POWER_OFF) { 90b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project EmergencyCallInfo eci = 91b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project (EmergencyCallInfo) ((AsyncResult) msg.obj).userObj; 92b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // deregister for the service state change events. 93b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project eci.phone.unregisterForServiceStateChanged(this); 94b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project eci.dialog.dismiss(); 9502d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown 9602d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown if (DBG) Log.d(TAG, "About to (re)launch InCallScreen: " + eci.intent); 9702d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown eci.app.startActivity(eci.intent); 98b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 99b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 100b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 10159fa9153a2678d11f7fe362ecd9c2da035a98071David Brown 102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case EVENT_TIMEOUT_EMERGENCY_CALL: { 10302d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown if (DBG) Log.d(TAG, "EVENT_TIMEOUT_EMERGENCY_CALL..."); 104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // repeated call after the timeout period. 105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project EmergencyCallInfo eci = (EmergencyCallInfo) msg.obj; 106b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project eci.dialog.dismiss(); 10702d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown 10802d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown if (DBG) Log.d(TAG, "About to (re)launch InCallScreen: " + eci.intent); 10902d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown eci.app.startActivity(eci.intent); 110b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 111b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 112b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 113b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 11459fa9153a2678d11f7fe362ecd9c2da035a98071David Brown } 11559fa9153a2678d11f7fe362ecd9c2da035a98071David Brown 116b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onCreate(Bundle icicle) { 11802d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown Log.i(TAG, "onCreate()... intent = " + getIntent()); 119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super.onCreate(icicle); 12002d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown 12102d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // Watch out: the intent action we get here should always be 12202d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // ACTION_CALL_EMERGENCY, since the whole point of this activity 12302d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // is for it to be launched using the same intent originally 12402d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // passed to the InCallScreen, which will always be 12502d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // ACTION_CALL_EMERGENCY when making an emergency call. 12602d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // 12702d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // If we ever get launched with any other action, especially if it's 12802d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // "com.android.phone.InCallScreen.UNDEFINED" (as in bug 3094858), that 12902d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // almost certainly indicates a logic bug in the InCallScreen. 13002d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown if (!Intent.ACTION_CALL_EMERGENCY.equals(getIntent().getAction())) { 13102d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown Log.w(TAG, "Unexpected intent action! Should be ACTION_CALL_EMERGENCY, " 13202d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown + "but instead got: " + getIntent().getAction()); 13302d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown } 13402d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown 135b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // setup the phone and get the retry count embedded in the intent. 136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Phone phone = PhoneFactory.getDefaultPhone(); 137b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int retryCount = getIntent().getIntExtra(EMERGENCY_CALL_RETRY_KEY, INITIAL_ATTEMPT); 138b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 139b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // create a new message object. 140b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project EmergencyCallInfo eci = new EmergencyCallInfo(); 141b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project eci.phone = phone; 142b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project eci.app = getApplication(); 143b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project eci.dialog = constructDialog(retryCount); 14459fa9153a2678d11f7fe362ecd9c2da035a98071David Brown 14559fa9153a2678d11f7fe362ecd9c2da035a98071David Brown // The Intent we're going to fire off to retry the call is the 14659fa9153a2678d11f7fe362ecd9c2da035a98071David Brown // same one that got us here (except that we *don't* explicitly 14759fa9153a2678d11f7fe362ecd9c2da035a98071David Brown // specify this class as the component!) 148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project eci.intent = getIntent().setComponent(null); 14959fa9153a2678d11f7fe362ecd9c2da035a98071David Brown // And we'll be firing this Intent from the PhoneApp's context 15059fa9153a2678d11f7fe362ecd9c2da035a98071David Brown // (see the startActivity() calls above) so the 15159fa9153a2678d11f7fe362ecd9c2da035a98071David Brown // FLAG_ACTIVITY_NEW_TASK flag is required. 15259fa9153a2678d11f7fe362ecd9c2da035a98071David Brown eci.intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 15302d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown if (DBG) Log.d(TAG, "- initial eci.intent: " + eci.intent); 15459fa9153a2678d11f7fe362ecd9c2da035a98071David Brown 155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // create the handler. 156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (sHandler == null) { 157b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project sHandler = new EmergencyCallEventHandler(); 158b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 159b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 160b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If this is the initial attempt, we need to register for a radio state 161b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // change and turn the radio on. Otherwise, this is just a retry, and 162b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // we simply wait the alloted time before sending the request to try 163b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the call again. 164b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Note: The radio logic ITSELF will try its best to put the emergency 166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // call through once the radio is turned on. The retry we have here 167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // is in case it fails; the current constants we have include making 168b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 6 attempts, with a 5 second delay between each. 169b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (retryCount == INITIAL_ATTEMPT) { 170b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // place the number of pending retries in the intent. 171b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project eci.intent.putExtra(EMERGENCY_CALL_RETRY_KEY, NUMBER_OF_RETRIES); 172b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 173b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // turn the radio on and listen for it to complete. 174b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project phone.registerForServiceStateChanged(sHandler, 175b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project EVENT_SERVICE_STATE_CHANGED, eci); 176b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 177b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If airplane mode is on, we turn it off the same way that the 178b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Settings activity turns it off. 179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (Settings.System.getInt(getContentResolver(), 180b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Settings.System.AIRPLANE_MODE_ON, 0) > 0) { 18102d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown if (DBG) Log.d(TAG, "Turning off airplane mode..."); 18202d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown 183b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Change the system setting 184b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Settings.System.putInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0); 185b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 186b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Post the intent 187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project intent.putExtra("state", false); 189b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project sendBroadcast(intent); 190b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 191b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Otherwise, for some strange reason the radio is just off, so 192b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // we just turn it back on. 193b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 19402d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown if (DBG) Log.d(TAG, "Manually powering radio on..."); 195b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project phone.setRadioPower(true); 196b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // decrement and store the number of retries. 20002d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown if (DBG) Log.d(TAG, "Retry attempt... retryCount = " + retryCount); 201b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project eci.intent.putExtra(EMERGENCY_CALL_RETRY_KEY, (retryCount - 1)); 202b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 203b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // get the message and attach the data, then wait the alloted 204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // time and send. 205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Message m = sHandler.obtainMessage(EVENT_TIMEOUT_EMERGENCY_CALL); 206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project m.obj = eci; 207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project sHandler.sendMessageDelayed(m, TIME_BETWEEN_RETRIES_MS); 208b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 209b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project finish(); 210b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 211b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 212b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 213b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * create the dialog and hand it back to caller. 214b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 215b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ProgressDialog constructDialog(int retryCount) { 216b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // figure out the message to display. 217b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int msgId = (retryCount == INITIAL_ATTEMPT) ? 218b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project R.string.emergency_enable_radio_dialog_message : 219b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project R.string.emergency_enable_radio_dialog_retry; 220b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 221b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // create a system dialog that will persist outside this activity. 222b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ProgressDialog pd = new ProgressDialog(getApplication()); 223b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project pd.setTitle(getText(R.string.emergency_enable_radio_dialog_title)); 224b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project pd.setMessage(getText(msgId)); 225b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project pd.setIndeterminate(true); 226b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project pd.setCancelable(false); 227b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project pd.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); 228b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 230b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // show the dialog 231b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project pd.show(); 232b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 233b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return pd; 234b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 23502d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown 23602d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown @Override 23702d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown protected void onNewIntent(Intent intent) { 23802d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // We shouldn't ever get here, since we should never be launched in 23902d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown // "singleTop" mode in the first place. 24002d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown Log.w(TAG, "Unexpected call to onNewIntent(): intent=" + intent); 24102d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown super.onNewIntent(intent); 24202d1c632adde606031c1fe6ea0e3be1e288fd6c6David Brown } 243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project} 244