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