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