17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/* 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2009 The Android Open Source Project 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License"); 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License. 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * http://www.apache.org/licenses/LICENSE-2.0 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS, 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License. 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.PhoneConstants; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.TelephonyCapabilities; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.TelephonyProperties; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.phone.OtaUtils.CdmaOtaInCallScreenUiState.State; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.Activity; 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ActivityManager; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.AlertDialog; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.PendingIntent; 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.PendingIntent.CanceledException; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ActivityNotFoundException; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context; 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.Uri; 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.AsyncResult; 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler; 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.SystemClock; 387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.SystemProperties; 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.UserHandle; 404d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccount; 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.telephony.TelephonyManager; 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.KeyEvent; 447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.View; 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.ViewGroup; 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.WindowManager; 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.Button; 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.ProgressBar; 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.TextView; 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.ToggleButton; 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Handles all OTASP Call related logic and UI functionality. 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The InCallScreen interacts with this class to perform an OTASP Call. 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OTASP is a CDMA-specific feature: 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OTA or OTASP == Over The Air service provisioning 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * SPC == Service Programming Code 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * TODO: Include pointer to more detailed documentation. 607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * TODO: This is Over The Air Service Provisioning (OTASP) 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * A better name would be OtaspUtils.java. 637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class OtaUtils { 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = "OtaUtils"; 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final boolean DBG = false; 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTA_SHOW_ACTIVATION_SCREEN_OFF = 0; 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTA_SHOW_ACTIVATION_SCREEN_ON = 1; 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTA_SHOW_LISTENING_SCREEN_OFF =0; 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTA_SHOW_LISTENING_SCREEN_ON =1; 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF = 0; 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_THREE = 3; 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_OFF = 0; 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_ON = 1; 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // SPC Timeout is 60 seconds 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public final int OTA_SPC_TIMEOUT = 60; 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public final int OTA_FAILURE_DIALOG_TIMEOUT = 2; 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Constants for OTASP-related Intents and intent extras. 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Watch out: these must agree with the corresponding constants in 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // apps/SetupWizard! 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Intent action to launch an OTASP call. 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final String ACTION_PERFORM_CDMA_PROVISIONING = 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon "com.android.phone.PERFORM_CDMA_PROVISIONING"; 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Intent action to launch activation on a non-voice capable device 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final String ACTION_PERFORM_VOICELESS_CDMA_PROVISIONING = 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon "com.android.phone.PERFORM_VOICELESS_CDMA_PROVISIONING"; 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Intent action to display the InCallScreen in the OTASP "activation" state. 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final String ACTION_DISPLAY_ACTIVATION_SCREEN = 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon "com.android.phone.DISPLAY_ACTIVATION_SCREEN"; 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // boolean voiceless provisioning extra that enables a "don't show this again" checkbox 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the user can check to never see the activity upon bootup again 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final String EXTRA_VOICELESS_PROVISIONING_OFFER_DONTSHOW = 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon "com.android.phone.VOICELESS_PROVISIONING_OFFER_DONTSHOW"; 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Activity result codes for the ACTION_PERFORM_CDMA_PROVISIONING intent 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // (see the InCallScreenShowActivation activity.) 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Note: currently, our caller won't ever actually receive the 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // RESULT_INTERACTIVE_OTASP_STARTED result code; see comments in 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // InCallScreenShowActivation.onCreate() for details. 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int RESULT_INTERACTIVE_OTASP_STARTED = Activity.RESULT_FIRST_USER; 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int RESULT_NONINTERACTIVE_OTASP_STARTED = Activity.RESULT_FIRST_USER + 1; 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int RESULT_NONINTERACTIVE_OTASP_FAILED = Activity.RESULT_FIRST_USER + 2; 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Testing: Extra for the ACTION_PERFORM_CDMA_PROVISIONING intent that 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // allows the caller to manually enable/disable "interactive mode" for 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the OTASP call. Only available in userdebug or eng builds. 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final String EXTRA_OVERRIDE_INTERACTIVE_MODE = 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon "ota_override_interactive_mode"; 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Extra for the ACTION_PERFORM_CDMA_PROVISIONING intent, holding a 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // PendingIntent which the phone app can use to send a result code 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // back to the caller. 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final String EXTRA_OTASP_RESULT_CODE_PENDING_INTENT = 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon "otasp_result_code_pending_intent"; 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Extra attached to the above PendingIntent that indicates 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // success or failure. 127cd76f8b160e0e4b2e5ccf34c0c5e1e58a0bb8b72Santos Cordon public static final String EXTRA_OTASP_RESULT_CODE = "otasp_result_code"; 128cd76f8b160e0e4b2e5ccf34c0c5e1e58a0bb8b72Santos Cordon 129cd76f8b160e0e4b2e5ccf34c0c5e1e58a0bb8b72Santos Cordon // Extra attached to the above PendingIntent that contains an error code. 130cd76f8b160e0e4b2e5ccf34c0c5e1e58a0bb8b72Santos Cordon public static final String EXTRA_OTASP_ERROR_CODE = "otasp_error_code"; 131cd76f8b160e0e4b2e5ccf34c0c5e1e58a0bb8b72Santos Cordon 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTASP_UNKNOWN = 0; 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTASP_USER_SKIPPED = 1; // Only meaningful with interactive OTASP 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTASP_SUCCESS = 2; 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTASP_FAILURE = 3; 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // failed due to CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int OTASP_FAILURE_SPC_RETRIES = 4; 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO: Distinguish between interactive and non-interactive success 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // and failure. Then, have the PendingIntent be sent after 1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // interactive OTASP as well (so the caller can find out definitively 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // when interactive OTASP completes.) 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String OTASP_NUMBER = "*228"; 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String OTASP_NUMBER_NON_INTERACTIVE = "*22899"; 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Context mContext; 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PhoneGlobals mApplication; 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private OtaWidgetData mOtaWidgetData; 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static boolean sIsWizardMode = true; 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // How many times do we retry maybeDoOtaCall() if the LTE state is not known yet, 1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // and how long do we wait between retries 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int OTA_CALL_LTE_RETRIES_MAX = 5; 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int OTA_CALL_LTE_RETRY_PERIOD = 3000; 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static int sOtaCallLteRetries = 0; 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // In "interactive mode", the OtaUtils object is tied to an 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // InCallScreen instance, where we display a bunch of UI specific to 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the OTASP call. But on devices that are not "voice capable", the 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // OTASP call runs in a non-interactive mode, and we don't have 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // an InCallScreen or CallCard or any OTASP UI elements at all. 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private boolean mInteractive = true; 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OtaWidgetData class represent all OTA UI elements 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * TODO(OTASP): It's really ugly for the OtaUtils object to reach into the 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * InCallScreen like this and directly manipulate its widgets. 1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Instead, the model/view separation should be more clear: OtaUtils 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * should only know about a higher-level abstraction of the 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OTASP-specific UI state (just like how the CallController uses the 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * InCallUiState object), and the InCallScreen itself should translate 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * that higher-level abstraction into actual onscreen views and widgets. 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private class OtaWidgetData { 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public Button otaEndButton; 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public Button otaActivateButton; 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public Button otaSkipButton; 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public Button otaNextButton; 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public ToggleButton otaSpeakerButton; 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public ViewGroup otaUpperWidgets; 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public View callCardOtaButtonsFailSuccess; 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public ProgressBar otaTextProgressBar; 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public TextView otaTextSuccessFail; 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public View callCardOtaButtonsActivate; 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public View callCardOtaButtonsListenProgress; 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public TextView otaTextActivate; 1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public TextView otaTextListenProgress; 1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public AlertDialog spcErrorDialog; 1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public AlertDialog otaFailureDialog; 1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public AlertDialog otaSkipConfirmationDialog; 1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public TextView otaTitle; 1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public Button otaTryAgainButton; 1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OtaUtils constructor. 2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param context the Context of the calling Activity or Application 2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param interactive if true, use the InCallScreen to display the progress 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * and result of the OTASP call. In practice this is 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * true IFF the current device is a voice-capable phone. 2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Note if interactive is true, you must also call updateUiWidgets() as soon 2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * as the InCallScreen instance is ready. 2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 2095ccda616708b298d6f71598b6ac23a94cd6033f8Bryce Lee public OtaUtils(Context context, boolean interactive) { 2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("OtaUtils constructor..."); 2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication = PhoneGlobals.getInstance(); 2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mContext = context; 2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mInteractive = interactive; 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Starts the OTA provisioning call. If the MIN isn't available yet, it returns false and adds 2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * an event to return the request to the calling app when it becomes available. 2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param context 2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param handler 2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param request 2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @return true if we were able to launch Ota activity or it's not required; false otherwise 2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static boolean maybeDoOtaCall(Context context, Handler handler, int request) { 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneGlobals app = PhoneGlobals.getInstance(); 227dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott Phone phone = PhoneGlobals.getPhone(); 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ActivityManager.isRunningInTestHarness()) { 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.i(LOG_TAG, "Don't run provisioning when in test harness"); 2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!TelephonyCapabilities.supportsOtasp(phone)) { 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Presumably not a CDMA phone. 2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("maybeDoOtaCall: OTASP not supported on this device"); 2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; // Nothing to do here. 2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!phone.isMinInfoReady()) { 2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("MIN is not ready. Registering to receive notification."); 2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phone.registerForSubscriptionInfoReady(handler, request, null); 2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 2447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phone.unregisterForSubscriptionInfoReady(handler); 2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (getLteOnCdmaMode(context) == PhoneConstants.LTE_ON_CDMA_UNKNOWN) { 2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (sOtaCallLteRetries < OTA_CALL_LTE_RETRIES_MAX) { 2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("maybeDoOtaCall: LTE state still unknown: retrying"); 2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handler.sendEmptyMessageDelayed(request, OTA_CALL_LTE_RETRY_PERIOD); 2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sOtaCallLteRetries++; 2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 2537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "maybeDoOtaCall: LTE state still unknown: giving up"); 2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean phoneNeedsActivation = phone.needsOtaServiceProvisioning(); 2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("phoneNeedsActivation is set to " + phoneNeedsActivation); 2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int otaShowActivationScreen = context.getResources().getInteger( 2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.integer.OtaShowActivationScreen); 2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowActivationScreen: " + otaShowActivationScreen); 2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Run the OTASP call in "interactive" mode only if 2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // this is a non-LTE "voice capable" device. 2687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (PhoneGlobals.sVoiceCapable && getLteOnCdmaMode(context) == PhoneConstants.LTE_ON_CDMA_FALSE) { 2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (phoneNeedsActivation 2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon && (otaShowActivationScreen == OTA_SHOW_ACTIVATION_SCREEN_ON)) { 2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sIsWizardMode = false; 2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, "==> Starting interactive CDMA provisioning..."); 2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon OtaUtils.startInteractiveOtasp(context); 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("maybeDoOtaCall: voice capable; activation started."); 2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("maybeDoOtaCall: voice capable; activation NOT started."); 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (phoneNeedsActivation) { 2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent newIntent = new Intent(ACTION_PERFORM_VOICELESS_CDMA_PROVISIONING); 2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon newIntent.putExtra(EXTRA_VOICELESS_PROVISIONING_OFFER_DONTSHOW, true); 2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon context.startActivity(newIntent); 2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (ActivityNotFoundException e) { 2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon loge("No activity Handling PERFORM_VOICELESS_CDMA_PROVISIONING!"); 2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("maybeDoOtaCall: non-interactive; activation intent sent."); 2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("maybeDoOtaCall: non-interactive, no need for OTASP."); 2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 2997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 3027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Starts a normal "interactive" OTASP call (i.e. CDMA activation 3037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * for regular voice-capable phone devices.) 3047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This method is called from the InCallScreenShowActivation activity when 3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * handling the ACTION_PERFORM_CDMA_PROVISIONING intent. 3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static void startInteractiveOtasp(Context context) { 3097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("startInteractiveOtasp()..."); 3107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneGlobals app = PhoneGlobals.getInstance(); 3117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // There are two ways to start OTASP on voice-capable devices: 3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 3147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // (1) via the PERFORM_CDMA_PROVISIONING intent 3157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - this is triggered by the "Activate device" button in settings, 3167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // or can be launched automatically upon boot if the device 3177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // thinks it needs to be provisioned. 3187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - the intent is handled by InCallScreenShowActivation.onCreate(), 3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // which calls this method 3207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - we prepare for OTASP by initializing the OtaUtils object 3217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - we bring up the InCallScreen in the ready-to-activate state 3227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - when the user presses the "Activate" button we launch the 3237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // call by calling CallController.placeCall() via the 3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // otaPerformActivation() method. 3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // (2) by manually making an outgoing call to a special OTASP number 3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // like "*228" or "*22899". 3287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - That sequence does NOT involve this method (OtaUtils.startInteractiveOtasp()). 3297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Instead, the outgoing call request goes straight to CallController.placeCall(). 3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - CallController.placeCall() notices that it's an OTASP 3317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // call, and initializes the OtaUtils object. 3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - The InCallScreen is launched (as the last step of 3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // CallController.placeCall()). The InCallScreen notices that 3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // OTASP is active and shows the correct UI. 3357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Here, we start sequence (1): 3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Do NOT immediately start the call. Instead, bring up the InCallScreen 3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // in the special "activate" state (see OtaUtils.otaShowActivateScreen()). 3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We won't actually make the call until the user presses the "Activate" 3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // button. 3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent activationScreenIntent = new Intent().setClass(context, InCallScreen.class) 3437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setAction(ACTION_DISPLAY_ACTIVATION_SCREEN); 3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Watch out: in the scenario where OTASP gets triggered from the 3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // BOOT_COMPLETED broadcast (see OtaStartupReceiver.java), we might be 3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // running in the PhoneApp's context right now. 3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // So the FLAG_ACTIVITY_NEW_TASK flag is required here. 3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon activationScreenIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We're about to start the OTASP sequence, so create and initialize the 3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // OtaUtils instance. (This needs to happen before bringing up the 3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // InCallScreen.) 3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon OtaUtils.setupOtaspCall(activationScreenIntent); 3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // And bring up the InCallScreen... 3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.i(LOG_TAG, "startInteractiveOtasp: launching InCallScreen in 'activate' state: " 3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + activationScreenIntent); 3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon context.startActivity(activationScreenIntent); 3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 3637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Starts the OTASP call *without* involving the InCallScreen or 3647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * displaying any UI. 3657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 3667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This is used on data-only devices, which don't support any kind of 3677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * in-call phone UI. 3687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 3697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @return PhoneUtils.CALL_STATUS_DIALED if we successfully 3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * dialed the OTASP number, or one of the other 3717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * CALL_STATUS_* constants if there was a failure. 3727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 3737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static int startNonInteractiveOtasp(Context context) { 3747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("startNonInteractiveOtasp()..."); 3757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneGlobals app = PhoneGlobals.getInstance(); 3767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (app.otaUtils != null) { 3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // An OtaUtils instance already exists, presumably from a previous OTASP call. 3797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.i(LOG_TAG, "startNonInteractiveOtasp: " 3807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + "OtaUtils already exists; nuking the old one and starting again..."); 3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Create the OtaUtils instance. 3845ccda616708b298d6f71598b6ac23a94cd6033f8Bryce Lee app.otaUtils = new OtaUtils(context, false /* non-interactive mode */); 3857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("- created OtaUtils: " + app.otaUtils); 3867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // ... and kick off the OTASP call. 3887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO(InCallScreen redesign): This should probably go through 3897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the CallController, rather than directly calling 3907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // PhoneUtils.placeCall(). 3917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Phone phone = PhoneGlobals.getPhone(); 3927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String number = OTASP_NUMBER_NON_INTERACTIVE; 3937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.i(LOG_TAG, "startNonInteractiveOtasp: placing call to '" + number + "'..."); 3947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int callStatus = PhoneUtils.placeCall(context, 3957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phone, 3967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon number, 39769a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon null, // contactRef 39869a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon false); //isEmergencyCall 3997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (callStatus == PhoneUtils.CALL_STATUS_DIALED) { 4017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log(" ==> successful return from placeCall(): callStatus = " + callStatus); 4027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 4037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "Failure from placeCall() for OTA number '" 4047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + number + "': code " + callStatus); 4057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return callStatus; 4067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO: Any other special work to do here? 4097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Such as: 4107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 4117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - manually kick off progress updates, either using TelephonyRegistry 4127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // or else by sending PendingIntents directly to our caller? 4137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 4147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - manually silence the in-call audio? (Probably unnecessary 4157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if Stingray truly has no audio path from phone baseband 4167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // to the device's speakers.) 4177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 4187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return callStatus; 4207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @return true if the specified Intent is a CALL action that's an attempt 4247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * to initate an OTASP call. 4257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 4267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OTASP is a CDMA-specific concept, so this method will always return false 4277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * on GSM phones. 4287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 4297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This code was originally part of the InCallScreen.checkIsOtaCall() method. 4307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static boolean isOtaspCallIntent(Intent intent) { 4327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("isOtaspCallIntent(" + intent + ")..."); 4337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneGlobals app = PhoneGlobals.getInstance(); 4347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Phone phone = app.mCM.getDefaultPhone(); 4357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (intent == null) { 4377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 4387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!TelephonyCapabilities.supportsOtasp(phone)) { 4407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 4417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String action = intent.getAction(); 4447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (action == null) { 4457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 4467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!action.equals(Intent.ACTION_CALL)) { 4487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("isOtaspCallIntent: not a CALL action: '" + action + "' ==> not OTASP"); 4497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 4507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if ((app.cdmaOtaScreenState == null) || (app.cdmaOtaProvisionData == null)) { 4537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Uh oh -- something wrong with our internal OTASP state. 4547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // (Since this is an OTASP-capable device, these objects 4557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // *should* have already been created by PhoneApp.onCreate().) 4567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon throw new IllegalStateException("isOtaspCallIntent: " 4577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + "app.cdmaOta* objects(s) not initialized"); 4587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // This is an OTASP call iff the number we're trying to dial is one of 4617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the magic OTASP numbers. 4627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String number; 4637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 4647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon number = PhoneUtils.getInitialNumber(intent); 4657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (PhoneUtils.VoiceMailNumberMissingException ex) { 4667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // This was presumably a "voicemail:" intent, so it's 4677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // obviously not an OTASP number. 4687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("isOtaspCallIntent: VoiceMailNumberMissingException => not OTASP"); 4697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 4707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (phone.isOtaSpNumber(number)) { 4727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("isOtaSpNumber: ACTION_CALL to '" + number + "' ==> OTASP call!"); 4737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 4747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 4767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Set up for an OTASP call. 4807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 4817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This method is called as part of the CallController placeCall() sequence 4827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * before initiating an outgoing OTASP call. 4837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 4847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The purpose of this method is mainly to create and initialize the 4857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OtaUtils instance, along with some other misc pre-OTASP cleanup. 4867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static void setupOtaspCall(Intent intent) { 4887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("setupOtaspCall(): preparing for OTASP call to " + intent); 4897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneGlobals app = PhoneGlobals.getInstance(); 4907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (app.otaUtils != null) { 4927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // An OtaUtils instance already exists, presumably from a prior OTASP call. 4937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Nuke the old one and start this call with a fresh instance. 4947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.i(LOG_TAG, "setupOtaspCall: " 4957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + "OtaUtils already exists; replacing with new instance..."); 4967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Create the OtaUtils instance. 4995ccda616708b298d6f71598b6ac23a94cd6033f8Bryce Lee app.otaUtils = new OtaUtils(app.getApplicationContext(), true /* interactive */); 5007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("- created OtaUtils: " + app.otaUtils); 5017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // NOTE we still need to call OtaUtils.updateUiWidgets() once the 5037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // InCallScreen instance is ready; see InCallScreen.checkOtaspStateOnResume() 5047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Make sure the InCallScreen knows that it needs to switch into OTASP mode. 5067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 5077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // NOTE in gingerbread and earlier, we used to do 5087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // setInCallScreenMode(InCallScreenMode.OTA_NORMAL); 5097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // directly in the InCallScreen, back when this check happened inside the InCallScreen. 5107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 5117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // But now, set the global CdmaOtaInCallScreenUiState object into 5127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // NORMAL mode, which will then cause the InCallScreen (when it 5137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // comes up) to realize that an OTA call is active. 5147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon app.otaUtils.setCdmaOtaInCallScreenUiState( 5167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon OtaUtils.CdmaOtaInCallScreenUiState.State.NORMAL); 5177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO(OTASP): note app.inCallUiState.inCallScreenMode and 5197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // app.cdmaOtaInCallScreenUiState.state are mostly redundant. Combine them. 5206fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // app.inCallUiState.inCallScreenMode = InCallUiState.InCallScreenMode.OTA_NORMAL; 5217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO(OTASP / bug 5092031): we ideally should call 5237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // otaShowListeningScreen() here to make sure that the DTMF dialpad 5247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // becomes visible at the start of the "*228" call: 5257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 5267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // // ...and get the OTASP-specific UI into the right state. 5277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // app.otaUtils.otaShowListeningScreen(); 5287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if (app.otaUtils.mInCallScreen != null) { 5297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // app.otaUtils.mInCallScreen.requestUpdateScreen(); 5307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // } 5317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 5327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // But this doesn't actually work; the call to otaShowListeningScreen() 5337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // *doesn't* actually bring up the listening screen, since the 5347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // cdmaOtaConfigData.otaShowListeningScreen config parameter hasn't been 5357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // initialized (we haven't run readXmlSettings() yet at this point!) 5367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Also, since the OTA call is now just starting, clear out 5387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the "committed" flag in app.cdmaOtaProvisionData. 5397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (app.cdmaOtaProvisionData != null) { 5407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon app.cdmaOtaProvisionData.isOtaCallCommitted = false; 5417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void setSpeaker(boolean state) { 5457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("setSpeaker : " + state ); 5467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mInteractive) { 5487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("non-interactive mode, ignoring setSpeaker."); 5497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 5507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (state == PhoneUtils.isSpeakerOn(mContext)) { 5537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("no change. returning"); 5547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 5557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneUtils.turnOnSpeaker(mContext, state, true); 5587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 5617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Handles OTA Provision events from the telephony layer. 5627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * These events come in to this method whether or not 5637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * the InCallScreen is visible. 5647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 5657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Possible events are: 5667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OTA Commit Event - OTA provisioning was successful 5677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * SPC retries exceeded - SPC failure retries has exceeded, and Phone needs to 5687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * power down. 5697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 5707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onOtaProvisionStatusChanged(AsyncResult r) { 5717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int OtaStatus[] = (int[]) r.result; 5727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("Provision status event!"); 5737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("onOtaProvisionStatusChanged(): status = " 5747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + OtaStatus[0] + " ==> " + otaProvisionStatusToString(OtaStatus[0])); 5757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // In practice, in a normal successful OTASP call, events come in as follows: 5777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - SPL_UNLOCKED within a couple of seconds after the call starts 5787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - then a delay of around 45 seconds 5797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - then PRL_DOWNLOADED and MDN_DOWNLOADED and COMMITTED within a span of 2 seconds 5807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch(OtaStatus[0]) { 5827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 5837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("onOtaProvisionStatusChanged(): RETRIES EXCEEDED"); 5847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateOtaspProgress(); 5857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.otaSpcUptime = SystemClock.elapsedRealtime(); 5867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mInteractive) { 5877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowSpcErrorNotice(OTA_SPC_TIMEOUT); 5887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 5897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sendOtaspResult(OTASP_FAILURE_SPC_RETRIES); 5907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Power.shutdown(); 5927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 5937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 5957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) { 5967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("onOtaProvisionStatusChanged(): DONE, isOtaCallCommitted set to true"); 5977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.isOtaCallCommitted = true; 5997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mApplication.cdmaOtaScreenState.otaScreenState != 6007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED) { 6017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateOtaspProgress(); 6027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 6057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 6077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 6087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 6097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 6107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 6117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 6127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 6137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 6147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 6157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 6167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Only update progress when OTA call is in normal state 6177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (getCdmaOtaInCallScreenUiState() == CdmaOtaInCallScreenUiState.State.NORMAL) { 6187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("onOtaProvisionStatusChanged(): change to ProgressScreen"); 6197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateOtaspProgress(); 6207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 6227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 6247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("onOtaProvisionStatusChanged(): Ignoring OtaStatus " + OtaStatus[0]); 6257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 6267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 6307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Handle a disconnect event from the OTASP call. 6317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 6327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onOtaspDisconnect() { 6337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("onOtaspDisconnect()..."); 6347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We only handle this event explicitly in non-interactive mode. 6357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // (In interactive mode, the InCallScreen does any post-disconnect 6367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // cleanup.) 6377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mInteractive) { 6387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Send a success or failure indication back to our caller. 6397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateNonInteractiveOtaSuccessFailure(); 6407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6417a3780fbaa1c1101015c65d5d4c549b22dc34d09Rakesh Pallerla cleanOtaScreen(true); 6427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaShowHome() { 6457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowHome()..."); 6467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaScreenState = 6477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 6486fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mInCallScreen.endInCallScreenSession(); 6497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = new Intent(Intent.ACTION_MAIN); 6507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.addCategory (Intent.CATEGORY_HOME); 6517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 6527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mContext.startActivityAsUser(intent, UserHandle.CURRENT); 6537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 6547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaSkipActivation() { 6577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaSkipActivation()..."); 6587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sendOtaspResult(OTASP_USER_SKIPPED); 6607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6616fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mInteractive) mInCallScreen.finish(); 6627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 6637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 6667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Actually initiate the OTASP call. This method is triggered by the 6677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * onscreen "Activate" button, and is only used in interactive mode. 6687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 6697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaPerformActivation() { 6707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaPerformActivation()..."); 6717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mInteractive) { 6727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We shouldn't ever get here in non-interactive mode! 6737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "otaPerformActivation: not interactive!"); 6747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 6757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 6787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Place an outgoing call to the special OTASP number: 6797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent newIntent = new Intent(Intent.ACTION_CALL); 680137458b4bf3516941483e59c123c22cbee27ed43Jay Shrauner newIntent.setData(Uri.fromParts(PhoneAccount.SCHEME_TEL, OTASP_NUMBER, null)); 6817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Initiate the outgoing call: 6837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.callController.placeCall(newIntent); 6847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // ...and get the OTASP-specific UI into the right state. 6867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowListeningScreen(); 6876fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mInCallScreen.requestUpdateScreen(); 6887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 6907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 6937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show Activation Screen when phone powers up and OTA provision is 6947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * required. Also shown when activation fails and user needs 6957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * to re-attempt it. Contains ACTIVATE and SKIP buttons 6967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * which allow user to start OTA activation or skip the activation process. 6977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 6987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void otaShowActivateScreen() { 6997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowActivateScreen()..."); 7007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mApplication.cdmaOtaConfigData.otaShowActivationScreen 7017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon == OTA_SHOW_ACTIVATION_SCREEN_ON) { 7027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowActivateScreen(): show activation screen"); 7037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!isDialerOpened()) { 7047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaScreenInitialize(); 7057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaSkipButton.setVisibility(sIsWizardMode ? 7067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon View.VISIBLE : View.INVISIBLE); 7077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextActivate.setVisibility(View.VISIBLE); 7087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.VISIBLE); 7097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaScreenState = 7117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION; 7127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 7137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowActivateScreen(): show home screen"); 7147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowHome(); 7157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 7197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show "Listen for Instruction" screen during OTA call. Shown when OTA Call 7207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * is initiated and user needs to listen for network instructions and press 7217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * appropriate DTMF digits to proceed to the "Programming in Progress" phase. 7227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 7237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaShowListeningScreen() { 7247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowListeningScreen()..."); 7257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mInteractive) { 7267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We shouldn't ever get here in non-interactive mode! 7277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "otaShowListeningScreen: not interactive!"); 7287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 7297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mApplication.cdmaOtaConfigData.otaShowListeningScreen 7327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon == OTA_SHOW_LISTENING_SCREEN_ON) { 7337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowListeningScreen(): show listening screen"); 7347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!isDialerOpened()) { 7357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaScreenInitialize(); 7367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextListenProgress.setVisibility(View.VISIBLE); 7377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_listen); 7386fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaDtmfDialerView.setVisibility(View.VISIBLE); 7397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 7407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 7417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 7427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 7437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaScreenState = 7457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING; 7467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 7477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowListeningScreen(): show progress screen"); 7487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowInProgressScreen(); 7497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 7537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Do any necessary updates (of onscreen UI, for example) 7547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * based on the latest status of the OTASP call. 7557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 7567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void updateOtaspProgress() { 7577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("updateOtaspProgress()... mInteractive = " + mInteractive); 7587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mInteractive) { 7597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // On regular phones we just call through to 7607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // otaShowInProgressScreen(), which updates the 7617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // InCallScreen's onscreen UI. 7627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowInProgressScreen(); 7637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 7647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We're not using the InCallScreen to show OTA progress. 7657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // For now, at least, there's nothing to do here. 7677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // The overall "success" or "failure" indication we send back 7687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // (to our caller) is triggered by the DISCONNECT event; 7697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // see updateNonInteractiveOtaSuccessFailure(). 7707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // But if we ever need to send *intermediate* progress updates back 7727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // to our caller, we'd do that here, possbily using the same 7737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // PendingIntent that we already use to indicate success or failure. 7747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 7787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * When a non-interactive OTASP call completes, send a success or 7797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * failure indication back to our caller. 7807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 7817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This is basically the non-interactive equivalent of 7827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * otaShowSuccessFailure(). 7837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 7847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void updateNonInteractiveOtaSuccessFailure() { 7857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // This is basically the same logic as otaShowSuccessFailure(): we 7867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // check the isOtaCallCommitted bit, and if that's true it means 7877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // that activation was successful. 7887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("updateNonInteractiveOtaSuccessFailure(): isOtaCallCommitted = " 7907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 7917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int resultCode = 7927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.isOtaCallCommitted 7937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ? OTASP_SUCCESS : OTASP_FAILURE; 7947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sendOtaspResult(resultCode); 7957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 7987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Sends the specified OTASP result code back to our caller (presumably 7997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * SetupWizard) via the PendingIntent that they originally sent along with 8007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * the ACTION_PERFORM_CDMA_PROVISIONING intent. 8017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 8027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void sendOtaspResult(int resultCode) { 8037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("sendOtaspResult: resultCode = " + resultCode); 8047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Pass the success or failure indication back to our caller by 8067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // adding an additional extra to the PendingIntent we already 8077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // have. 8087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // (NB: there's a PendingIntent send() method that takes a resultCode 8097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // directly, but we can't use that here since that call is only 8107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // meaningful for pending intents that are actually used as activity 8117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // results.) 8127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent extraStuff = new Intent(); 8147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon extraStuff.putExtra(EXTRA_OTASP_RESULT_CODE, resultCode); 8157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // When we call PendingIntent.send() below, the extras from this 8167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // intent will get merged with any extras already present in 8177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // cdmaOtaScreenState.otaspResultCodePendingIntent. 8187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mApplication.cdmaOtaScreenState == null) { 8207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: no cdmaOtaScreenState object!"); 8217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 8227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 8237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent == null) { 8247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: " 8257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + "null otaspResultCodePendingIntent!"); 8267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 8277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 8287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 8307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("- sendOtaspResult: SENDING PENDING INTENT: " + 8317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent); 8327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent.send( 8337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mContext, 8347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 0, /* resultCode (unused) */ 8357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon extraStuff); 8367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (CanceledException e) { 8377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // should never happen because no code cancels the pending intent right now, 8387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "PendingIntent send() failed: " + e); 8397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 8407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 8417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 8437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show "Programming In Progress" screen during OTA call. Shown when OTA 8447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * provisioning is in progress after user has selected an option. 8457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 8467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaShowInProgressScreen() { 8477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowInProgressScreen()..."); 8487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mInteractive) { 8497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We shouldn't ever get here in non-interactive mode! 8507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "otaShowInProgressScreen: not interactive!"); 8517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 8527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 8537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaScreenState = 8557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS; 8567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8576fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner if ((mOtaWidgetData == null) /* || (mInCallScreen == null) */) { 8587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "otaShowInProgressScreen: UI widgets not set up yet!"); 8597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO(OTASP): our CdmaOtaScreenState is now correct; we just set 8617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // it to OTA_STATUS_PROGRESS. But we still need to make sure that 8627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // when the InCallScreen eventually comes to the foreground, it 8637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // notices that state and does all the same UI updating we do below. 8647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 8657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 8667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!isDialerOpened()) { 8687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaScreenInitialize(); 8697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextListenProgress.setVisibility(View.VISIBLE); 8707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_progress); 8717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextProgressBar.setVisibility(View.VISIBLE); 8727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 8737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 8747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 8757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 8767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 8777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 8787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 8797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 8807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show programming failure dialog when OTA provisioning fails. 8817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * If OTA provisioning attempts fail more than 3 times, then unsuccessful 8827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * dialog is shown. Otherwise a two-second notice is shown with unsuccessful 8837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * information. When notice expires, phone returns to activation screen. 8847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 8857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaShowProgramFailure(int length) { 8867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowProgramFailure()..."); 8877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.activationCount++; 8887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if ((mApplication.cdmaOtaProvisionData.activationCount < 8897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaConfigData.otaShowActivateFailTimes) 8907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon && (mApplication.cdmaOtaConfigData.otaShowActivationScreen == 8917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon OTA_SHOW_ACTIVATION_SCREEN_ON)) { 8927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowProgramFailure(): activationCount" 8937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + mApplication.cdmaOtaProvisionData.activationCount); 8947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowProgramFailure(): show failure notice"); 8957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowProgramFailureNotice(length); 8967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 8977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowProgramFailure(): show failure dialog"); 8987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowProgramFailureDialog(); 8997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 9027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 9037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show either programming success dialog when OTA provisioning succeeds, or 9047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * programming failure dialog when it fails. See {@link #otaShowProgramFailure} 9057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * for more details. 9067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 9077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void otaShowSuccessFailure() { 9087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowSuccessFailure()..."); 9097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mInteractive) { 9107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We shouldn't ever get here in non-interactive mode! 9117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "otaShowSuccessFailure: not interactive!"); 9127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 9137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 9157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaScreenInitialize(); 9167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowSuccessFailure(): isOtaCallCommitted" 9177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 9187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mApplication.cdmaOtaProvisionData.isOtaCallCommitted) { 9197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowSuccessFailure(), show success dialog"); 9207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowProgramSuccessDialog(); 9217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 9227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowSuccessFailure(), show failure dialog"); 9237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowProgramFailure(OTA_FAILURE_DIALOG_TIMEOUT); 9247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 9267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 9287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 9297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show programming failure dialog when OTA provisioning fails more than 3 9307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * times. 9317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 9327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaShowProgramFailureDialog() { 9337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowProgramFailureDialog()..."); 9347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaScreenState = 9357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 9367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTitle.setText(R.string.ota_title_problem_with_activation); 9377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 9387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_unsuccessful); 9397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 9407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTryAgainButton.setVisibility(View.VISIBLE); 9417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //close the dialer if open 9426fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (isDialerOpened()) { 9436fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaCallCardDtmfDialer.closeDialer(false); 9446fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 9457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 9477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 9487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show programming success dialog when OTA provisioning succeeds. 9497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 9507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaShowProgramSuccessDialog() { 9517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowProgramSuccessDialog()..."); 9527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaScreenState = 9537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 9547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate_success); 9557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 9567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_successful); 9577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 9587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaNextButton.setVisibility(View.VISIBLE); 9597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //close the dialer if open 9606fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (isDialerOpened()) { 9616fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaCallCardDtmfDialer.closeDialer(false); 9626fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 9637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 9657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 9667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show SPC failure notice when SPC attempts exceed 15 times. 9677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * During OTA provisioning, if SPC code is incorrect OTA provisioning will 9687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * fail. When SPC attempts are over 15, it shows SPC failure notice for one minute and 9697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * then phone will power down. 9707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 9717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaShowSpcErrorNotice(int length) { 9727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowSpcErrorNotice()..."); 9737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mOtaWidgetData.spcErrorDialog == null) { 9747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.inOtaSpcState = true; 9757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon DialogInterface.OnKeyListener keyListener; 9767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon keyListener = new DialogInterface.OnKeyListener() { 9777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 9787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("Ignoring key events..."); 9797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 9807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }}; 9816fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner mOtaWidgetData.spcErrorDialog = new AlertDialog.Builder(null /* mInCallScreen */) 9827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setMessage(R.string.ota_spc_failure) 9837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setOnKeyListener(keyListener) 9847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .create(); 9857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.spcErrorDialog.getWindow().addFlags( 9867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 9877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 9887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.spcErrorDialog.show(); 9897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //close the dialer if open 9906fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (isDialerOpened()) { 9916fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaCallCardDtmfDialer.closeDialer(false); 9926fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 9937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon long noticeTime = length*1000; 9947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowSpcErrorNotice(), remaining SPC noticeTime" + noticeTime); 9956fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mInCallScreen.requestCloseSpcErrorNotice(noticeTime); 9967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 9987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 9997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 10007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * When SPC notice times out, force phone to power down. 10017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 10027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onOtaCloseSpcNotice() { 10037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("onOtaCloseSpcNotice(), send shutdown intent"); 10047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent shutdown = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); 10057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM, false); 10067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon shutdown.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 10077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mContext.startActivity(shutdown); 10087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 10117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show two-second notice when OTA provisioning fails and number of failed attempts 10127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * is less then 3. 10137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 10147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaShowProgramFailureNotice(int length) { 10157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowProgramFailureNotice()..."); 10167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mOtaWidgetData.otaFailureDialog == null) { 10176fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner mOtaWidgetData.otaFailureDialog = new AlertDialog.Builder(null /* mInCallScreen */) 10187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setMessage(R.string.ota_failure) 10197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .create(); 10207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaFailureDialog.getWindow().addFlags( 10217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 10227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 10237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaFailureDialog.show(); 10247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon long noticeTime = length*1000; 10266fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mInCallScreen.requestCloseOtaFailureNotice(noticeTime); 10277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 10317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Handle OTA unsuccessful notice expiry. Dismisses the 10327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * two-second notice and shows the activation screen. 10337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 10347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onOtaCloseFailureNotice() { 10357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("onOtaCloseFailureNotice()..."); 10367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mOtaWidgetData.otaFailureDialog != null) { 10377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaFailureDialog.dismiss(); 10387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaFailureDialog = null; 10397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowActivateScreen(); 10417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 10447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Initialize all OTA UI elements to be gone. Also set inCallPanel, 10457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * callCard and the dialpad handle to be gone. This is called before any OTA screen 10467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * gets drawn. 10477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 10487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void otaScreenInitialize() { 10497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaScreenInitialize()..."); 10507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mInteractive) { 10527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We should never be doing anything with UI elements in 10537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // non-interactive mode. 10547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "otaScreenInitialize: not interactive!"); 10557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 10567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10586fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mInCallTouchUi != null) mInCallTouchUi.setVisibility(View.GONE); 10596fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mCallCard != null) { 10606fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mCallCard.setVisibility(View.GONE); 10616fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // // TODO: try removing this. 10626fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mCallCard.hideCallCardElements(); 10636fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 10647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate); 10667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 10677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextListenProgress.setVisibility(View.GONE); 10687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 10697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 10707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 10717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 10727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 10736fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 10747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaSpeakerButton.setVisibility(View.GONE); 10757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 10767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 10777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaUpperWidgets.setVisibility(View.VISIBLE); 10787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaSkipButton.setVisibility(View.VISIBLE); 10797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void hideOtaScreen() { 10827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("hideOtaScreen()..."); 10837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 10857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 10867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 10877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaUpperWidgets.setVisibility(View.GONE); 10887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean isDialerOpened() { 10916fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // boolean retval = (mOtaCallCardDtmfDialer != null && mOtaCallCardDtmfDialer.isOpened()); 10926fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner boolean retval = false; 10937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("- isDialerOpened() ==> " + retval); 10947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return retval; 10957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 10967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 10987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Show the appropriate OTA screen based on the current state of OTA call. 10997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 11007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This is called from the InCallScreen when the screen needs to be 11017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * refreshed (and thus is only ever used in interactive mode.) 11027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 11037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Since this is called as part of the InCallScreen.updateScreen() sequence, 11047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * this method does *not* post an mInCallScreen.requestUpdateScreen() 11057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * request. 11067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 11077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void otaShowProperScreen() { 11087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("otaShowProperScreen()..."); 11097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mInteractive) { 11107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We shouldn't ever get here in non-interactive mode! 11117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "otaShowProperScreen: not interactive!"); 11127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 11137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11156fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if ((mInCallScreen != null) && mInCallScreen.isForegroundActivity()) { 11166fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (DBG) log("otaShowProperScreen(): InCallScreen in foreground, currentstate = " 11176fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // + mApplication.cdmaOtaScreenState.otaScreenState); 11186fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mInCallTouchUi != null) { 11196fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mInCallTouchUi.setVisibility(View.GONE); 11206fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 11216fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mCallCard != null) { 11226fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mCallCard.setVisibility(View.GONE); 11236fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 11246fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mApplication.cdmaOtaScreenState.otaScreenState 11256fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION) { 11266fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // otaShowActivateScreen(); 11276fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } else if (mApplication.cdmaOtaScreenState.otaScreenState 11286fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING) { 11296fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // otaShowListeningScreen(); 11306fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } else if (mApplication.cdmaOtaScreenState.otaScreenState 11316fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS) { 11326fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // otaShowInProgressScreen(); 11336fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 11346fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner 11356fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 11366fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // otaShowSpcErrorNotice(getOtaSpcDisplayTime()); 11376fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 11386fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 11397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 11427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Read configuration values for each OTA screen from config.xml. 11437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * These configuration values control visibility of each screen. 11447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 11457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void readXmlSettings() { 11467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("readXmlSettings()..."); 11477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mApplication.cdmaOtaConfigData.configComplete) { 11487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 11497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaConfigData.configComplete = true; 11527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int tmpOtaShowActivationScreen = 11537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mContext.getResources().getInteger(R.integer.OtaShowActivationScreen); 11547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaConfigData.otaShowActivationScreen = tmpOtaShowActivationScreen; 11557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("readXmlSettings(), otaShowActivationScreen = " 11567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + mApplication.cdmaOtaConfigData.otaShowActivationScreen); 11577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int tmpOtaShowListeningScreen = 11597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mContext.getResources().getInteger(R.integer.OtaShowListeningScreen); 11607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaConfigData.otaShowListeningScreen = tmpOtaShowListeningScreen; 11617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("readXmlSettings(), otaShowListeningScreen = " 11627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + mApplication.cdmaOtaConfigData.otaShowListeningScreen); 11637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int tmpOtaShowActivateFailTimes = 11657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mContext.getResources().getInteger(R.integer.OtaShowActivateFailTimes); 11667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaConfigData.otaShowActivateFailTimes = tmpOtaShowActivateFailTimes; 11677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("readXmlSettings(), otaShowActivateFailTimes = " 11687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + mApplication.cdmaOtaConfigData.otaShowActivateFailTimes); 11697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int tmpOtaPlaySuccessFailureTone = 11717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mContext.getResources().getInteger(R.integer.OtaPlaySuccessFailureTone); 11727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone = tmpOtaPlaySuccessFailureTone; 11737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("readXmlSettings(), otaPlaySuccessFailureTone = " 11747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone); 11757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 11767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 11787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Handle the click events for OTA buttons. 11797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 11807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onClickHandler(int id) { 11817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (id) { 11827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.otaEndButton: 11837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon onClickOtaEndButton(); 11847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 11857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.otaSpeakerButton: 11877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon onClickOtaSpeakerButton(); 11887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 11897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.otaActivateButton: 11917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon onClickOtaActivateButton(); 11927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 11937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.otaSkipButton: 11957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon onClickOtaActivateSkipButton(); 11967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 11977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.otaNextButton: 11997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon onClickOtaActivateNextButton(); 12007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 12017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.otaTryAgainButton: 12037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon onClickOtaTryAgainButton(); 12047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 12057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 12077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log ("onClickHandler: received a click event for unrecognized id"); 12087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 12097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void onClickOtaTryAgainButton() { 12137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("Activation Try Again Clicked!"); 12147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 12157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowActivateScreen(); 12167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void onClickOtaEndButton() { 12207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("Activation End Call Button Clicked!"); 12217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 12227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (PhoneUtils.hangup(mApplication.mCM) == false) { 12237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // If something went wrong when placing the OTA call, 12247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the screen is not updated by the call disconnect 12257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // handler and we have to do it here 12267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setSpeaker(false); 12276fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mInCallScreen.handleOtaCallEnd(); 12287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void onClickOtaSpeakerButton() { 12337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("OTA Speaker button Clicked!"); 12347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 12357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean isChecked = !PhoneUtils.isSpeakerOn(mContext); 12367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setSpeaker(isChecked); 12377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void onClickOtaActivateButton() { 12417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("Call Activation Clicked!"); 12427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaPerformActivation(); 12437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void onClickOtaActivateSkipButton() { 12467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("Activation Skip Clicked!"); 12477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon DialogInterface.OnKeyListener keyListener; 12487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon keyListener = new DialogInterface.OnKeyListener() { 12497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onKey(DialogInterface dialog, int keyCode, 12507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon KeyEvent event) { 12517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("Ignoring key events..."); 12527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 12537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }; 12556fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner mOtaWidgetData.otaSkipConfirmationDialog = new AlertDialog.Builder(null /* mInCallScreen */) 12567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setTitle(R.string.ota_skip_activation_dialog_title) 12577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setMessage(R.string.ota_skip_activation_dialog_message) 12587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setPositiveButton( 12597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon android.R.string.ok, 12607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // "OK" means "skip activation". 12617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new AlertDialog.OnClickListener() { 12627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onClick(DialogInterface dialog, int which) { 12637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaSkipActivation(); 12647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }) 12667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setNegativeButton( 12677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon android.R.string.cancel, 12687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // "Cancel" means just dismiss the dialog. 12697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Don't actually start an activation call. 12707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon null) 12717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setOnKeyListener(keyListener) 12727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .create(); 12737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaSkipConfirmationDialog.show(); 12747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void onClickOtaActivateNextButton() { 12777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("Dialog Next Clicked!"); 12787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 12797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaScreenState = 12807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 12817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowHome(); 12827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 12857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void dismissAllOtaDialogs() { 12867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mOtaWidgetData != null) { 12877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mOtaWidgetData.spcErrorDialog != null) { 12887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("- DISMISSING mSpcErrorDialog."); 12897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.spcErrorDialog.dismiss(); 12907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.spcErrorDialog = null; 12917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mOtaWidgetData.otaFailureDialog != null) { 12937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("- DISMISSING mOtaFailureDialog."); 12947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaFailureDialog.dismiss(); 12957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaFailureDialog = null; 12967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 12997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private int getOtaSpcDisplayTime() { 13017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("getOtaSpcDisplayTime()..."); 13027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int tmpSpcTime = 1; 13037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 13047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon long tmpOtaSpcRunningTime = 0; 13057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon long tmpOtaSpcLeftTime = 0; 13067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon tmpOtaSpcRunningTime = SystemClock.elapsedRealtime(); 13077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon tmpOtaSpcLeftTime = 13087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon tmpOtaSpcRunningTime - mApplication.cdmaOtaProvisionData.otaSpcUptime; 13097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (tmpOtaSpcLeftTime >= OTA_SPC_TIMEOUT*1000) { 13107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon tmpSpcTime = 1; 13117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 13127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon tmpSpcTime = OTA_SPC_TIMEOUT - (int)tmpOtaSpcLeftTime/1000; 13137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("getOtaSpcDisplayTime(), time for SPC error notice: " + tmpSpcTime); 13167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return tmpSpcTime; 13177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 13207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Initialize the OTA widgets for all OTA screens. 13217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 13227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void initOtaInCallScreen() { 13237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("initOtaInCallScreen()..."); 13246fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaTitle = (TextView) mInCallScreen.findViewById(R.id.otaTitle); 13256fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaTextActivate = (TextView) mInCallScreen.findViewById(R.id.otaActivate); 13267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 13276fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaTextListenProgress = 13286fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (TextView) mInCallScreen.findViewById(R.id.otaListenProgress); 13296fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaTextProgressBar = 13306fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (ProgressBar) mInCallScreen.findViewById(R.id.progress_large); 13317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextProgressBar.setIndeterminate(true); 13326fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaTextSuccessFail = 13336fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (TextView) mInCallScreen.findViewById(R.id.otaSuccessFailStatus); 13346fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner 13356fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaUpperWidgets = 13366fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (ViewGroup) mInCallScreen.findViewById(R.id.otaUpperWidgets); 13376fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.callCardOtaButtonsListenProgress = 13386fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (View) mInCallScreen.findViewById(R.id.callCardOtaListenProgress); 13396fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.callCardOtaButtonsActivate = 13406fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (View) mInCallScreen.findViewById(R.id.callCardOtaActivate); 13416fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.callCardOtaButtonsFailSuccess = 13426fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (View) mInCallScreen.findViewById(R.id.callCardOtaFailOrSuccessful); 13436fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner 13446fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaEndButton = (Button) mInCallScreen.findViewById(R.id.otaEndButton); 13456fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaEndButton.setOnClickListener(mInCallScreen); 13466fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaSpeakerButton = 13476fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (ToggleButton) mInCallScreen.findViewById(R.id.otaSpeakerButton); 13486fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaSpeakerButton.setOnClickListener(mInCallScreen); 13496fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaActivateButton = 13506fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (Button) mInCallScreen.findViewById(R.id.otaActivateButton); 13516fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaActivateButton.setOnClickListener(mInCallScreen); 13526fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaSkipButton = (Button) mInCallScreen.findViewById(R.id.otaSkipButton); 13536fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaSkipButton.setOnClickListener(mInCallScreen); 13546fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaNextButton = (Button) mInCallScreen.findViewById(R.id.otaNextButton); 13556fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaNextButton.setOnClickListener(mInCallScreen); 13566fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaTryAgainButton = 13576fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (Button) mInCallScreen.findViewById(R.id.otaTryAgainButton); 13586fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaTryAgainButton.setOnClickListener(mInCallScreen); 13596fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner 13606fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaDtmfDialerView = 13616fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // (DTMFTwelveKeyDialerView) mInCallScreen.findViewById(R.id.otaDtmfDialerView); 13627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Sanity-check: the otaDtmfDialerView widget should *always* be present. 13636fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mOtaWidgetData.otaDtmfDialerView == null) { 13646fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // throw new IllegalStateException("initOtaInCallScreen: couldn't find otaDtmfDialerView"); 13656fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 13667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Create a new DTMFTwelveKeyDialer instance purely for use by the 13687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // DTMFTwelveKeyDialerView ("otaDtmfDialerView") that comes from 13697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // otacall_card.xml. 13706fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaCallCardDtmfDialer = new DTMFTwelveKeyDialer(mInCallScreen, 13716fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaDtmfDialerView); 13727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Initialize the new DTMFTwelveKeyDialer instance. This is 13747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // needed to play local DTMF tones. 13756fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaCallCardDtmfDialer.startDialerSession(); 13767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13776fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaDtmfDialerView.setDialer(mOtaCallCardDtmfDialer); 13787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 13797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 13817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Clear out all OTA UI widget elements. Needs to get called 13827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * when OTA call ends or InCallScreen is destroyed. 13837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param disableSpeaker parameter control whether Speaker should be turned off. 13847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 13857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void cleanOtaScreen(boolean disableSpeaker) { 13867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("OTA ends, cleanOtaScreen!"); 13877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaScreenState.otaScreenState = 13897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 13907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.isOtaCallCommitted = false; 13917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 13927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.inOtaSpcState = false; 13937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.activationCount = 0; 13947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaProvisionData.otaSpcUptime = 0; 13957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaInCallScreenUiState.state = State.UNDEFINED; 13967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 13977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mInteractive && (mOtaWidgetData != null)) { 13986fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mInCallTouchUi != null) mInCallTouchUi.setVisibility(View.VISIBLE); 13996fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mCallCard != null) { 14006fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mCallCard.setVisibility(View.VISIBLE); 14016fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mCallCard.hideCallCardElements(); 14026fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 14037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Free resources from the DTMFTwelveKeyDialer instance we created 14057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // in initOtaInCallScreen(). 14066fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // if (mOtaCallCardDtmfDialer != null) { 14076fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaCallCardDtmfDialer.stopDialerSession(); 14086fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // } 14097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 14117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextListenProgress.setVisibility(View.GONE); 14127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 14137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 14147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 14157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 14167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 14177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaUpperWidgets.setVisibility(View.GONE); 14186fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner // mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 14197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 14207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 14217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // turn off the speaker in case it was turned on 14247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // but the OTA call could not be completed 14257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (disableSpeaker) { 14267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setSpeaker(false); 14277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 14317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Defines OTA information that needs to be maintained during 14327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * an OTA call when display orientation changes. 14337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 14347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static class CdmaOtaProvisionData { 14357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean isOtaCallCommitted; 14367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean isOtaCallIntentProcessed; 14377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean inOtaSpcState; 14387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int activationCount; 14397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public long otaSpcUptime; 14407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 14437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Defines OTA screen configuration items read from config.xml 14447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * and used to control OTA display. 14457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 14467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static class CdmaOtaConfigData { 14477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int otaShowActivationScreen; 14487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int otaShowListeningScreen; 14497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int otaShowActivateFailTimes; 14507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int otaPlaySuccessFailureTone; 14517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean configComplete; 14527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CdmaOtaConfigData() { 14537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("CdmaOtaConfigData constructor!"); 14547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowActivationScreen = OTA_SHOW_ACTIVATION_SCREEN_OFF; 14557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowListeningScreen = OTA_SHOW_LISTENING_SCREEN_OFF; 14567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaShowActivateFailTimes = OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF; 14577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaPlaySuccessFailureTone = OTA_PLAY_SUCCESS_FAILURE_TONE_OFF; 14587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 14627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The state of the OTA InCallScreen UI. 14637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 14647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static class CdmaOtaInCallScreenUiState { 14657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public enum State { 14667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon UNDEFINED, 14677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon NORMAL, 14687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ENDED 14697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public State state; 14727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CdmaOtaInCallScreenUiState() { 14747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("CdmaOtaInCallScreenState: constructor init to UNDEFINED"); 14757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon state = CdmaOtaInCallScreenUiState.State.UNDEFINED; 14767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 14807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Save the Ota InCallScreen UI state 14817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 14827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void setCdmaOtaInCallScreenUiState(CdmaOtaInCallScreenUiState.State state) { 14837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("setCdmaOtaInCallScreenState: " + state); 14847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mApplication.cdmaOtaInCallScreenUiState.state = state; 14857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 14887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Get the Ota InCallScreen UI state 14897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 14907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CdmaOtaInCallScreenUiState.State getCdmaOtaInCallScreenUiState() { 14917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("getCdmaOtaInCallScreenState: " 14927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + mApplication.cdmaOtaInCallScreenUiState.state); 14937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return mApplication.cdmaOtaInCallScreenUiState.state; 14947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 14957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 14967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 14977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The OTA screen state machine. 14987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 14997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static class CdmaOtaScreenState { 15007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public enum OtaScreenState { 15017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon OTA_STATUS_UNDEFINED, 15027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon OTA_STATUS_ACTIVATION, 15037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon OTA_STATUS_LISTENING, 15047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon OTA_STATUS_PROGRESS, 15057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon OTA_STATUS_SUCCESS_FAILURE_DLG 15067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 15087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public OtaScreenState otaScreenState; 15097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 15107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CdmaOtaScreenState() { 15117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaScreenState = OtaScreenState.OTA_STATUS_UNDEFINED; 15127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 15147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 15157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * {@link PendingIntent} used to report an OTASP result status code 15167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * back to our caller. Can be null. 15177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 15187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Our caller (presumably SetupWizard) may create this PendingIntent, 15197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * pointing back at itself, and passes it along as an extra with the 15207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * ACTION_PERFORM_CDMA_PROVISIONING intent. Then, when there's an 15217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OTASP result to report, we send that PendingIntent back, adding an 15227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * extra called EXTRA_OTASP_RESULT_CODE to indicate the result. 15237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 15247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Possible result values are the OTASP_RESULT_* constants. 15257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 15267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public PendingIntent otaspResultCodePendingIntent; 15277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 15297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** @see com.android.internal.telephony.Phone */ 15307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static String otaProvisionStatusToString(int status) { 15317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (status) { 15327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 15337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "SPL_UNLOCKED"; 15347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 15357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "SPC_RETRIES_EXCEEDED"; 15367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 15377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "A_KEY_EXCHANGED"; 15387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 15397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "SSD_UPDATED"; 15407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 15417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "NAM_DOWNLOADED"; 15427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 15437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "MDN_DOWNLOADED"; 15447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 15457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "IMSI_DOWNLOADED"; 15467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 15477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "PRL_DOWNLOADED"; 15487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 15497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "COMMITTED"; 15507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 15517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "OTAPA_STARTED"; 15527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 15537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "OTAPA_STOPPED"; 15547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 15557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "OTAPA_ABORTED"; 15567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 15577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "<unknown status" + status + ">"; 15587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 15617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static int getLteOnCdmaMode(Context context) { 15627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService( 15637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Context.TELEPHONY_SERVICE); 15647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // If the telephony manager is not available yet, or if it doesn't know the answer yet, 15657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // try falling back on the system property that may or may not be there 15667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (telephonyManager == null 15677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon || telephonyManager.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_UNKNOWN) { 15687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return SystemProperties.getInt(TelephonyProperties.PROPERTY_LTE_ON_CDMA_DEVICE, 15697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneConstants.LTE_ON_CDMA_UNKNOWN); 15707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return telephonyManager.getLteOnCdmaMode(); 15727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 15747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static void log(String msg) { 15757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, msg); 15767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 15787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static void loge(String msg) { 15797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, msg); 15807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 15817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 1582