OtaUtils.java revision 58e4707b6cc021a663deae3e614364545ec9ee6a
1af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville/* 2af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Copyright (C) 2009 The Android Open Source Project 3af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * 4af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * you may not use this file except in compliance with the License. 6af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * You may obtain a copy of the License at 7af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * 8af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 9af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * 10af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Unless required by applicable law or agreed to in writing, software 11af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * See the License for the specific language governing permissions and 14af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * limitations under the License. 15af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 16af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 17af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savillepackage com.android.phone; 18af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 19af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport com.android.internal.telephony.Phone; 205c0517ae3c17505ffd466be79ab0026b7fe6c959Wink Savilleimport com.android.phone.OtaUtils.CdmaOtaInCallScreenUiState.State; 21af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 22b154630235935e1aab2a41eff9ed794d40084a02David Brownimport android.app.Activity; 23777b22c936d2bfa8140427402906a140d17180dcFreeman Ngimport android.app.ActivityManager; 24af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.app.AlertDialog; 2513660626500d047d4a3a097e832bb175e1c4f894Freeman Ngimport android.app.PendingIntent; 2613660626500d047d4a3a097e832bb175e1c4f894Freeman Ngimport android.app.PendingIntent.CanceledException; 27af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.content.Context; 28af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.content.DialogInterface; 29af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.content.Intent; 30af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.os.AsyncResult; 31839b14d460986608fe577f89f789de854dc85b58Jim Millerimport android.os.Handler; 32af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.os.SystemClock; 33af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.util.Log; 34af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.KeyEvent; 35af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.View; 36af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.ViewGroup; 37af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.ViewStub; 38af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.WindowManager; 39af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.widget.Button; 40af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.widget.ProgressBar; 41b154630235935e1aab2a41eff9ed794d40084a02David Brownimport android.widget.ScrollView; 42af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.widget.TextView; 43b154630235935e1aab2a41eff9ed794d40084a02David Brownimport android.widget.ToggleButton; 44af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 45af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville/** 46af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handles all OTA Call related logic and UI functionality. 47e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * The InCallScreen interacts with this class to perform an OTA Call. 48e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * 49e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * OTA is a CDMA-specific feature: 50e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * OTA or OTASP == Over The Air service provisioning 51e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * SPC == Service Programming Code 52e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * TODO: Include pointer to more detailed documentation. 53b154630235935e1aab2a41eff9ed794d40084a02David Brown * 54b154630235935e1aab2a41eff9ed794d40084a02David Brown * TODO: This is Over The Air Service Provisioning (OTASP) 55b154630235935e1aab2a41eff9ed794d40084a02David Brown * A better name would be OtaspUtils.java. 56af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 57af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savillepublic class OtaUtils { 58af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private static final String LOG_TAG = "OtaUtils"; 59c3098c14cb1c0444d61ba1b6d0b81175e93bbd75David Brown private static final boolean DBG = true; 60af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 61af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATION_SCREEN_OFF = 0; 62af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATION_SCREEN_ON = 1; 63af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_LISTENING_SCREEN_OFF =0; 64af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_LISTENING_SCREEN_ON =1; 65af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF = 0; 66af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_THREE = 3; 67af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_OFF = 0; 68af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_ON = 1; 69af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 7017c36a10d09fac3e2312c0bcb839e0a704f42105w // SPC Timeout is 60 seconds 7117c36a10d09fac3e2312c0bcb839e0a704f42105w public final int OTA_SPC_TIMEOUT = 60; 72af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public final int OTA_FAILURE_DIALOG_TIMEOUT = 2; 73af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 74b154630235935e1aab2a41eff9ed794d40084a02David Brown // Constants for OTASP-related Intents and intent extras. 75b154630235935e1aab2a41eff9ed794d40084a02David Brown // Watch out: these must agree with the corresponding constants in 76b154630235935e1aab2a41eff9ed794d40084a02David Brown // apps/SetupWizard! 77b154630235935e1aab2a41eff9ed794d40084a02David Brown 78b154630235935e1aab2a41eff9ed794d40084a02David Brown // Intent action to launch an OTASP call. 79b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String ACTION_PERFORM_CDMA_PROVISIONING = 80b154630235935e1aab2a41eff9ed794d40084a02David Brown "com.android.phone.PERFORM_CDMA_PROVISIONING"; 81b154630235935e1aab2a41eff9ed794d40084a02David Brown 82d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng // Intent action to launch activation on a non-voice capable device 83d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng public static final String ACTION_PERFORM_VOICELESS_CDMA_PROVISIONING = 84d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng "com.android.phone.PERFORM_VOICELESS_CDMA_PROVISIONING"; 85d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng 860c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng // boolean voiceless provisioning extra that enables a "don't show this again" checkbox 870c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng // the user can check to never see the activity upon bootup again 880c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng public static final String EXTRA_VOICELESS_PROVISIONING_OFFER_DONTSHOW = 890c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng "com.android.phone.VOICELESS_PROVISIONING_OFFER_DONTSHOW"; 900c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng 91b154630235935e1aab2a41eff9ed794d40084a02David Brown // Activity result codes for the ACTION_PERFORM_CDMA_PROVISIONING intent 92b154630235935e1aab2a41eff9ed794d40084a02David Brown // (see the InCallScreenShowActivation activity.) 93b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // 94b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // Note: currently, our caller won't ever actually receive the 95b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // RESULT_INTERACTIVE_OTASP_STARTED result code; see comments in 96b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // InCallScreenShowActivation.onCreate() for details. 97b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown 98b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int RESULT_INTERACTIVE_OTASP_STARTED = Activity.RESULT_FIRST_USER; 99b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int RESULT_NONINTERACTIVE_OTASP_STARTED = Activity.RESULT_FIRST_USER + 1; 100b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int RESULT_NONINTERACTIVE_OTASP_FAILED = Activity.RESULT_FIRST_USER + 2; 101b154630235935e1aab2a41eff9ed794d40084a02David Brown 102b154630235935e1aab2a41eff9ed794d40084a02David Brown // Testing: Extra for the ACTION_PERFORM_CDMA_PROVISIONING intent that 103b154630235935e1aab2a41eff9ed794d40084a02David Brown // allows the caller to manually enable/disable "interactive mode" for 1047d38129b67491544c5969dc784db478b13918b08David Brown // the OTASP call. Only available in userdebug or eng builds. 105b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String EXTRA_OVERRIDE_INTERACTIVE_MODE = 106b154630235935e1aab2a41eff9ed794d40084a02David Brown "ota_override_interactive_mode"; 107b154630235935e1aab2a41eff9ed794d40084a02David Brown 108b154630235935e1aab2a41eff9ed794d40084a02David Brown // Extra for the ACTION_PERFORM_CDMA_PROVISIONING intent, holding a 109b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent which the phone app can use to send a result code 110b154630235935e1aab2a41eff9ed794d40084a02David Brown // back to the caller. 111b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String EXTRA_OTASP_RESULT_CODE_PENDING_INTENT = 112b154630235935e1aab2a41eff9ed794d40084a02David Brown "otasp_result_code_pending_intent"; 113b154630235935e1aab2a41eff9ed794d40084a02David Brown 114b154630235935e1aab2a41eff9ed794d40084a02David Brown // Extra attached to the above PendingIntent that indicates 115b154630235935e1aab2a41eff9ed794d40084a02David Brown // success or failure. 116b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String EXTRA_OTASP_RESULT_CODE = 117b154630235935e1aab2a41eff9ed794d40084a02David Brown "otasp_result_code"; 118b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_UNKNOWN = 0; 119b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_USER_SKIPPED = 1; // Only meaningful with interactive OTASP 120b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_SUCCESS = 2; 121b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_FAILURE = 3; 12262995702f659b906127351596305906ccd0d7cb5Freeman Ng // failed due to CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED 12362995702f659b906127351596305906ccd0d7cb5Freeman Ng public static final int OTASP_FAILURE_SPC_RETRIES = 4; 124b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // TODO: Distinguish between interactive and non-interactive success 125b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // and failure. Then, have the PendingIntent be sent after 126b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // interactive OTASP as well (so the caller can find out definitively 127b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // when interactive OTASP completes.) 128b154630235935e1aab2a41eff9ed794d40084a02David Brown 129b154630235935e1aab2a41eff9ed794d40084a02David Brown private static final String OTASP_NUMBER = "*228"; 130b154630235935e1aab2a41eff9ed794d40084a02David Brown private static final String OTASP_NUMBER_NON_INTERACTIVE = "*22899"; 131b154630235935e1aab2a41eff9ed794d40084a02David Brown 132af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private InCallScreen mInCallScreen; 133af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private Context mContext; 134af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private PhoneApp mApplication; 135af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private OtaWidgetData mOtaWidgetData; 136af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private ViewGroup mInCallPanel; 137af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private CallCard mCallCard; 1382f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 1392f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // The DTMFTwelveKeyDialer instance owned by the InCallScreen, which 1402f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // the InCallScreen passes in to our constructor. 141af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private DTMFTwelveKeyDialer mDialer; 1422f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // 1432f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // The DTMFTwelveKeyDialer instance that we create ourselves in 1442f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // initOtaInCallScreen(), and attach to the DTMFTwelveKeyDialerView 1452f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // ("otaDtmfDialerView") that comes from otacall_card.xml. 1462f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown private DTMFTwelveKeyDialer mOtaCallCardDtmfDialer; 1472f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // TODO: we ought to share a single DTMFTwelveKeyDialer instance for 1482f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // both these uses, but see bug 2432289 for related issues. 1492f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 15057a38778e8c9f58b24cea1062e451934cadc4b3dJim Miller private static boolean mIsWizardMode = true; 151af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 152b154630235935e1aab2a41eff9ed794d40084a02David Brown // In "interactive mode", the OtaUtils object is tied to an 153b154630235935e1aab2a41eff9ed794d40084a02David Brown // InCallScreen instance, where we display a bunch of UI specific to 154b154630235935e1aab2a41eff9ed794d40084a02David Brown // the OTASP call. But on devices that are not "voice capable", the 155b154630235935e1aab2a41eff9ed794d40084a02David Brown // OTASP call runs in a non-interactive mode, and we don't have 156b154630235935e1aab2a41eff9ed794d40084a02David Brown // an InCallScreen or CallCard or any OTASP UI elements at all. 157b154630235935e1aab2a41eff9ed794d40084a02David Brown private boolean mInteractive = true; 158b154630235935e1aab2a41eff9ed794d40084a02David Brown 159b154630235935e1aab2a41eff9ed794d40084a02David Brown 160af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 161af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * OtaWidgetData class represent all OTA UI elements 162af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 163af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private class OtaWidgetData { 164af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public Button otaEndButton; 165af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public Button otaActivateButton; 16613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public Button otaSkipButton; 167986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public Button otaNextButton; 168af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public ToggleButton otaSpeakerButton; 169af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View otaCallCardBase; 170af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View callCardOtaButtonsFailSuccess; 171af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public ProgressBar otaTextProgressBar; 172af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public TextView otaTextSuccessFail; 173af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View callCardOtaButtonsActivate; 174af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View callCardOtaButtonsListenProgress; 175af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public TextView otaTextActivate; 176af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public TextView otaTextListenProgress; 1779e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller public ScrollView otaTextListenProgressContainer; 178af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public AlertDialog spcErrorDialog; 179af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public AlertDialog otaFailureDialog; 18013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public AlertDialog otaSkipConfirmationDialog; 181986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public TextView otaTitle; 182986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public DTMFTwelveKeyDialerView otaDtmfDialerView; 183986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public Button otaTryAgainButton; 184af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 185af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 186af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public OtaUtils(Context context, 187af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville InCallScreen inCallScreen, 188af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville ViewGroup inCallPanel, 189af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CallCard callCard, 1908df5c508da2c836b841ee24120fa7c5cc92df387David Brown DTMFTwelveKeyDialer dialer) { 191af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 192af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("Enter OtaUtil constructor"); 193af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 194af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen = inCallScreen; 195af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext = context; 196af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallPanel = inCallPanel; 197af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mCallCard = callCard; 198af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer = dialer; 199af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication = PhoneApp.getInstance(); 200af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData = new OtaWidgetData(); 201af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 202b154630235935e1aab2a41eff9ed794d40084a02David Brown // If no InCallScreen was passed in, assume non-interactive mode. 203b154630235935e1aab2a41eff9ed794d40084a02David Brown mInteractive = (mInCallScreen != null); 204b154630235935e1aab2a41eff9ed794d40084a02David Brown 205b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) { 206b154630235935e1aab2a41eff9ed794d40084a02David Brown // inflate OTA Call card and footers 207b154630235935e1aab2a41eff9ed794d40084a02David Brown ViewStub otaCallCardStub = (ViewStub) mInCallScreen.findViewById(R.id.otaCallCardStub); 208b154630235935e1aab2a41eff9ed794d40084a02David Brown otaCallCardStub.inflate(); 209b154630235935e1aab2a41eff9ed794d40084a02David Brown readXmlSettings(); 210b154630235935e1aab2a41eff9ed794d40084a02David Brown initOtaInCallScreen(); 211b154630235935e1aab2a41eff9ed794d40084a02David Brown } 212af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 213a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 214839b14d460986608fe577f89f789de854dc85b58Jim Miller /** 215839b14d460986608fe577f89f789de854dc85b58Jim Miller * Starts the OTA provisioning call. If the MIN isn't available yet, it returns false and adds 216a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent * an event to return the request to the calling app when it becomes available. 217a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent * 218839b14d460986608fe577f89f789de854dc85b58Jim Miller * @param context 219839b14d460986608fe577f89f789de854dc85b58Jim Miller * @param handler 220839b14d460986608fe577f89f789de854dc85b58Jim Miller * @param request 221839b14d460986608fe577f89f789de854dc85b58Jim Miller * @return true if we were able to launch Ota activity or it's not required; false otherwise 222839b14d460986608fe577f89f789de854dc85b58Jim Miller */ 223839b14d460986608fe577f89f789de854dc85b58Jim Miller public static boolean maybeDoOtaCall(Context context, Handler handler, int request) { 22413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 225839b14d460986608fe577f89f789de854dc85b58Jim Miller PhoneApp app = PhoneApp.getInstance(); 226839b14d460986608fe577f89f789de854dc85b58Jim Miller Phone phone = app.phone; 227839b14d460986608fe577f89f789de854dc85b58Jim Miller 228777b22c936d2bfa8140427402906a140d17180dcFreeman Ng if (ActivityManager.isRunningInTestHarness()) { 229777b22c936d2bfa8140427402906a140d17180dcFreeman Ng Log.i(LOG_TAG, "Don't run provisioning when in test harness"); 230777b22c936d2bfa8140427402906a140d17180dcFreeman Ng return true; 231777b22c936d2bfa8140427402906a140d17180dcFreeman Ng } 232777b22c936d2bfa8140427402906a140d17180dcFreeman Ng 233839b14d460986608fe577f89f789de854dc85b58Jim Miller if (!isCdmaPhone()) { 234b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("Can't run provisioning on a non-CDMA phone"); 235839b14d460986608fe577f89f789de854dc85b58Jim Miller return true; // sanity check - a non-cdma phone doesn't need to run this 236839b14d460986608fe577f89f789de854dc85b58Jim Miller } 237839b14d460986608fe577f89f789de854dc85b58Jim Miller 238839b14d460986608fe577f89f789de854dc85b58Jim Miller if (!phone.isMinInfoReady()) { 239839b14d460986608fe577f89f789de854dc85b58Jim Miller if (DBG) log("MIN is not ready. Registering to receive notification."); 240839b14d460986608fe577f89f789de854dc85b58Jim Miller phone.registerForSubscriptionInfoReady(handler, request, null); 241839b14d460986608fe577f89f789de854dc85b58Jim Miller return false; 242839b14d460986608fe577f89f789de854dc85b58Jim Miller } 243839b14d460986608fe577f89f789de854dc85b58Jim Miller phone.unregisterForSubscriptionInfoReady(handler); 244839b14d460986608fe577f89f789de854dc85b58Jim Miller 245f0d315541b1b1f33fab5e7952471da6e886b53efWink Saville boolean phoneNeedsActivation = phone.needsOtaServiceProvisioning(); 246839b14d460986608fe577f89f789de854dc85b58Jim Miller if (DBG) log("phoneNeedsActivation is set to " + phoneNeedsActivation); 247a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 248839b14d460986608fe577f89f789de854dc85b58Jim Miller int otaShowActivationScreen = context.getResources().getInteger( 249839b14d460986608fe577f89f789de854dc85b58Jim Miller R.integer.OtaShowActivationScreen); 250839b14d460986608fe577f89f789de854dc85b58Jim Miller 251839b14d460986608fe577f89f789de854dc85b58Jim Miller if (DBG) log("otaShowActivationScreen: " + otaShowActivationScreen); 252839b14d460986608fe577f89f789de854dc85b58Jim Miller 253d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng // Run the OTASP call in "interactive" mode only if 254d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng // this is a "voice capable" device. 2552e97fab35871f41a9a8d8099ccb664b17d92554cDavid Brown if (PhoneApp.sVoiceCapable) { 256b154630235935e1aab2a41eff9ed794d40084a02David Brown if (phoneNeedsActivation 257b154630235935e1aab2a41eff9ed794d40084a02David Brown && (otaShowActivationScreen == OTA_SHOW_ACTIVATION_SCREEN_ON)) { 258b154630235935e1aab2a41eff9ed794d40084a02David Brown app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 25958e4707b6cc021a663deae3e614364545ec9ee6aDavid Brown 26058e4707b6cc021a663deae3e614364545ec9ee6aDavid Brown // TODO(InCallScreen redesign): Fire off the OTASP call using 26158e4707b6cc021a663deae3e614364545ec9ee6aDavid Brown // some TBD API on the CallController, not by launching the 26258e4707b6cc021a663deae3e614364545ec9ee6aDavid Brown // InCallScreen! (see bug 4194458) 26358e4707b6cc021a663deae3e614364545ec9ee6aDavid Brown 264b154630235935e1aab2a41eff9ed794d40084a02David Brown Intent newIntent = new Intent(ACTION_PERFORM_CDMA_PROVISIONING); 265b154630235935e1aab2a41eff9ed794d40084a02David Brown newIntent.setClass(context, InCallScreen.class); 266b154630235935e1aab2a41eff9ed794d40084a02David Brown newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 267b154630235935e1aab2a41eff9ed794d40084a02David Brown mIsWizardMode = false; 268b154630235935e1aab2a41eff9ed794d40084a02David Brown context.startActivity(newIntent); 269b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("maybeDoOtaCall: voice capable; activation intent sent."); 270b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 271b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("maybeDoOtaCall: voice capable; activation intent NOT sent."); 272b154630235935e1aab2a41eff9ed794d40084a02David Brown } 273839b14d460986608fe577f89f789de854dc85b58Jim Miller } else { 274b154630235935e1aab2a41eff9ed794d40084a02David Brown if (phoneNeedsActivation) { 275d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 276d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng Intent newIntent = new Intent(ACTION_PERFORM_VOICELESS_CDMA_PROVISIONING); 277d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2780c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng newIntent.putExtra(EXTRA_VOICELESS_PROVISIONING_OFFER_DONTSHOW, true); 279d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng context.startActivity(newIntent); 280d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng if (DBG) log("maybeDoOtaCall: non-interactive; activation intent sent."); 281b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 282d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng if (DBG) log("maybeDoOtaCall: non-interactive, no need for OTASP."); 283b154630235935e1aab2a41eff9ed794d40084a02David Brown } 284839b14d460986608fe577f89f789de854dc85b58Jim Miller } 285839b14d460986608fe577f89f789de854dc85b58Jim Miller return true; 286839b14d460986608fe577f89f789de854dc85b58Jim Miller } 287af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 288b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 289b154630235935e1aab2a41eff9ed794d40084a02David Brown * Starts the OTASP call *without* involving the InCallScreen or 290b154630235935e1aab2a41eff9ed794d40084a02David Brown * displaying any UI. 291b154630235935e1aab2a41eff9ed794d40084a02David Brown * 292b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is used on data-only devices, which don't support any kind of 293b154630235935e1aab2a41eff9ed794d40084a02David Brown * in-call phone UI. 294b154630235935e1aab2a41eff9ed794d40084a02David Brown * 295b154630235935e1aab2a41eff9ed794d40084a02David Brown * @return PhoneUtils.CALL_STATUS_DIALED if we successfully 296b154630235935e1aab2a41eff9ed794d40084a02David Brown * dialed the OTASP number, or one of the other 297b154630235935e1aab2a41eff9ed794d40084a02David Brown * CALL_STATUS_* constants if there was a failure. 298b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 299b154630235935e1aab2a41eff9ed794d40084a02David Brown public static int startNonInteractiveOtasp(Context context) { 300b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("startNonInteractiveOtasp()..."); 301b154630235935e1aab2a41eff9ed794d40084a02David Brown PhoneApp app = PhoneApp.getInstance(); 302b154630235935e1aab2a41eff9ed794d40084a02David Brown 303b154630235935e1aab2a41eff9ed794d40084a02David Brown if (app.otaUtils != null) { 304b154630235935e1aab2a41eff9ed794d40084a02David Brown // An OtaUtils instance already exists. 305b154630235935e1aab2a41eff9ed794d40084a02David Brown // TODO: Is this actually an error condition? 306b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "startNonInteractiveOtasp: " 307b154630235935e1aab2a41eff9ed794d40084a02David Brown + "OtaUtils already exists; nuking the old one and starting again..."); 308b154630235935e1aab2a41eff9ed794d40084a02David Brown } 309b154630235935e1aab2a41eff9ed794d40084a02David Brown 310b154630235935e1aab2a41eff9ed794d40084a02David Brown // Create the OtaUtils instance, and indicate we're in 311b154630235935e1aab2a41eff9ed794d40084a02David Brown // "non-interactive mode" by passing in null for 312b154630235935e1aab2a41eff9ed794d40084a02David Brown // inCallScreen / callCard / dialer / etc. 313b154630235935e1aab2a41eff9ed794d40084a02David Brown app.otaUtils = new OtaUtils(context, 314b154630235935e1aab2a41eff9ed794d40084a02David Brown null, null, null, null); 315b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- created OtaUtils: " + app.otaUtils); 316b154630235935e1aab2a41eff9ed794d40084a02David Brown 317b154630235935e1aab2a41eff9ed794d40084a02David Brown // ... and kick off the OTASP call. 31875e3711d82d0c98444f6c438437cad41d862fca6David Brown // TODO(InCallScreen redesign): This should probably go through 31975e3711d82d0c98444f6c438437cad41d862fca6David Brown // the CallController, rather than directly calling 32075e3711d82d0c98444f6c438437cad41d862fca6David Brown // PhoneUtils.placeCall(). 321b154630235935e1aab2a41eff9ed794d40084a02David Brown Phone phone = PhoneApp.getPhone(); 322b154630235935e1aab2a41eff9ed794d40084a02David Brown String number = OTASP_NUMBER_NON_INTERACTIVE; 323b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- placing call to '" + number + "'..."); 324b154630235935e1aab2a41eff9ed794d40084a02David Brown int callStatus = PhoneUtils.placeCall(context, 325b154630235935e1aab2a41eff9ed794d40084a02David Brown phone, 326b154630235935e1aab2a41eff9ed794d40084a02David Brown number, 327b154630235935e1aab2a41eff9ed794d40084a02David Brown null, // contactRef 328b154630235935e1aab2a41eff9ed794d40084a02David Brown false, //isEmergencyCall 329b154630235935e1aab2a41eff9ed794d40084a02David Brown null); // gatewayUri 330b154630235935e1aab2a41eff9ed794d40084a02David Brown 331b154630235935e1aab2a41eff9ed794d40084a02David Brown if (callStatus == PhoneUtils.CALL_STATUS_DIALED) { 332b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log(" ==> successful return from placeCall(): callStatus = " + callStatus); 333b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 334b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "Failure from placeCall() for OTA number '" 335b154630235935e1aab2a41eff9ed794d40084a02David Brown + number + "': code " + callStatus); 336b154630235935e1aab2a41eff9ed794d40084a02David Brown return callStatus; 337b154630235935e1aab2a41eff9ed794d40084a02David Brown } 338b154630235935e1aab2a41eff9ed794d40084a02David Brown 339b154630235935e1aab2a41eff9ed794d40084a02David Brown // TODO: Any other special work to do here? 340b154630235935e1aab2a41eff9ed794d40084a02David Brown // Such as: 341b154630235935e1aab2a41eff9ed794d40084a02David Brown // 342b154630235935e1aab2a41eff9ed794d40084a02David Brown // - manually kick off progress updates, either using TelephonyRegistry 343b154630235935e1aab2a41eff9ed794d40084a02David Brown // or else by sending PendingIntents directly to our caller? 344b154630235935e1aab2a41eff9ed794d40084a02David Brown // 345b154630235935e1aab2a41eff9ed794d40084a02David Brown // - manually silence the in-call audio? (Probably unnecessary 346b154630235935e1aab2a41eff9ed794d40084a02David Brown // if Stingray truly has no audio path from phone baseband 347b154630235935e1aab2a41eff9ed794d40084a02David Brown // to the device's speakers.) 348b154630235935e1aab2a41eff9ed794d40084a02David Brown // 349b154630235935e1aab2a41eff9ed794d40084a02David Brown 350b154630235935e1aab2a41eff9ed794d40084a02David Brown return callStatus; 351b154630235935e1aab2a41eff9ed794d40084a02David Brown } 352b154630235935e1aab2a41eff9ed794d40084a02David Brown 353af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void setSpeaker(boolean state) { 354af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("setSpeaker : " + state ); 355b154630235935e1aab2a41eff9ed794d40084a02David Brown 356b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 357b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("non-interactive mode, ignoring setSpeaker."); 358b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 359b154630235935e1aab2a41eff9ed794d40084a02David Brown } 360b154630235935e1aab2a41eff9ed794d40084a02David Brown 361af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (state == PhoneUtils.isSpeakerOn(mContext)) { 362af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("no change. returning"); 363af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 364af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 365af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 366af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (state && mInCallScreen.isBluetoothAvailable() 367af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville && mInCallScreen.isBluetoothAudioConnected()) { 368af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.disconnectBluetoothAudio(); 369af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 370425b8e3c9846d5e0e76466604b35cad8856d79deEric Laurent PhoneUtils.turnOnSpeaker(mContext, state, true); 371af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 372af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 373af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 374af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle OTA Provision events from Framework. Possible events are: 375af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * OTA Commit Event - OTA provisioning was successful 376af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * SPC retries exceeded - SPC failure retries has exceeded, and Phone needs to 377af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * power down. 378af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 379af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaProvisionStatusChanged(AsyncResult r) { 380af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int OtaStatus[] = (int[]) r.result; 381b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("Provision status event!"); 382b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaProvisionStatusChanged(): status = " 383b154630235935e1aab2a41eff9ed794d40084a02David Brown + OtaStatus[0] + " ==> " + otaProvisionStatusToString(OtaStatus[0])); 384b154630235935e1aab2a41eff9ed794d40084a02David Brown 385b154630235935e1aab2a41eff9ed794d40084a02David Brown // In practice, in a normal successful OTASP call, events come in as follows: 386b154630235935e1aab2a41eff9ed794d40084a02David Brown // - SPL_UNLOCKED within a couple of seconds after the call starts 387b154630235935e1aab2a41eff9ed794d40084a02David Brown // - then a delay of around 45 seconds 388b154630235935e1aab2a41eff9ed794d40084a02David Brown // - then PRL_DOWNLOADED and MDN_DOWNLOADED and COMMITTED within a span of 2 seconds 389af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 390af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville switch(OtaStatus[0]) { 391af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 392b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaProvisionStatusChanged(): RETRIES EXCEEDED"); 393b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 394af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.otaSpcUptime = SystemClock.elapsedRealtime(); 39562995702f659b906127351596305906ccd0d7cb5Freeman Ng if (mInteractive) { 39662995702f659b906127351596305906ccd0d7cb5Freeman Ng otaShowSpcErrorNotice(OTA_SPC_TIMEOUT); 39762995702f659b906127351596305906ccd0d7cb5Freeman Ng } else { 39862995702f659b906127351596305906ccd0d7cb5Freeman Ng sendOtaspResult(OTASP_FAILURE_SPC_RETRIES); 39962995702f659b906127351596305906ccd0d7cb5Freeman Ng } 400af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Power.shutdown(); 401af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 40265336771f727928a14d1d8fe175390ef7a06f71dWink Saville 403af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 40465336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): DONE, isOtaCallCommitted set to true"); 405b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 406b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaProvisionData.isOtaCallCommitted = true; 40765336771f727928a14d1d8fe175390ef7a06f71dWink Saville break; 40865336771f727928a14d1d8fe175390ef7a06f71dWink Saville 40965336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 41065336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 41165336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 41265336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 41365336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 41465336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 41565336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 41665336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 41765336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 41865336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 41965336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): change to ProgressScreen"); 420b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 42165336771f727928a14d1d8fe175390ef7a06f71dWink Saville break; 42265336771f727928a14d1d8fe175390ef7a06f71dWink Saville 42365336771f727928a14d1d8fe175390ef7a06f71dWink Saville default: 42465336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): Ignoring OtaStatus " + OtaStatus[0]); 425af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 426af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 427af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 428af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 429b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 430b154630235935e1aab2a41eff9ed794d40084a02David Brown * Handle a disconnect event from the OTASP call. 431b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 432b154630235935e1aab2a41eff9ed794d40084a02David Brown public void onOtaspDisconnect() { 433b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaspDisconnect()..."); 434b154630235935e1aab2a41eff9ed794d40084a02David Brown // We only handle this event explicitly in non-interactive mode. 435b154630235935e1aab2a41eff9ed794d40084a02David Brown // (In interactive mode, the InCallScreen does any post-disconnect 436b154630235935e1aab2a41eff9ed794d40084a02David Brown // cleanup.) 437b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 438b154630235935e1aab2a41eff9ed794d40084a02David Brown // Send a success or failure indication back to our caller. 439b154630235935e1aab2a41eff9ed794d40084a02David Brown updateNonInteractiveOtaSuccessFailure(); 440b154630235935e1aab2a41eff9ed794d40084a02David Brown } 441b154630235935e1aab2a41eff9ed794d40084a02David Brown } 442b154630235935e1aab2a41eff9ed794d40084a02David Brown 443af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowHome() { 444af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowHome()..."); 445af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 446af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 4474a5a966f0d43e04d336be1b94182346399a931f6Wink Saville mInCallScreen.endInCallScreenSession(); 448af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville Intent intent = new Intent(Intent.ACTION_MAIN); 449af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville intent.addCategory (Intent.CATEGORY_HOME); 450af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 451af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.startActivity(intent); 452af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 453af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 454af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 45513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void otaSkipActivation() { 45613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("otaSkipActivation()..."); 45713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 458b154630235935e1aab2a41eff9ed794d40084a02David Brown sendOtaspResult(OTASP_USER_SKIPPED); 45913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 460b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) mInCallScreen.finish(); 46113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return; 46213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 46313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 464b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 465b154630235935e1aab2a41eff9ed794d40084a02David Brown * Actually initiate the OTASP call. This method is triggered by the 466b154630235935e1aab2a41eff9ed794d40084a02David Brown * onscreen "Activate" button, and is only used in interactive mode. 467b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 46813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void otaPerformActivation() { 46913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("otaPerformActivation()..."); 470b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 471b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 472b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaPerformActivation: not interactive!"); 473b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 474b154630235935e1aab2a41eff9ed794d40084a02David Brown } 475b154630235935e1aab2a41eff9ed794d40084a02David Brown 47613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 47713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng Intent newIntent = new Intent(Intent.ACTION_CALL); 478b154630235935e1aab2a41eff9ed794d40084a02David Brown newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, OTASP_NUMBER); 47975e3711d82d0c98444f6c438437cad41d862fca6David Brown 48075e3711d82d0c98444f6c438437cad41d862fca6David Brown // Initiate the outgoing call: 48175e3711d82d0c98444f6c438437cad41d862fca6David Brown PhoneApp.getInstance().callController.placeCall(newIntent); 48275e3711d82d0c98444f6c438437cad41d862fca6David Brown 48375e3711d82d0c98444f6c438437cad41d862fca6David Brown // ...and get the in-call UI into the right state. 48413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaShowListeningScreen(); 48513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 48613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return; 48713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 48813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 489af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 490af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show Activation Screen when phone powers up and OTA provision is 491af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * required. Also shown when activation fails and user needs 49213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng * to re-attempt it. Contains ACTIVATE and SKIP buttons 49313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng * which allow user to start OTA activation or skip the activation process. 494af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 495af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowActivateScreen() { 496af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowActivationScreen()..."); 497af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.otaShowActivationScreen 498af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == OTA_SHOW_ACTIVATION_SCREEN_ON) { 499af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowActivationScreen(): show activation screen"); 500e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 501af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 50213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setVisibility(mIsWizardMode ? 50357a38778e8c9f58b24cea1062e451934cadc4b3dJim Miller View.VISIBLE : View.INVISIBLE); 504af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.VISIBLE); 505af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.VISIBLE); 506e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } else { 5078df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(true); 508af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 509af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 510af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION; 511af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 512af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowActivationScreen(): show home screen"); 513af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowHome(); 514af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 515af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 516af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 517af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 518af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show "Listen for Instruction" screen during OTA call. Shown when OTA Call 519af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * is initiated and user needs to listen for network instructions and press 520af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * appropriate DTMF digits to proceed to the "Programming in Progress" phase. 521af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 522af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowListeningScreen() { 523b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowListeningScreen()..."); 524b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 525b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 526b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowListeningScreen: not interactive!"); 527b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 528b154630235935e1aab2a41eff9ed794d40084a02David Brown } 529b154630235935e1aab2a41eff9ed794d40084a02David Brown 530af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.otaShowListeningScreen 531af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == OTA_SHOW_LISTENING_SCREEN_ON) { 532af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowListeningScreen(): show listening screen"); 533e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 534af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 5359e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.VISIBLE); 536af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_listen); 537986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaDtmfDialerView.setVisibility(View.VISIBLE); 538af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 539986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 540a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 541a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 542e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } else { 5438df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(true); 544af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 545af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 546af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING; 547af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 548af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Update the state of the in-call menu items. 549af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.updateMenuItems(); 550af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 551af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowListeningScreen(): show progress screen"); 552af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowInProgressScreen(); 553af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 554af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 555af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 556af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 557b154630235935e1aab2a41eff9ed794d40084a02David Brown * Do any necessary updates (of onscreen UI, for example) 558b154630235935e1aab2a41eff9ed794d40084a02David Brown * based on the latest status of the OTASP call. 559b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 560b154630235935e1aab2a41eff9ed794d40084a02David Brown private void updateOtaspProgress() { 561b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("updateOtaspProgress()... mInteractive = " + mInteractive); 562b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) { 563b154630235935e1aab2a41eff9ed794d40084a02David Brown // On regular phones we just call through to 564b154630235935e1aab2a41eff9ed794d40084a02David Brown // otaShowInProgressScreen(), which updates the 565b154630235935e1aab2a41eff9ed794d40084a02David Brown // InCallScreen's onscreen UI. 566b154630235935e1aab2a41eff9ed794d40084a02David Brown otaShowInProgressScreen(); 567b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 568b154630235935e1aab2a41eff9ed794d40084a02David Brown // We're not using the InCallScreen to show OTA progress. 569b154630235935e1aab2a41eff9ed794d40084a02David Brown 570b154630235935e1aab2a41eff9ed794d40084a02David Brown // For now, at least, there's nothing to do here. 571b154630235935e1aab2a41eff9ed794d40084a02David Brown // The overall "success" or "failure" indication we send back 572b154630235935e1aab2a41eff9ed794d40084a02David Brown // (to our caller) is triggered by the DISCONNECT event; 573b154630235935e1aab2a41eff9ed794d40084a02David Brown // see updateNonInteractiveOtaSuccessFailure(). 574b154630235935e1aab2a41eff9ed794d40084a02David Brown 575b154630235935e1aab2a41eff9ed794d40084a02David Brown // But if we ever need to send *intermediate* progress updates back 576b154630235935e1aab2a41eff9ed794d40084a02David Brown // to our caller, we'd do that here, possbily using the same 577b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent that we already use to indicate success or failure. 578b154630235935e1aab2a41eff9ed794d40084a02David Brown } 579b154630235935e1aab2a41eff9ed794d40084a02David Brown } 580b154630235935e1aab2a41eff9ed794d40084a02David Brown 581b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 582b154630235935e1aab2a41eff9ed794d40084a02David Brown * When a non-interactive OTASP call completes, send a success or 583b154630235935e1aab2a41eff9ed794d40084a02David Brown * failure indication back to our caller. 584b154630235935e1aab2a41eff9ed794d40084a02David Brown * 585b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is basically the non-interactive equivalent of 586b154630235935e1aab2a41eff9ed794d40084a02David Brown * otaShowSuccessFailure(). 587b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 588b154630235935e1aab2a41eff9ed794d40084a02David Brown private void updateNonInteractiveOtaSuccessFailure() { 589b154630235935e1aab2a41eff9ed794d40084a02David Brown // This is basically the same logic as otaShowSuccessFailure(): we 590b154630235935e1aab2a41eff9ed794d40084a02David Brown // check the isOtaCallCommitted bit, and if that's true it means 591b154630235935e1aab2a41eff9ed794d40084a02David Brown // that activation was successful. 592b154630235935e1aab2a41eff9ed794d40084a02David Brown 593b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("updateNonInteractiveOtaSuccessFailure(): isOtaCallCommitted = " 594b154630235935e1aab2a41eff9ed794d40084a02David Brown + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 595b154630235935e1aab2a41eff9ed794d40084a02David Brown int resultCode = 596b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaProvisionData.isOtaCallCommitted 597b154630235935e1aab2a41eff9ed794d40084a02David Brown ? OTASP_SUCCESS : OTASP_FAILURE; 598b154630235935e1aab2a41eff9ed794d40084a02David Brown sendOtaspResult(resultCode); 599b154630235935e1aab2a41eff9ed794d40084a02David Brown } 600b154630235935e1aab2a41eff9ed794d40084a02David Brown 601b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 602b154630235935e1aab2a41eff9ed794d40084a02David Brown * Sends the specified OTASP result code back to our caller (presumably 603b154630235935e1aab2a41eff9ed794d40084a02David Brown * SetupWizard) via the PendingIntent that they originally sent along with 604b154630235935e1aab2a41eff9ed794d40084a02David Brown * the ACTION_PERFORM_CDMA_PROVISIONING intent. 605b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 606b154630235935e1aab2a41eff9ed794d40084a02David Brown private void sendOtaspResult(int resultCode) { 607b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("sendOtaspResult: resultCode = " + resultCode); 608b154630235935e1aab2a41eff9ed794d40084a02David Brown 609b154630235935e1aab2a41eff9ed794d40084a02David Brown // Pass the success or failure indication back to our caller by 610b154630235935e1aab2a41eff9ed794d40084a02David Brown // adding an additional extra to the PendingIntent we already 611b154630235935e1aab2a41eff9ed794d40084a02David Brown // have. 612b154630235935e1aab2a41eff9ed794d40084a02David Brown // (NB: there's a PendingIntent send() method that takes a resultCode 613b154630235935e1aab2a41eff9ed794d40084a02David Brown // directly, but we can't use that here since that call is only 614b154630235935e1aab2a41eff9ed794d40084a02David Brown // meaningful for pending intents that are actually used as activity 615b154630235935e1aab2a41eff9ed794d40084a02David Brown // results.) 616b154630235935e1aab2a41eff9ed794d40084a02David Brown 617b154630235935e1aab2a41eff9ed794d40084a02David Brown Intent extraStuff = new Intent(); 618b154630235935e1aab2a41eff9ed794d40084a02David Brown extraStuff.putExtra(EXTRA_OTASP_RESULT_CODE, resultCode); 619b154630235935e1aab2a41eff9ed794d40084a02David Brown // When we call PendingIntent.send() below, the extras from this 620b154630235935e1aab2a41eff9ed794d40084a02David Brown // intent will get merged with any extras already present in 621b154630235935e1aab2a41eff9ed794d40084a02David Brown // cdmaOtaScreenState.otaspResultCodePendingIntent. 622b154630235935e1aab2a41eff9ed794d40084a02David Brown 623b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mApplication.cdmaOtaScreenState == null) { 624b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.e(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: no cdmaOtaScreenState object!"); 625b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 626b154630235935e1aab2a41eff9ed794d40084a02David Brown } 627b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent == null) { 628b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: " 629b154630235935e1aab2a41eff9ed794d40084a02David Brown + "null otaspResultCodePendingIntent!"); 630b154630235935e1aab2a41eff9ed794d40084a02David Brown // This *should* never happen, since SetupWizard always passes this 631b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent along with the ACTION_PERFORM_CDMA_PROVISIONING 632b154630235935e1aab2a41eff9ed794d40084a02David Brown // intent. 633b154630235935e1aab2a41eff9ed794d40084a02David Brown // (But if this happens it's not a fatal error, it just means that 634b154630235935e1aab2a41eff9ed794d40084a02David Brown // our original caller has no way of finding out whether the OTASP 635b154630235935e1aab2a41eff9ed794d40084a02David Brown // call ultimately failed or succeeded...) 636b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 637b154630235935e1aab2a41eff9ed794d40084a02David Brown } 638b154630235935e1aab2a41eff9ed794d40084a02David Brown 639b154630235935e1aab2a41eff9ed794d40084a02David Brown try { 640b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- sendOtaspResult: SENDING PENDING INTENT: " + 641b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent); 642b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent.send( 643b154630235935e1aab2a41eff9ed794d40084a02David Brown mContext, 644b154630235935e1aab2a41eff9ed794d40084a02David Brown 0, /* resultCode (unused) */ 645b154630235935e1aab2a41eff9ed794d40084a02David Brown extraStuff); 646b154630235935e1aab2a41eff9ed794d40084a02David Brown } catch (CanceledException e) { 647b154630235935e1aab2a41eff9ed794d40084a02David Brown // should never happen because no code cancels the pending intent right now, 648b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.e(LOG_TAG, "PendingIntent send() failed: " + e); 649b154630235935e1aab2a41eff9ed794d40084a02David Brown } 650b154630235935e1aab2a41eff9ed794d40084a02David Brown } 651b154630235935e1aab2a41eff9ed794d40084a02David Brown 652b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 653af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show "Programming In Progress" screen during OTA call. Shown when OTA 654af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * provisioning is in progress after user has selected an option. 655af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 656af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowInProgressScreen() { 657b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowInProgressScreen()..."); 658b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 659b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 660b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowInProgressScreen: not interactive!"); 661b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 662b154630235935e1aab2a41eff9ed794d40084a02David Brown } 663b154630235935e1aab2a41eff9ed794d40084a02David Brown 664e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 665af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 6669e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.VISIBLE); 667af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_progress); 668af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setVisibility(View.VISIBLE); 669af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 6709bd141ba20a6cf6dcb745aca6c5c05a9c88f3a98Jim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 671a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 672a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 673e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } else { 6748df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(true); 675af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 676af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 677af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS; 678af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 679af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Update the state of the in-call menu items. 680af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.updateMenuItems(); 681af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 682af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 683af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 684af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming failure dialog when OTA provisioning fails. 685af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * If OTA provisioning attempts fail more than 3 times, then unsuccessful 686af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * dialog is shown. Otherwise a two-second notice is shown with unsuccessful 687af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * information. When notice expires, phone returns to activation screen. 688af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 689986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void otaShowProgramFailure(int length) { 690af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure()..."); 691af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.activationCount++; 692af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if ((mApplication.cdmaOtaProvisionData.activationCount < 693af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivateFailTimes) 694af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville && (mApplication.cdmaOtaConfigData.otaShowActivationScreen == 695af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_SHOW_ACTIVATION_SCREEN_ON)) { 696af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure(): activationCount" 697af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaProvisionData.activationCount); 698af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure(): show failure notice"); 699af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailureNotice(length); 700af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 701af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure(): show failure dialog"); 702af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailureDialog(); 703af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 704af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 705af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 706af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 707af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show either programming success dialog when OTA provisioning succeeds, or 708f0d315541b1b1f33fab5e7952471da6e886b53efWink Saville * programming failure dialog when it fails. See {@link #otaShowProgramFailure} 709af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * for more details. 710af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 711af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowSuccessFailure() { 712b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowSuccessFailure()..."); 713b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 714b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 715b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowSuccessFailure: not interactive!"); 716b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 717b154630235935e1aab2a41eff9ed794d40084a02David Brown } 718b154630235935e1aab2a41eff9ed794d40084a02David Brown 719af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 720af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSuccessFailure(): isOtaCallCommitted" 721af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 722af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.isOtaCallCommitted) { 723af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSuccessFailure(), show success dialog"); 724af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramSuccessDialog(); 725af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 726af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSuccessFailure(), show failure dialog"); 727af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailure(OTA_FAILURE_DIALOG_TIMEOUT); 728af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 729af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 730af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 731af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 732af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 733af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming failure dialog when OTA provisioning fails more than 3 734af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * times. 735af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 736af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramFailureDialog() { 737af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailureDialog()..."); 738af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 739af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 740986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_problem_with_activation); 741af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 742af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_unsuccessful); 743af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 744986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setVisibility(View.VISIBLE); 745af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 746e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 747af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer.closeDialer(false); 748af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 749af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 750af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 751af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 752af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming success dialog when OTA provisioning succeeds. 753af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 754af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramSuccessDialog() { 755af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramSuccessDialog()..."); 756af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 757af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 758986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate_success); 759af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 760af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_successful); 761af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 762986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setVisibility(View.VISIBLE); 763af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 764e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 765af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer.closeDialer(false); 766af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 767af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 768af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 769af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 770af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show SPC failure notice when SPC attempts exceed 15 times. 771af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * During OTA provisioning, if SPC code is incorrect OTA provisioning will 772af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * fail. When SPC attempts are over 15, it shows SPC failure notice for one minute and 773af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * then phone will power down. 774af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 775af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowSpcErrorNotice(int length) { 776af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSpcErrorNotice()..."); 777af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.spcErrorDialog == null) { 778af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.inOtaSpcState = true; 779af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville DialogInterface.OnKeyListener keyListener; 780af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville keyListener = new DialogInterface.OnKeyListener() { 781af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 782af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville log("Ignoring key events..."); 783af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return true; 784af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville }}; 785af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog = new AlertDialog.Builder(mInCallScreen) 786af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setMessage(R.string.ota_spc_failure) 787af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setOnKeyListener(keyListener) 788af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .create(); 789af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.getWindow().addFlags( 790af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 791af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 792af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.show(); 793af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 794e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 795af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer.closeDialer(false); 796af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 797af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long noticeTime = length*1000; 798325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown if (DBG) log("OtaShowSpcErrorNotice(), remaining SPC noticeTime" + noticeTime); 799325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown mInCallScreen.requestCloseSpcErrorNotice(noticeTime); 800af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 801af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 802af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 803af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 804af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * When SPC notice times out, force phone to power down. 805af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 806af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaCloseSpcNotice() { 80717c36a10d09fac3e2312c0bcb839e0a704f42105w if (DBG) log("onOtaCloseSpcNotice(), send shutdown intent"); 80817c36a10d09fac3e2312c0bcb839e0a704f42105w Intent shutdown = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); 80917c36a10d09fac3e2312c0bcb839e0a704f42105w shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM, false); 81017c36a10d09fac3e2312c0bcb839e0a704f42105w shutdown.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 81117c36a10d09fac3e2312c0bcb839e0a704f42105w mContext.startActivity(shutdown); 812af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 813af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 814af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 815af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show two-second notice when OTA provisioning fails and number of failed attempts 816af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * is less then 3. 817af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 818af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramFailureNotice(int length) { 819af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailureNotice()..."); 820af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog == null) { 821af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = new AlertDialog.Builder(mInCallScreen) 822af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setMessage(R.string.ota_failure) 823af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .create(); 824af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.getWindow().addFlags( 825af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 826af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 827af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.show(); 828af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 829af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long noticeTime = length*1000; 830325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown mInCallScreen.requestCloseOtaFailureNotice(noticeTime); 831af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 832af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 833af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 834af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 835af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle OTA unsuccessful notice expiry. Dismisses the 836af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * two-second notice and shows the activation screen. 837af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 838af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaCloseFailureNotice() { 839af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("onOtaCloseFailureNotice()..."); 840af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog != null) { 841af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.dismiss(); 842af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = null; 843af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 844af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateScreen(); 845af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 846af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 847af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 848af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Initialize all OTA UI elements to be gone. Also set inCallPanel, 8498df5c508da2c836b841ee24120fa7c5cc92df387David Brown * callCard and the dialpad handle to be gone. This is called before any OTA screen 850af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * gets drawn. 851af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 852af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaScreenInitialize() { 853b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaScreenInitialize()..."); 854b154630235935e1aab2a41eff9ed794d40084a02David Brown 855b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 856b154630235935e1aab2a41eff9ed794d40084a02David Brown // We should never be doing anything with UI elements in 857b154630235935e1aab2a41eff9ed794d40084a02David Brown // non-interactive mode. 858b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaScreenInitialize: not interactive!"); 859b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 860b154630235935e1aab2a41eff9ed794d40084a02David Brown } 861af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 862af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallPanel != null) mInCallPanel.setVisibility(View.GONE); 863af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mCallCard != null) mCallCard.hideCallCardElements(); 8648df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(false); 865af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 866986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate); 867af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 8689e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.GONE); 869af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 870af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 871af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 872af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 873af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 874986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 875986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.GONE); 876986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 877986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 878af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaCallCardBase.setVisibility(View.VISIBLE); 87913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setVisibility(View.VISIBLE); 880af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 881af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 882af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void hideOtaScreen() { 883af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("hideOtaScreen()..."); 884af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 885af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 886af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 887af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 888af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaCallCardBase.setVisibility(View.GONE); 889af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 890af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 891e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman public boolean isDialerOpened() { 892e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman return (mDialer != null && mDialer.isOpened()); 893e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } 894e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman 895af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 896af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show the appropriate OTA screen based on the current state of OTA call. 897b154630235935e1aab2a41eff9ed794d40084a02David Brown * 898b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is called from the InCallScreen when the screen needs to be 899b154630235935e1aab2a41eff9ed794d40084a02David Brown * refreshed (and thus is only ever used in interactive mode.) 900af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 901af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowProperScreen() { 902af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("otaShowProperScreen()..."); 903b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 904b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 905b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowProperScreen: not interactive!"); 906b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 907b154630235935e1aab2a41eff9ed794d40084a02David Brown } 908b154630235935e1aab2a41eff9ed794d40084a02David Brown 909af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallScreen.isForegroundActivity()) { 910af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("otaShowProperScreen(), OTA is foreground activity, currentstate =" 911af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaScreenState.otaScreenState); 912af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallPanel != null) { 913af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallPanel.setVisibility(View.GONE); 914af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 915af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaScreenState.otaScreenState 916af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION) { 917af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateScreen(); 918af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else if (mApplication.cdmaOtaScreenState.otaScreenState 919af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING) { 920af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowListeningScreen(); 921af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else if (mApplication.cdmaOtaScreenState.otaScreenState 922af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS) { 923af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowInProgressScreen(); 924af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 925af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 926af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 927af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowSpcErrorNotice(getOtaSpcDisplayTime()); 928af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 929af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 930af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 931af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 932af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 933af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Read configuration values for each OTA screen from config.xml. 934af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * These configuration values control visibility of each screen. 935af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 936af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void readXmlSettings() { 937af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings()..."); 938af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.configComplete) { 939af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 940af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 941af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 942af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.configComplete = true; 943af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowActivationScreen = 944af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowActivationScreen); 945af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivationScreen = tmpOtaShowActivationScreen; 946af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaShowActivationScreen" 947af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowActivationScreen); 948af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 949af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowListeningScreen = 950af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowListeningScreen); 951af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowListeningScreen = tmpOtaShowListeningScreen; 952af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaShowListeningScreen" 953af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowListeningScreen); 954af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 955af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowActivateFailTimes = 956af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowActivateFailTimes); 957af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivateFailTimes = tmpOtaShowActivateFailTimes; 958af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaShowActivateFailTimes" 959af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowActivateFailTimes); 960af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 961af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaPlaySuccessFailureTone = 962af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaPlaySuccessFailureTone); 963af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone = tmpOtaPlaySuccessFailureTone; 964af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaPlaySuccessFailureTone" 965af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone); 966af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 967af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 968af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 969af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle the click events for OTA buttons. 970af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 971af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onClickHandler(int id) { 972af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville switch (id) { 973af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaEndButton: 974af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaEndButton(); 975af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 976af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 977af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaSpeakerButton: 978af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaSpeakerButton(); 979af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 980af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 981af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaActivateButton: 982af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaActivateButton(); 983af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 984af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 98513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng case R.id.otaSkipButton: 98613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng onClickOtaActivateSkipButton(); 987af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 988af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 989986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller case R.id.otaNextButton: 990986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller onClickOtaActivateNextButton(); 991af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 992af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 993986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller case R.id.otaTryAgainButton: 994986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller onClickOtaTryAgainButton(); 995af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 996af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 997af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville default: 998af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log ("onClickHandler: received a click event for unrecognized id"); 999af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 1000af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1001af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1002af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1003986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void onClickOtaTryAgainButton() { 1004986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Activation Try Again Clicked!"); 1005986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1006986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller otaShowActivateScreen(); 1007986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller } 1008986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller } 1009986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1010af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaEndButton() { 1011986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Activation End Call Button Clicked!"); 1012af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 10138343169cc89621d46dce86449f5ee1ff5d3a4919John Wang if (PhoneUtils.hangup(mApplication.mCM) == false) { 1014a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // If something went wrong when placing the OTA call, 1015a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // the screen is not updated by the call disconnect 1016a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // handler and we have to do it here 1017a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent setSpeaker(false); 1018a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mInCallScreen.handleOtaCallEnd(); 1019a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent } 1020af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1021af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1022af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1023af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaSpeakerButton() { 1024af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OTA Speaker button Clicked!"); 1025af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1026af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville boolean isChecked = !PhoneUtils.isSpeakerOn(mContext); 1027af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville setSpeaker(isChecked); 1028af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1029af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1030af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1031af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaActivateButton() { 1032af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("Call Activation Clicked!"); 103313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaPerformActivation(); 1034af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1035af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 103613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void onClickOtaActivateSkipButton() { 103713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("Activation Skip Clicked!"); 103813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng DialogInterface.OnKeyListener keyListener; 103913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng keyListener = new DialogInterface.OnKeyListener() { 104013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public boolean onKey(DialogInterface dialog, int keyCode, 104113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng KeyEvent event) { 104213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("Ignoring key events..."); 104313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return true; 104413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 104513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }; 104613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipConfirmationDialog = new AlertDialog.Builder(mInCallScreen) 104713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setTitle(R.string.ota_skip_activation_dialog_title) 104813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setMessage(R.string.ota_skip_activation_dialog_message) 104913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setPositiveButton( 105013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng R.string.ota_skip_activation_dialog_skip_label, 105113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng new AlertDialog.OnClickListener() { 105213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public void onClick(DialogInterface dialog, int which) { 105313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaSkipActivation(); 105413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 105513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }) 105613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setNegativeButton( 105713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng R.string.ota_skip_activation_dialog_continue_label, 105813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng new AlertDialog.OnClickListener() { 105913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public void onClick(DialogInterface dialog, int which) { 106013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaPerformActivation(); 106113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 106213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }) 106313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setOnKeyListener(keyListener) 106413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .create(); 106513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipConfirmationDialog.show(); 1066af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1067af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1068986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void onClickOtaActivateNextButton() { 1069986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Dialog Next Clicked!"); 1070af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1071af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 1072af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 1073af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowHome(); 1074af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1075af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1076af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1077af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void dismissAllOtaDialogs() { 1078af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.spcErrorDialog != null) { 1079af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("- DISMISSING mSpcErrorDialog."); 1080af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.dismiss(); 1081af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog = null; 1082af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1083af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog != null) { 1084af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("- DISMISSING mOtaFailureDialog."); 1085af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.dismiss(); 1086af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = null; 1087af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1088af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1089af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1090af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private int getOtaSpcDisplayTime() { 1091af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("getOtaSpcDisplayTime()..."); 1092af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpSpcTime = 1; 1093af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1094af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long tmpOtaSpcRunningTime = 0; 1095af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long tmpOtaSpcLeftTime = 0; 1096af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcRunningTime = SystemClock.elapsedRealtime(); 1097af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcLeftTime = 1098af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcRunningTime - mApplication.cdmaOtaProvisionData.otaSpcUptime; 109917c36a10d09fac3e2312c0bcb839e0a704f42105w if (tmpOtaSpcLeftTime >= OTA_SPC_TIMEOUT*1000) { 1100af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpSpcTime = 1; 1101af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 1102af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpSpcTime = OTA_SPC_TIMEOUT - (int)tmpOtaSpcLeftTime/1000; 1103af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1104af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1105af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("getOtaSpcDisplayTime(), time for SPC error notice: " + tmpSpcTime); 1106af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return tmpSpcTime; 1107af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1108af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1109af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1110af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Initialize the OTA widgets for all OTA screens. 1111af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1112af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void initOtaInCallScreen() { 1113af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("initOtaInCallScreen()..."); 1114986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle = (TextView) mInCallScreen.findViewById(R.id.otaTitle); 1115af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate = (TextView) mInCallScreen.findViewById(R.id.otaActivate); 1116af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 11179e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer = 11189e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller (ScrollView) mInCallScreen.findViewById(R.id.otaListenProgressContainer); 1119af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress = 1120af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (TextView) mInCallScreen.findViewById(R.id.otaListenProgress); 1121af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar = 1122af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (ProgressBar) mInCallScreen.findViewById(R.id.progress_large); 1123af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setIndeterminate(true); 1124af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail = 1125af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (TextView) mInCallScreen.findViewById(R.id.otaSuccessFailStatus); 1126af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1127af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaCallCardBase = (View) mInCallScreen.findViewById(R.id.otaBase); 1128af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress = 1129af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaListenProgress); 1130af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate = 1131af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaActivate); 1132af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess = 1133af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaFailOrSuccessful); 1134af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1135af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaEndButton = (Button) mInCallScreen.findViewById(R.id.otaEndButton); 1136af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaEndButton.setOnClickListener(mInCallScreen); 1137af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaSpeakerButton = 1138af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (ToggleButton) mInCallScreen.findViewById(R.id.otaSpeakerButton); 1139af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaSpeakerButton.setOnClickListener(mInCallScreen); 1140af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaActivateButton = 1141af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (Button) mInCallScreen.findViewById(R.id.otaActivateButton); 1142af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaActivateButton.setOnClickListener(mInCallScreen); 114313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton = (Button) mInCallScreen.findViewById(R.id.otaSkipButton); 114413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setOnClickListener(mInCallScreen); 1145986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton = (Button) mInCallScreen.findViewById(R.id.otaNextButton); 1146986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setOnClickListener(mInCallScreen); 1147986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton = 1148986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller (Button) mInCallScreen.findViewById(R.id.otaTryAgainButton); 1149986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setOnClickListener(mInCallScreen); 1150a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 1151dfa83d531cdb88513f09e913424b7a16628b37d3David Brown mOtaWidgetData.otaDtmfDialerView = 1152dfa83d531cdb88513f09e913424b7a16628b37d3David Brown (DTMFTwelveKeyDialerView) mInCallScreen.findViewById(R.id.otaDtmfDialer); 1153dfa83d531cdb88513f09e913424b7a16628b37d3David Brown // Sanity-check: the otaDtmfDialer widget should *always* be present. 1154dfa83d531cdb88513f09e913424b7a16628b37d3David Brown if (mOtaWidgetData.otaDtmfDialerView == null) { 1155dfa83d531cdb88513f09e913424b7a16628b37d3David Brown Log.e(LOG_TAG, "onCreate: couldn't find otaDtmfDialer", new IllegalStateException()); 1156af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 11572f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11582f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11592f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // Create a new DTMFTwelveKeyDialer instance purely for use by the 11602f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // DTMFTwelveKeyDialerView ("otaDtmfDialerView") that comes from 11612f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // otacall_card.xml. 11622f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // (But note that mDialer is a separate DTMFTwelveKeyDialer 11632f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // instance, that belongs to the InCallScreen. This is confusing; 11642f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // see the TODO comment above.) 11652f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaCallCardDtmfDialer = new DTMFTwelveKeyDialer(mInCallScreen, 11662f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaWidgetData.otaDtmfDialerView, 11672f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown null /* no SlidingDrawer used here */); 11682f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11692f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // Initialize the new DTMFTwelveKeyDialer instance. This is 11702f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // needed to play local DTMF tones. 11712f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaCallCardDtmfDialer.startDialerSession(); 11722f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11732f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaWidgetData.otaDtmfDialerView.setDialer(mOtaCallCardDtmfDialer); 1174af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1175af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1176af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1177af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Clear out all OTA UI widget elements. Needs to get called 1178af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * when OTA call ends or InCallScreen is destroyed. 11794a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * @param disableSpeaker parameter control whether Speaker should be turned off. 1180af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 11814a5a966f0d43e04d336be1b94182346399a931f6Wink Saville public void cleanOtaScreen(boolean disableSpeaker) { 1182af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OTA ends, cleanOtaScreen!"); 1183af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1184986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaScreenState.otaScreenState = 1185986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 1186986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.isOtaCallCommitted = false; 1187986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 1188986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.inOtaSpcState = false; 1189986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.activationCount = 0; 1190986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.otaSpcUptime = 0; 11915c0517ae3c17505ffd466be79ab0026b7fe6c959Wink Saville mApplication.cdmaOtaInCallScreenUiState.state = State.UNDEFINED; 1192986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1193b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) { 1194b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInCallPanel != null) mInCallPanel.setVisibility(View.VISIBLE); 1195b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mCallCard != null) mCallCard.hideCallCardElements(); 1196b154630235935e1aab2a41eff9ed794d40084a02David Brown mDialer.setHandleVisible(true); 1197986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1198b154630235935e1aab2a41eff9ed794d40084a02David Brown // Free resources from the DTMFTwelveKeyDialer instance we created 1199b154630235935e1aab2a41eff9ed794d40084a02David Brown // in initOtaInCallScreen(). 1200b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mOtaCallCardDtmfDialer != null) { 1201b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaCallCardDtmfDialer.stopDialerSession(); 1202b154630235935e1aab2a41eff9ed794d40084a02David Brown } 12032f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 1204b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 1205b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.GONE); 1206b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 1207b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 1208b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 1209b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 1210b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 1211b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaCallCardBase.setVisibility(View.GONE); 1212b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 1213b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 1214b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 1215b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1216a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 1217a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // turn off the speaker in case it was turned on 1218a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // but the OTA call could not be completed 12194a5a966f0d43e04d336be1b94182346399a931f6Wink Saville if (disableSpeaker) { 12204a5a966f0d43e04d336be1b94182346399a931f6Wink Saville setSpeaker(false); 12214a5a966f0d43e04d336be1b94182346399a931f6Wink Saville } 1222af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1223af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1224af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1225af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Defines OTA information that needs to be maintained during 1226af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * an OTA call when display orientation changes. 1227af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1228af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaProvisionData { 1229af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean isOtaCallCommitted; 1230af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean isOtaCallIntentProcessed; 1231af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean inOtaSpcState; 1232af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int activationCount; 1233af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public long otaSpcUptime; 1234af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1235af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1236af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1237af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Defines OTA screen configuration items read from config.xml 1238af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * and used to control OTA display. 1239af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1240af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaConfigData { 1241af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowActivationScreen; 1242af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowListeningScreen; 1243af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowActivateFailTimes; 1244af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaPlaySuccessFailureTone; 1245af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean configComplete; 1246af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public CdmaOtaConfigData() { 1247af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("CdmaOtaConfigData constructor!"); 1248af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivationScreen = OTA_SHOW_ACTIVATION_SCREEN_OFF; 1249af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowListeningScreen = OTA_SHOW_LISTENING_SCREEN_OFF; 1250af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateFailTimes = OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF; 1251af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaPlaySuccessFailureTone = OTA_PLAY_SUCCESS_FAILURE_TONE_OFF; 1252af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1253af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1254af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1255af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1256f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * The state of the OTA InCallScreen UI. 1257f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1258f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public static class CdmaOtaInCallScreenUiState { 1259f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public enum State { 1260f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville UNDEFINED, 1261f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville NORMAL, 1262f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville ENDED 1263f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1264f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1265f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public State state; 1266f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1267f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public CdmaOtaInCallScreenUiState() { 1268f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville if (DBG) log("CdmaOtaInCallScreenState: constructor init to UNDEFINED"); 1269f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville state = CdmaOtaInCallScreenUiState.State.UNDEFINED; 1270f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1271f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1272f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1273f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1274f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * Save the Ota InCallScreen UI state 1275f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1276f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public void setCdmaOtaInCallScreenUiState(CdmaOtaInCallScreenUiState.State state) { 1277f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville if (DBG) log("setCdmaOtaInCallScreenState: " + state); 1278f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville mApplication.cdmaOtaInCallScreenUiState.state = state; 1279f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1280f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1281f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1282f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * Get the Ota InCallScreen UI state 1283f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1284f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public CdmaOtaInCallScreenUiState.State getCdmaOtaInCallScreenUiState() { 1285b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("getCdmaOtaInCallScreenState: " 1286b154630235935e1aab2a41eff9ed794d40084a02David Brown + mApplication.cdmaOtaInCallScreenUiState.state); 1287f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville return mApplication.cdmaOtaInCallScreenUiState.state; 1288f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1289f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1290f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1291af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * The OTA screen state machine. 1292af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1293af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaScreenState { 1294af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public enum OtaScreenState { 1295af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_UNDEFINED, 1296af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_ACTIVATION, 1297af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_LISTENING, 1298af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_PROGRESS, 1299af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_SUCCESS_FAILURE_DLG 1300af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1301af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1302af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public OtaScreenState otaScreenState; 1303af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1304af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public CdmaOtaScreenState() { 1305af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenState = OtaScreenState.OTA_STATUS_UNDEFINED; 1306af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1307b154630235935e1aab2a41eff9ed794d40084a02David Brown 1308b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent used to report an OTASP result status code back 1309b154630235935e1aab2a41eff9ed794d40084a02David Brown // to our caller. 1310b154630235935e1aab2a41eff9ed794d40084a02David Brown // 1311b154630235935e1aab2a41eff9ed794d40084a02David Brown // Our caller (presumably SetupWizard) creates this PendingIntent, 1312b154630235935e1aab2a41eff9ed794d40084a02David Brown // pointing back at itself, and passes it along as an extra with the 1313b154630235935e1aab2a41eff9ed794d40084a02David Brown // ACTION_PERFORM_CDMA_PROVISIONING intent. Then, when there's an 1314b154630235935e1aab2a41eff9ed794d40084a02David Brown // OTASP result to report, we send that PendingIntent back, adding an 1315b154630235935e1aab2a41eff9ed794d40084a02David Brown // extra called EXTRA_OTASP_RESULT_CODE to indicate the result. 1316b154630235935e1aab2a41eff9ed794d40084a02David Brown // 1317b154630235935e1aab2a41eff9ed794d40084a02David Brown // Possible result values are the OTASP_RESULT_* constants. 1318b154630235935e1aab2a41eff9ed794d40084a02David Brown public PendingIntent otaspResultCodePendingIntent; 1319b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1320b154630235935e1aab2a41eff9ed794d40084a02David Brown 1321b154630235935e1aab2a41eff9ed794d40084a02David Brown /** @see com.android.internal.telephony.Phone */ 1322b154630235935e1aab2a41eff9ed794d40084a02David Brown private static String otaProvisionStatusToString(int status) { 1323b154630235935e1aab2a41eff9ed794d40084a02David Brown switch (status) { 1324b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 1325b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SPL_UNLOCKED"; 1326b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 1327b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SPC_RETRIES_EXCEEDED"; 1328b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 1329b154630235935e1aab2a41eff9ed794d40084a02David Brown return "A_KEY_EXCHANGED"; 1330b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 1331b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SSD_UPDATED"; 1332b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 1333b154630235935e1aab2a41eff9ed794d40084a02David Brown return "NAM_DOWNLOADED"; 1334b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 1335b154630235935e1aab2a41eff9ed794d40084a02David Brown return "MDN_DOWNLOADED"; 1336b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 1337b154630235935e1aab2a41eff9ed794d40084a02David Brown return "IMSI_DOWNLOADED"; 1338b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 1339b154630235935e1aab2a41eff9ed794d40084a02David Brown return "PRL_DOWNLOADED"; 1340b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 1341b154630235935e1aab2a41eff9ed794d40084a02David Brown return "COMMITTED"; 1342b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 1343b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_STARTED"; 1344b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 1345b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_STOPPED"; 1346b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 1347b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_ABORTED"; 1348b154630235935e1aab2a41eff9ed794d40084a02David Brown default: 1349b154630235935e1aab2a41eff9ed794d40084a02David Brown return "<unknown status" + status + ">"; 1350b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1351af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1352af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1353af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private static void log(String msg) { 1354af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville Log.d(LOG_TAG, msg); 1355af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1356839b14d460986608fe577f89f789de854dc85b58Jim Miller 1357d3a8a3a138614071a7a8020e1579048c411abd78Wink Saville private static boolean isCdmaPhone() { 1358d3a8a3a138614071a7a8020e1579048c411abd78Wink Saville return (PhoneApp.getPhone().getPhoneType() == Phone.PHONE_TYPE_CDMA); 1359839b14d460986608fe577f89f789de854dc85b58Jim Miller } 1360af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville} 1361