14a5a966f0d43e04d336be1b94182346399a931f6Wink Saville/* 24a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * Copyright (C) 2009 The Android Open Source Project 34a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * 44a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 54a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * you may not use this file except in compliance with the License. 64a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * You may obtain a copy of the License at 74a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * 84a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 94a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * 104a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * Unless required by applicable law or agreed to in writing, software 114a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 124a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * See the License for the specific language governing permissions and 144a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * limitations under the License. 154a5a966f0d43e04d336be1b94182346399a931f6Wink Saville */ 164a5a966f0d43e04d336be1b94182346399a931f6Wink Saville 174a5a966f0d43e04d336be1b94182346399a931f6Wink Savillepackage com.android.phone; 184a5a966f0d43e04d336be1b94182346399a931f6Wink Saville 194a5a966f0d43e04d336be1b94182346399a931f6Wink Savilleimport android.app.Activity; 2013660626500d047d4a3a097e832bb175e1c4f894Freeman Ngimport android.app.PendingIntent; 214a5a966f0d43e04d336be1b94182346399a931f6Wink Savilleimport android.content.Intent; 224a5a966f0d43e04d336be1b94182346399a931f6Wink Savilleimport android.os.Bundle; 237d38129b67491544c5969dc784db478b13918b08David Brownimport android.os.SystemProperties; 244a5a966f0d43e04d336be1b94182346399a931f6Wink Savilleimport android.util.Log; 254a5a966f0d43e04d336be1b94182346399a931f6Wink Saville 26b154630235935e1aab2a41eff9ed794d40084a02David Brownimport com.android.internal.telephony.Phone; 27b154630235935e1aab2a41eff9ed794d40084a02David Brown 284a5a966f0d43e04d336be1b94182346399a931f6Wink Saville/** 29211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Invisible activity that handles the com.android.phone.PERFORM_CDMA_PROVISIONING intent. 30b154630235935e1aab2a41eff9ed794d40084a02David Brown * This activity is protected by the android.permission.PERFORM_CDMA_PROVISIONING permission. 31b154630235935e1aab2a41eff9ed794d40084a02David Brown * 32211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * We handle the PERFORM_CDMA_PROVISIONING action by launching an OTASP 33211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * call via one of the OtaUtils helper methods: startInteractiveOtasp() on 34211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * regular phones, or startNonInteractiveOtasp() on data-only devices. 35b154630235935e1aab2a41eff9ed794d40084a02David Brown * 36b154630235935e1aab2a41eff9ed794d40084a02David Brown * TODO: The class name InCallScreenShowActivation is misleading, since 37211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * this activity is totally unrelated to the InCallScreen (which 38211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * implements the in-call UI.) Let's eventually rename this to something 39211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * like CdmaProvisioningLauncher or CdmaProvisioningHandler... 404a5a966f0d43e04d336be1b94182346399a931f6Wink Saville */ 414a5a966f0d43e04d336be1b94182346399a931f6Wink Savillepublic class InCallScreenShowActivation extends Activity { 424a5a966f0d43e04d336be1b94182346399a931f6Wink Saville private static final String LOG_TAG = "InCallScreenShowActivation"; 43211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown private static final boolean DBG = 44211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1); 454a5a966f0d43e04d336be1b94182346399a931f6Wink Saville 464a5a966f0d43e04d336be1b94182346399a931f6Wink Saville @Override 474a5a966f0d43e04d336be1b94182346399a931f6Wink Saville protected void onCreate(Bundle icicle) { 484a5a966f0d43e04d336be1b94182346399a931f6Wink Saville super.onCreate(icicle); 494a5a966f0d43e04d336be1b94182346399a931f6Wink Saville 5013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng Intent intent = getIntent(); 517d38129b67491544c5969dc784db478b13918b08David Brown if (DBG) Log.d(LOG_TAG, "onCreate: intent = " + intent); 52b154630235935e1aab2a41eff9ed794d40084a02David Brown Bundle extras = intent.getExtras(); 537d38129b67491544c5969dc784db478b13918b08David Brown if (DBG && (extras != null)) { 547d38129b67491544c5969dc784db478b13918b08David Brown Log.d(LOG_TAG, " - has extras: size = " + extras.size()); // forces an unparcel() 557d38129b67491544c5969dc784db478b13918b08David Brown Log.d(LOG_TAG, " - extras = " + extras); 56b154630235935e1aab2a41eff9ed794d40084a02David Brown } 57b154630235935e1aab2a41eff9ed794d40084a02David Brown 58b154630235935e1aab2a41eff9ed794d40084a02David Brown PhoneApp app = PhoneApp.getInstance(); 59b154630235935e1aab2a41eff9ed794d40084a02David Brown Phone phone = app.getPhone(); 60b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!TelephonyCapabilities.supportsOtasp(phone)) { 61b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "CDMA Provisioning not supported on this device"); 62b154630235935e1aab2a41eff9ed794d40084a02David Brown setResult(RESULT_CANCELED); 63b154630235935e1aab2a41eff9ed794d40084a02David Brown finish(); 64b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 65b154630235935e1aab2a41eff9ed794d40084a02David Brown } 66b154630235935e1aab2a41eff9ed794d40084a02David Brown 67b154630235935e1aab2a41eff9ed794d40084a02David Brown if (intent.getAction().equals(OtaUtils.ACTION_PERFORM_CDMA_PROVISIONING)) { 68b154630235935e1aab2a41eff9ed794d40084a02David Brown 69b154630235935e1aab2a41eff9ed794d40084a02David Brown // On voice-capable devices, we perform CDMA provisioning in 70b154630235935e1aab2a41eff9ed794d40084a02David Brown // "interactive" mode by directly launching the InCallScreen. 712e97fab35871f41a9a8d8099ccb664b17d92554cDavid Brown boolean interactiveMode = PhoneApp.sVoiceCapable; 727d38129b67491544c5969dc784db478b13918b08David Brown Log.d(LOG_TAG, "ACTION_PERFORM_CDMA_PROVISIONING (interactiveMode = " 737d38129b67491544c5969dc784db478b13918b08David Brown + interactiveMode + ")..."); 74b154630235935e1aab2a41eff9ed794d40084a02David Brown 757d38129b67491544c5969dc784db478b13918b08David Brown // Testing: this intent extra allows test apps manually 767d38129b67491544c5969dc784db478b13918b08David Brown // enable/disable "interactive mode", regardless of whether 777d38129b67491544c5969dc784db478b13918b08David Brown // the current device is voice-capable. This is allowed only 787d38129b67491544c5969dc784db478b13918b08David Brown // in userdebug or eng builds. 797d38129b67491544c5969dc784db478b13918b08David Brown if (intent.hasExtra(OtaUtils.EXTRA_OVERRIDE_INTERACTIVE_MODE) 807d38129b67491544c5969dc784db478b13918b08David Brown && (SystemProperties.getInt("ro.debuggable", 0) == 1)) { 81b154630235935e1aab2a41eff9ed794d40084a02David Brown interactiveMode = 82b154630235935e1aab2a41eff9ed794d40084a02David Brown intent.getBooleanExtra(OtaUtils.EXTRA_OVERRIDE_INTERACTIVE_MODE, false); 83b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.d(LOG_TAG, "===> MANUALLY OVERRIDING interactiveMode to " + interactiveMode); 84b154630235935e1aab2a41eff9ed794d40084a02David Brown } 85b154630235935e1aab2a41eff9ed794d40084a02David Brown 86b154630235935e1aab2a41eff9ed794d40084a02David Brown // We allow the caller to pass a PendingIntent (as the 87b154630235935e1aab2a41eff9ed794d40084a02David Brown // EXTRA_NONINTERACTIVE_OTASP_RESULT_PENDING_INTENT extra) 88b154630235935e1aab2a41eff9ed794d40084a02David Brown // which we'll later use to notify them when the OTASP call 89b154630235935e1aab2a41eff9ed794d40084a02David Brown // fails or succeeds. 90b154630235935e1aab2a41eff9ed794d40084a02David Brown // 91b154630235935e1aab2a41eff9ed794d40084a02David Brown // Stash that away here, and we'll fire it off later in 92b154630235935e1aab2a41eff9ed794d40084a02David Brown // OtaUtils.sendOtaspResult(). 93b154630235935e1aab2a41eff9ed794d40084a02David Brown app.cdmaOtaScreenState.otaspResultCodePendingIntent = 94b154630235935e1aab2a41eff9ed794d40084a02David Brown (PendingIntent) intent.getParcelableExtra( 95b154630235935e1aab2a41eff9ed794d40084a02David Brown OtaUtils.EXTRA_OTASP_RESULT_CODE_PENDING_INTENT); 96b154630235935e1aab2a41eff9ed794d40084a02David Brown 97b154630235935e1aab2a41eff9ed794d40084a02David Brown if (interactiveMode) { 98211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // On voice-capable devices, launch an OTASP call and arrange 99211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // for the in-call UI to come up. (The InCallScreen will 100211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // notice that an OTASP call is active, and display the 101211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // special OTASP UI instead of the usual in-call controls.) 102b154630235935e1aab2a41eff9ed794d40084a02David Brown 103211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) Log.d(LOG_TAG, "==> Starting interactive CDMA provisioning..."); 104211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown OtaUtils.startInteractiveOtasp(this); 105b154630235935e1aab2a41eff9ed794d40084a02David Brown 106211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // The result we set here is actually irrelevant, since the 107211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // InCallScreen's "interactive" OTASP sequence never actually 108211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // finish()es; it ends by directly launching the Home 109b154630235935e1aab2a41eff9ed794d40084a02David Brown // activity. So our caller won't actually ever get an 110b154630235935e1aab2a41eff9ed794d40084a02David Brown // onActivityResult() call in this case. 111b154630235935e1aab2a41eff9ed794d40084a02David Brown setResult(OtaUtils.RESULT_INTERACTIVE_OTASP_STARTED); 112b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 113b154630235935e1aab2a41eff9ed794d40084a02David Brown // On data-only devices, manually launch the OTASP call 114b154630235935e1aab2a41eff9ed794d40084a02David Brown // *without* displaying any UI. (Our caller, presumably 115b154630235935e1aab2a41eff9ed794d40084a02David Brown // SetupWizardActivity, is responsible for displaying some 116b154630235935e1aab2a41eff9ed794d40084a02David Brown // sort of progress UI.) 11713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 1187d38129b67491544c5969dc784db478b13918b08David Brown if (DBG) Log.d(LOG_TAG, "==> Starting non-interactive CDMA provisioning..."); 119b154630235935e1aab2a41eff9ed794d40084a02David Brown int callStatus = OtaUtils.startNonInteractiveOtasp(this); 12013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 121b154630235935e1aab2a41eff9ed794d40084a02David Brown if (callStatus == PhoneUtils.CALL_STATUS_DIALED) { 1227d38129b67491544c5969dc784db478b13918b08David Brown if (DBG) Log.d(LOG_TAG, " ==> successful result from startNonInteractiveOtasp(): " 123b154630235935e1aab2a41eff9ed794d40084a02David Brown + callStatus); 124b154630235935e1aab2a41eff9ed794d40084a02David Brown setResult(OtaUtils.RESULT_NONINTERACTIVE_OTASP_STARTED); 125b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 126b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "Failure code from startNonInteractiveOtasp(): " + callStatus); 127b154630235935e1aab2a41eff9ed794d40084a02David Brown setResult(OtaUtils.RESULT_NONINTERACTIVE_OTASP_FAILED); 128b154630235935e1aab2a41eff9ed794d40084a02David Brown } 129b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1304a5a966f0d43e04d336be1b94182346399a931f6Wink Saville } else { 131b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.e(LOG_TAG, "Unexpected intent action: " + intent); 132b154630235935e1aab2a41eff9ed794d40084a02David Brown setResult(RESULT_CANCELED); 1334a5a966f0d43e04d336be1b94182346399a931f6Wink Saville } 1344a5a966f0d43e04d336be1b94182346399a931f6Wink Saville 1354a5a966f0d43e04d336be1b94182346399a931f6Wink Saville finish(); 1364a5a966f0d43e04d336be1b94182346399a931f6Wink Saville } 1374a5a966f0d43e04d336be1b94182346399a931f6Wink Saville} 138