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