OtaUtils.java revision 75e3711d82d0c98444f6c438437cad41d862fca6
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; 259b154630235935e1aab2a41eff9ed794d40084a02David Brown Intent newIntent = new Intent(ACTION_PERFORM_CDMA_PROVISIONING); 260b154630235935e1aab2a41eff9ed794d40084a02David Brown newIntent.setClass(context, InCallScreen.class); 261b154630235935e1aab2a41eff9ed794d40084a02David Brown newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 262b154630235935e1aab2a41eff9ed794d40084a02David Brown mIsWizardMode = false; 263b154630235935e1aab2a41eff9ed794d40084a02David Brown context.startActivity(newIntent); 264b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("maybeDoOtaCall: voice capable; activation intent sent."); 265b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 266b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("maybeDoOtaCall: voice capable; activation intent NOT sent."); 267b154630235935e1aab2a41eff9ed794d40084a02David Brown } 268839b14d460986608fe577f89f789de854dc85b58Jim Miller } else { 269b154630235935e1aab2a41eff9ed794d40084a02David Brown if (phoneNeedsActivation) { 270d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 271d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng Intent newIntent = new Intent(ACTION_PERFORM_VOICELESS_CDMA_PROVISIONING); 272d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2730c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng newIntent.putExtra(EXTRA_VOICELESS_PROVISIONING_OFFER_DONTSHOW, true); 274d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng context.startActivity(newIntent); 275d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng if (DBG) log("maybeDoOtaCall: non-interactive; activation intent sent."); 276b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 277d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng if (DBG) log("maybeDoOtaCall: non-interactive, no need for OTASP."); 278b154630235935e1aab2a41eff9ed794d40084a02David Brown } 279839b14d460986608fe577f89f789de854dc85b58Jim Miller } 280839b14d460986608fe577f89f789de854dc85b58Jim Miller return true; 281839b14d460986608fe577f89f789de854dc85b58Jim Miller } 282af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 283b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 284b154630235935e1aab2a41eff9ed794d40084a02David Brown * Starts the OTASP call *without* involving the InCallScreen or 285b154630235935e1aab2a41eff9ed794d40084a02David Brown * displaying any UI. 286b154630235935e1aab2a41eff9ed794d40084a02David Brown * 287b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is used on data-only devices, which don't support any kind of 288b154630235935e1aab2a41eff9ed794d40084a02David Brown * in-call phone UI. 289b154630235935e1aab2a41eff9ed794d40084a02David Brown * 290b154630235935e1aab2a41eff9ed794d40084a02David Brown * @return PhoneUtils.CALL_STATUS_DIALED if we successfully 291b154630235935e1aab2a41eff9ed794d40084a02David Brown * dialed the OTASP number, or one of the other 292b154630235935e1aab2a41eff9ed794d40084a02David Brown * CALL_STATUS_* constants if there was a failure. 293b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 294b154630235935e1aab2a41eff9ed794d40084a02David Brown public static int startNonInteractiveOtasp(Context context) { 295b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("startNonInteractiveOtasp()..."); 296b154630235935e1aab2a41eff9ed794d40084a02David Brown PhoneApp app = PhoneApp.getInstance(); 297b154630235935e1aab2a41eff9ed794d40084a02David Brown 298b154630235935e1aab2a41eff9ed794d40084a02David Brown if (app.otaUtils != null) { 299b154630235935e1aab2a41eff9ed794d40084a02David Brown // An OtaUtils instance already exists. 300b154630235935e1aab2a41eff9ed794d40084a02David Brown // TODO: Is this actually an error condition? 301b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "startNonInteractiveOtasp: " 302b154630235935e1aab2a41eff9ed794d40084a02David Brown + "OtaUtils already exists; nuking the old one and starting again..."); 303b154630235935e1aab2a41eff9ed794d40084a02David Brown } 304b154630235935e1aab2a41eff9ed794d40084a02David Brown 305b154630235935e1aab2a41eff9ed794d40084a02David Brown // Create the OtaUtils instance, and indicate we're in 306b154630235935e1aab2a41eff9ed794d40084a02David Brown // "non-interactive mode" by passing in null for 307b154630235935e1aab2a41eff9ed794d40084a02David Brown // inCallScreen / callCard / dialer / etc. 308b154630235935e1aab2a41eff9ed794d40084a02David Brown app.otaUtils = new OtaUtils(context, 309b154630235935e1aab2a41eff9ed794d40084a02David Brown null, null, null, null); 310b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- created OtaUtils: " + app.otaUtils); 311b154630235935e1aab2a41eff9ed794d40084a02David Brown 312b154630235935e1aab2a41eff9ed794d40084a02David Brown // ... and kick off the OTASP call. 31375e3711d82d0c98444f6c438437cad41d862fca6David Brown // TODO(InCallScreen redesign): This should probably go through 31475e3711d82d0c98444f6c438437cad41d862fca6David Brown // the CallController, rather than directly calling 31575e3711d82d0c98444f6c438437cad41d862fca6David Brown // PhoneUtils.placeCall(). 316b154630235935e1aab2a41eff9ed794d40084a02David Brown Phone phone = PhoneApp.getPhone(); 317b154630235935e1aab2a41eff9ed794d40084a02David Brown String number = OTASP_NUMBER_NON_INTERACTIVE; 318b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- placing call to '" + number + "'..."); 319b154630235935e1aab2a41eff9ed794d40084a02David Brown int callStatus = PhoneUtils.placeCall(context, 320b154630235935e1aab2a41eff9ed794d40084a02David Brown phone, 321b154630235935e1aab2a41eff9ed794d40084a02David Brown number, 322b154630235935e1aab2a41eff9ed794d40084a02David Brown null, // contactRef 323b154630235935e1aab2a41eff9ed794d40084a02David Brown false, //isEmergencyCall 324b154630235935e1aab2a41eff9ed794d40084a02David Brown null); // gatewayUri 325b154630235935e1aab2a41eff9ed794d40084a02David Brown 326b154630235935e1aab2a41eff9ed794d40084a02David Brown if (callStatus == PhoneUtils.CALL_STATUS_DIALED) { 327b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log(" ==> successful return from placeCall(): callStatus = " + callStatus); 328b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 329b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "Failure from placeCall() for OTA number '" 330b154630235935e1aab2a41eff9ed794d40084a02David Brown + number + "': code " + callStatus); 331b154630235935e1aab2a41eff9ed794d40084a02David Brown return callStatus; 332b154630235935e1aab2a41eff9ed794d40084a02David Brown } 333b154630235935e1aab2a41eff9ed794d40084a02David Brown 334b154630235935e1aab2a41eff9ed794d40084a02David Brown // TODO: Any other special work to do here? 335b154630235935e1aab2a41eff9ed794d40084a02David Brown // Such as: 336b154630235935e1aab2a41eff9ed794d40084a02David Brown // 337b154630235935e1aab2a41eff9ed794d40084a02David Brown // - manually kick off progress updates, either using TelephonyRegistry 338b154630235935e1aab2a41eff9ed794d40084a02David Brown // or else by sending PendingIntents directly to our caller? 339b154630235935e1aab2a41eff9ed794d40084a02David Brown // 340b154630235935e1aab2a41eff9ed794d40084a02David Brown // - manually silence the in-call audio? (Probably unnecessary 341b154630235935e1aab2a41eff9ed794d40084a02David Brown // if Stingray truly has no audio path from phone baseband 342b154630235935e1aab2a41eff9ed794d40084a02David Brown // to the device's speakers.) 343b154630235935e1aab2a41eff9ed794d40084a02David Brown // 344b154630235935e1aab2a41eff9ed794d40084a02David Brown 345b154630235935e1aab2a41eff9ed794d40084a02David Brown return callStatus; 346b154630235935e1aab2a41eff9ed794d40084a02David Brown } 347b154630235935e1aab2a41eff9ed794d40084a02David Brown 348af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void setSpeaker(boolean state) { 349af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("setSpeaker : " + state ); 350b154630235935e1aab2a41eff9ed794d40084a02David Brown 351b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 352b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("non-interactive mode, ignoring setSpeaker."); 353b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 354b154630235935e1aab2a41eff9ed794d40084a02David Brown } 355b154630235935e1aab2a41eff9ed794d40084a02David Brown 356af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (state == PhoneUtils.isSpeakerOn(mContext)) { 357af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("no change. returning"); 358af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 359af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 360af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 361af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (state && mInCallScreen.isBluetoothAvailable() 362af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville && mInCallScreen.isBluetoothAudioConnected()) { 363af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.disconnectBluetoothAudio(); 364af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 365425b8e3c9846d5e0e76466604b35cad8856d79deEric Laurent PhoneUtils.turnOnSpeaker(mContext, state, true); 366af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 367af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 368af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 369af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle OTA Provision events from Framework. Possible events are: 370af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * OTA Commit Event - OTA provisioning was successful 371af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * SPC retries exceeded - SPC failure retries has exceeded, and Phone needs to 372af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * power down. 373af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 374af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaProvisionStatusChanged(AsyncResult r) { 375af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int OtaStatus[] = (int[]) r.result; 376b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("Provision status event!"); 377b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaProvisionStatusChanged(): status = " 378b154630235935e1aab2a41eff9ed794d40084a02David Brown + OtaStatus[0] + " ==> " + otaProvisionStatusToString(OtaStatus[0])); 379b154630235935e1aab2a41eff9ed794d40084a02David Brown 380b154630235935e1aab2a41eff9ed794d40084a02David Brown // In practice, in a normal successful OTASP call, events come in as follows: 381b154630235935e1aab2a41eff9ed794d40084a02David Brown // - SPL_UNLOCKED within a couple of seconds after the call starts 382b154630235935e1aab2a41eff9ed794d40084a02David Brown // - then a delay of around 45 seconds 383b154630235935e1aab2a41eff9ed794d40084a02David Brown // - then PRL_DOWNLOADED and MDN_DOWNLOADED and COMMITTED within a span of 2 seconds 384af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 385af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville switch(OtaStatus[0]) { 386af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 387b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaProvisionStatusChanged(): RETRIES EXCEEDED"); 388b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 389af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.otaSpcUptime = SystemClock.elapsedRealtime(); 39062995702f659b906127351596305906ccd0d7cb5Freeman Ng if (mInteractive) { 39162995702f659b906127351596305906ccd0d7cb5Freeman Ng otaShowSpcErrorNotice(OTA_SPC_TIMEOUT); 39262995702f659b906127351596305906ccd0d7cb5Freeman Ng } else { 39362995702f659b906127351596305906ccd0d7cb5Freeman Ng sendOtaspResult(OTASP_FAILURE_SPC_RETRIES); 39462995702f659b906127351596305906ccd0d7cb5Freeman Ng } 395af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Power.shutdown(); 396af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 39765336771f727928a14d1d8fe175390ef7a06f71dWink Saville 398af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 39965336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): DONE, isOtaCallCommitted set to true"); 400b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 401b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaProvisionData.isOtaCallCommitted = true; 40265336771f727928a14d1d8fe175390ef7a06f71dWink Saville break; 40365336771f727928a14d1d8fe175390ef7a06f71dWink Saville 40465336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 40565336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 40665336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 40765336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 40865336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 40965336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 41065336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 41165336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 41265336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 41365336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 41465336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): change to ProgressScreen"); 415b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 41665336771f727928a14d1d8fe175390ef7a06f71dWink Saville break; 41765336771f727928a14d1d8fe175390ef7a06f71dWink Saville 41865336771f727928a14d1d8fe175390ef7a06f71dWink Saville default: 41965336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): Ignoring OtaStatus " + OtaStatus[0]); 420af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 421af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 422af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 423af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 424b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 425b154630235935e1aab2a41eff9ed794d40084a02David Brown * Handle a disconnect event from the OTASP call. 426b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 427b154630235935e1aab2a41eff9ed794d40084a02David Brown public void onOtaspDisconnect() { 428b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaspDisconnect()..."); 429b154630235935e1aab2a41eff9ed794d40084a02David Brown // We only handle this event explicitly in non-interactive mode. 430b154630235935e1aab2a41eff9ed794d40084a02David Brown // (In interactive mode, the InCallScreen does any post-disconnect 431b154630235935e1aab2a41eff9ed794d40084a02David Brown // cleanup.) 432b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 433b154630235935e1aab2a41eff9ed794d40084a02David Brown // Send a success or failure indication back to our caller. 434b154630235935e1aab2a41eff9ed794d40084a02David Brown updateNonInteractiveOtaSuccessFailure(); 435b154630235935e1aab2a41eff9ed794d40084a02David Brown } 436b154630235935e1aab2a41eff9ed794d40084a02David Brown } 437b154630235935e1aab2a41eff9ed794d40084a02David Brown 438af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowHome() { 439af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowHome()..."); 440af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 441af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 4424a5a966f0d43e04d336be1b94182346399a931f6Wink Saville mInCallScreen.endInCallScreenSession(); 443af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville Intent intent = new Intent(Intent.ACTION_MAIN); 444af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville intent.addCategory (Intent.CATEGORY_HOME); 445af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 446af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.startActivity(intent); 447af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 448af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 449af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 45013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void otaSkipActivation() { 45113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("otaSkipActivation()..."); 45213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 453b154630235935e1aab2a41eff9ed794d40084a02David Brown sendOtaspResult(OTASP_USER_SKIPPED); 45413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 455b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) mInCallScreen.finish(); 45613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return; 45713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 45813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 459b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 460b154630235935e1aab2a41eff9ed794d40084a02David Brown * Actually initiate the OTASP call. This method is triggered by the 461b154630235935e1aab2a41eff9ed794d40084a02David Brown * onscreen "Activate" button, and is only used in interactive mode. 462b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 46313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void otaPerformActivation() { 46413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("otaPerformActivation()..."); 465b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 466b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 467b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaPerformActivation: not interactive!"); 468b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 469b154630235935e1aab2a41eff9ed794d40084a02David Brown } 470b154630235935e1aab2a41eff9ed794d40084a02David Brown 47113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 47213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng Intent newIntent = new Intent(Intent.ACTION_CALL); 473b154630235935e1aab2a41eff9ed794d40084a02David Brown newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, OTASP_NUMBER); 47475e3711d82d0c98444f6c438437cad41d862fca6David Brown 47575e3711d82d0c98444f6c438437cad41d862fca6David Brown // Initiate the outgoing call: 47675e3711d82d0c98444f6c438437cad41d862fca6David Brown PhoneApp.getInstance().callController.placeCall(newIntent); 47775e3711d82d0c98444f6c438437cad41d862fca6David Brown 47875e3711d82d0c98444f6c438437cad41d862fca6David Brown // ...and get the in-call UI into the right state. 47913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaShowListeningScreen(); 48013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 48113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return; 48213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 48313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 484af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 485af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show Activation Screen when phone powers up and OTA provision is 486af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * required. Also shown when activation fails and user needs 48713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng * to re-attempt it. Contains ACTIVATE and SKIP buttons 48813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng * which allow user to start OTA activation or skip the activation process. 489af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 490af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowActivateScreen() { 491af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowActivationScreen()..."); 492af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.otaShowActivationScreen 493af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == OTA_SHOW_ACTIVATION_SCREEN_ON) { 494af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowActivationScreen(): show activation screen"); 495e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 496af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 49713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setVisibility(mIsWizardMode ? 49857a38778e8c9f58b24cea1062e451934cadc4b3dJim Miller View.VISIBLE : View.INVISIBLE); 499af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.VISIBLE); 500af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.VISIBLE); 501e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } else { 5028df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(true); 503af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 504af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 505af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION; 506af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 507af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowActivationScreen(): show home screen"); 508af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowHome(); 509af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 510af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 511af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 512af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 513af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show "Listen for Instruction" screen during OTA call. Shown when OTA Call 514af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * is initiated and user needs to listen for network instructions and press 515af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * appropriate DTMF digits to proceed to the "Programming in Progress" phase. 516af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 517af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowListeningScreen() { 518b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowListeningScreen()..."); 519b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 520b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 521b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowListeningScreen: not interactive!"); 522b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 523b154630235935e1aab2a41eff9ed794d40084a02David Brown } 524b154630235935e1aab2a41eff9ed794d40084a02David Brown 525af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.otaShowListeningScreen 526af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == OTA_SHOW_LISTENING_SCREEN_ON) { 527af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowListeningScreen(): show listening screen"); 528e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 529af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 5309e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.VISIBLE); 531af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_listen); 532986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaDtmfDialerView.setVisibility(View.VISIBLE); 533af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 534986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 535a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 536a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 537e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } else { 5388df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(true); 539af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 540af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 541af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING; 542af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 543af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Update the state of the in-call menu items. 544af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.updateMenuItems(); 545af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 546af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowListeningScreen(): show progress screen"); 547af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowInProgressScreen(); 548af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 549af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 550af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 551af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 552b154630235935e1aab2a41eff9ed794d40084a02David Brown * Do any necessary updates (of onscreen UI, for example) 553b154630235935e1aab2a41eff9ed794d40084a02David Brown * based on the latest status of the OTASP call. 554b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 555b154630235935e1aab2a41eff9ed794d40084a02David Brown private void updateOtaspProgress() { 556b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("updateOtaspProgress()... mInteractive = " + mInteractive); 557b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) { 558b154630235935e1aab2a41eff9ed794d40084a02David Brown // On regular phones we just call through to 559b154630235935e1aab2a41eff9ed794d40084a02David Brown // otaShowInProgressScreen(), which updates the 560b154630235935e1aab2a41eff9ed794d40084a02David Brown // InCallScreen's onscreen UI. 561b154630235935e1aab2a41eff9ed794d40084a02David Brown otaShowInProgressScreen(); 562b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 563b154630235935e1aab2a41eff9ed794d40084a02David Brown // We're not using the InCallScreen to show OTA progress. 564b154630235935e1aab2a41eff9ed794d40084a02David Brown 565b154630235935e1aab2a41eff9ed794d40084a02David Brown // For now, at least, there's nothing to do here. 566b154630235935e1aab2a41eff9ed794d40084a02David Brown // The overall "success" or "failure" indication we send back 567b154630235935e1aab2a41eff9ed794d40084a02David Brown // (to our caller) is triggered by the DISCONNECT event; 568b154630235935e1aab2a41eff9ed794d40084a02David Brown // see updateNonInteractiveOtaSuccessFailure(). 569b154630235935e1aab2a41eff9ed794d40084a02David Brown 570b154630235935e1aab2a41eff9ed794d40084a02David Brown // But if we ever need to send *intermediate* progress updates back 571b154630235935e1aab2a41eff9ed794d40084a02David Brown // to our caller, we'd do that here, possbily using the same 572b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent that we already use to indicate success or failure. 573b154630235935e1aab2a41eff9ed794d40084a02David Brown } 574b154630235935e1aab2a41eff9ed794d40084a02David Brown } 575b154630235935e1aab2a41eff9ed794d40084a02David Brown 576b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 577b154630235935e1aab2a41eff9ed794d40084a02David Brown * When a non-interactive OTASP call completes, send a success or 578b154630235935e1aab2a41eff9ed794d40084a02David Brown * failure indication back to our caller. 579b154630235935e1aab2a41eff9ed794d40084a02David Brown * 580b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is basically the non-interactive equivalent of 581b154630235935e1aab2a41eff9ed794d40084a02David Brown * otaShowSuccessFailure(). 582b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 583b154630235935e1aab2a41eff9ed794d40084a02David Brown private void updateNonInteractiveOtaSuccessFailure() { 584b154630235935e1aab2a41eff9ed794d40084a02David Brown // This is basically the same logic as otaShowSuccessFailure(): we 585b154630235935e1aab2a41eff9ed794d40084a02David Brown // check the isOtaCallCommitted bit, and if that's true it means 586b154630235935e1aab2a41eff9ed794d40084a02David Brown // that activation was successful. 587b154630235935e1aab2a41eff9ed794d40084a02David Brown 588b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("updateNonInteractiveOtaSuccessFailure(): isOtaCallCommitted = " 589b154630235935e1aab2a41eff9ed794d40084a02David Brown + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 590b154630235935e1aab2a41eff9ed794d40084a02David Brown int resultCode = 591b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaProvisionData.isOtaCallCommitted 592b154630235935e1aab2a41eff9ed794d40084a02David Brown ? OTASP_SUCCESS : OTASP_FAILURE; 593b154630235935e1aab2a41eff9ed794d40084a02David Brown sendOtaspResult(resultCode); 594b154630235935e1aab2a41eff9ed794d40084a02David Brown } 595b154630235935e1aab2a41eff9ed794d40084a02David Brown 596b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 597b154630235935e1aab2a41eff9ed794d40084a02David Brown * Sends the specified OTASP result code back to our caller (presumably 598b154630235935e1aab2a41eff9ed794d40084a02David Brown * SetupWizard) via the PendingIntent that they originally sent along with 599b154630235935e1aab2a41eff9ed794d40084a02David Brown * the ACTION_PERFORM_CDMA_PROVISIONING intent. 600b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 601b154630235935e1aab2a41eff9ed794d40084a02David Brown private void sendOtaspResult(int resultCode) { 602b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("sendOtaspResult: resultCode = " + resultCode); 603b154630235935e1aab2a41eff9ed794d40084a02David Brown 604b154630235935e1aab2a41eff9ed794d40084a02David Brown // Pass the success or failure indication back to our caller by 605b154630235935e1aab2a41eff9ed794d40084a02David Brown // adding an additional extra to the PendingIntent we already 606b154630235935e1aab2a41eff9ed794d40084a02David Brown // have. 607b154630235935e1aab2a41eff9ed794d40084a02David Brown // (NB: there's a PendingIntent send() method that takes a resultCode 608b154630235935e1aab2a41eff9ed794d40084a02David Brown // directly, but we can't use that here since that call is only 609b154630235935e1aab2a41eff9ed794d40084a02David Brown // meaningful for pending intents that are actually used as activity 610b154630235935e1aab2a41eff9ed794d40084a02David Brown // results.) 611b154630235935e1aab2a41eff9ed794d40084a02David Brown 612b154630235935e1aab2a41eff9ed794d40084a02David Brown Intent extraStuff = new Intent(); 613b154630235935e1aab2a41eff9ed794d40084a02David Brown extraStuff.putExtra(EXTRA_OTASP_RESULT_CODE, resultCode); 614b154630235935e1aab2a41eff9ed794d40084a02David Brown // When we call PendingIntent.send() below, the extras from this 615b154630235935e1aab2a41eff9ed794d40084a02David Brown // intent will get merged with any extras already present in 616b154630235935e1aab2a41eff9ed794d40084a02David Brown // cdmaOtaScreenState.otaspResultCodePendingIntent. 617b154630235935e1aab2a41eff9ed794d40084a02David Brown 618b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mApplication.cdmaOtaScreenState == null) { 619b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.e(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: no cdmaOtaScreenState object!"); 620b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 621b154630235935e1aab2a41eff9ed794d40084a02David Brown } 622b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent == null) { 623b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: " 624b154630235935e1aab2a41eff9ed794d40084a02David Brown + "null otaspResultCodePendingIntent!"); 625b154630235935e1aab2a41eff9ed794d40084a02David Brown // This *should* never happen, since SetupWizard always passes this 626b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent along with the ACTION_PERFORM_CDMA_PROVISIONING 627b154630235935e1aab2a41eff9ed794d40084a02David Brown // intent. 628b154630235935e1aab2a41eff9ed794d40084a02David Brown // (But if this happens it's not a fatal error, it just means that 629b154630235935e1aab2a41eff9ed794d40084a02David Brown // our original caller has no way of finding out whether the OTASP 630b154630235935e1aab2a41eff9ed794d40084a02David Brown // call ultimately failed or succeeded...) 631b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 632b154630235935e1aab2a41eff9ed794d40084a02David Brown } 633b154630235935e1aab2a41eff9ed794d40084a02David Brown 634b154630235935e1aab2a41eff9ed794d40084a02David Brown try { 635b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- sendOtaspResult: SENDING PENDING INTENT: " + 636b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent); 637b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent.send( 638b154630235935e1aab2a41eff9ed794d40084a02David Brown mContext, 639b154630235935e1aab2a41eff9ed794d40084a02David Brown 0, /* resultCode (unused) */ 640b154630235935e1aab2a41eff9ed794d40084a02David Brown extraStuff); 641b154630235935e1aab2a41eff9ed794d40084a02David Brown } catch (CanceledException e) { 642b154630235935e1aab2a41eff9ed794d40084a02David Brown // should never happen because no code cancels the pending intent right now, 643b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.e(LOG_TAG, "PendingIntent send() failed: " + e); 644b154630235935e1aab2a41eff9ed794d40084a02David Brown } 645b154630235935e1aab2a41eff9ed794d40084a02David Brown } 646b154630235935e1aab2a41eff9ed794d40084a02David Brown 647b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 648af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show "Programming In Progress" screen during OTA call. Shown when OTA 649af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * provisioning is in progress after user has selected an option. 650af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 651af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowInProgressScreen() { 652b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowInProgressScreen()..."); 653b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 654b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 655b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowInProgressScreen: not interactive!"); 656b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 657b154630235935e1aab2a41eff9ed794d40084a02David Brown } 658b154630235935e1aab2a41eff9ed794d40084a02David Brown 659e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 660af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 6619e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.VISIBLE); 662af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_progress); 663af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setVisibility(View.VISIBLE); 664af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 6659bd141ba20a6cf6dcb745aca6c5c05a9c88f3a98Jim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 666a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 667a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 668e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } else { 6698df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(true); 670af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 671af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 672af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS; 673af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 674af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Update the state of the in-call menu items. 675af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.updateMenuItems(); 676af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 677af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 678af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 679af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming failure dialog when OTA provisioning fails. 680af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * If OTA provisioning attempts fail more than 3 times, then unsuccessful 681af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * dialog is shown. Otherwise a two-second notice is shown with unsuccessful 682af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * information. When notice expires, phone returns to activation screen. 683af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 684986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void otaShowProgramFailure(int length) { 685af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure()..."); 686af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.activationCount++; 687af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if ((mApplication.cdmaOtaProvisionData.activationCount < 688af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivateFailTimes) 689af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville && (mApplication.cdmaOtaConfigData.otaShowActivationScreen == 690af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_SHOW_ACTIVATION_SCREEN_ON)) { 691af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure(): activationCount" 692af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaProvisionData.activationCount); 693af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure(): show failure notice"); 694af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailureNotice(length); 695af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 696af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure(): show failure dialog"); 697af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailureDialog(); 698af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 699af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 700af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 701af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 702af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show either programming success dialog when OTA provisioning succeeds, or 703f0d315541b1b1f33fab5e7952471da6e886b53efWink Saville * programming failure dialog when it fails. See {@link #otaShowProgramFailure} 704af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * for more details. 705af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 706af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowSuccessFailure() { 707b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowSuccessFailure()..."); 708b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 709b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 710b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowSuccessFailure: not interactive!"); 711b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 712b154630235935e1aab2a41eff9ed794d40084a02David Brown } 713b154630235935e1aab2a41eff9ed794d40084a02David Brown 714af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 715af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSuccessFailure(): isOtaCallCommitted" 716af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 717af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.isOtaCallCommitted) { 718af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSuccessFailure(), show success dialog"); 719af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramSuccessDialog(); 720af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 721af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSuccessFailure(), show failure dialog"); 722af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailure(OTA_FAILURE_DIALOG_TIMEOUT); 723af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 724af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 725af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 726af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 727af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 728af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming failure dialog when OTA provisioning fails more than 3 729af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * times. 730af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 731af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramFailureDialog() { 732af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailureDialog()..."); 733af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 734af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 735986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_problem_with_activation); 736af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 737af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_unsuccessful); 738af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 739986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setVisibility(View.VISIBLE); 740af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 741e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 742af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer.closeDialer(false); 743af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 744af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 745af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 746af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 747af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming success dialog when OTA provisioning succeeds. 748af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 749af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramSuccessDialog() { 750af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramSuccessDialog()..."); 751af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 752af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 753986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate_success); 754af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 755af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_successful); 756af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 757986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setVisibility(View.VISIBLE); 758af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 759e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 760af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer.closeDialer(false); 761af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 762af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 763af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 764af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 765af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show SPC failure notice when SPC attempts exceed 15 times. 766af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * During OTA provisioning, if SPC code is incorrect OTA provisioning will 767af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * fail. When SPC attempts are over 15, it shows SPC failure notice for one minute and 768af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * then phone will power down. 769af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 770af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowSpcErrorNotice(int length) { 771af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSpcErrorNotice()..."); 772af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.spcErrorDialog == null) { 773af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.inOtaSpcState = true; 774af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville DialogInterface.OnKeyListener keyListener; 775af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville keyListener = new DialogInterface.OnKeyListener() { 776af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 777af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville log("Ignoring key events..."); 778af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return true; 779af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville }}; 780af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog = new AlertDialog.Builder(mInCallScreen) 781af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setMessage(R.string.ota_spc_failure) 782af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setOnKeyListener(keyListener) 783af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .create(); 784af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.getWindow().addFlags( 785af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 786af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 787af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.show(); 788af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 789e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 790af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer.closeDialer(false); 791af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 792af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long noticeTime = length*1000; 793325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown if (DBG) log("OtaShowSpcErrorNotice(), remaining SPC noticeTime" + noticeTime); 794325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown mInCallScreen.requestCloseSpcErrorNotice(noticeTime); 795af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 796af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 797af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 798af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 799af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * When SPC notice times out, force phone to power down. 800af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 801af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaCloseSpcNotice() { 80217c36a10d09fac3e2312c0bcb839e0a704f42105w if (DBG) log("onOtaCloseSpcNotice(), send shutdown intent"); 80317c36a10d09fac3e2312c0bcb839e0a704f42105w Intent shutdown = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); 80417c36a10d09fac3e2312c0bcb839e0a704f42105w shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM, false); 80517c36a10d09fac3e2312c0bcb839e0a704f42105w shutdown.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 80617c36a10d09fac3e2312c0bcb839e0a704f42105w mContext.startActivity(shutdown); 807af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 808af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 809af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 810af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show two-second notice when OTA provisioning fails and number of failed attempts 811af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * is less then 3. 812af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 813af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramFailureNotice(int length) { 814af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailureNotice()..."); 815af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog == null) { 816af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = new AlertDialog.Builder(mInCallScreen) 817af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setMessage(R.string.ota_failure) 818af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .create(); 819af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.getWindow().addFlags( 820af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 821af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 822af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.show(); 823af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 824af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long noticeTime = length*1000; 825325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown mInCallScreen.requestCloseOtaFailureNotice(noticeTime); 826af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 827af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 828af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 829af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 830af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle OTA unsuccessful notice expiry. Dismisses the 831af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * two-second notice and shows the activation screen. 832af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 833af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaCloseFailureNotice() { 834af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("onOtaCloseFailureNotice()..."); 835af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog != null) { 836af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.dismiss(); 837af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = null; 838af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 839af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateScreen(); 840af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 841af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 842af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 843af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Initialize all OTA UI elements to be gone. Also set inCallPanel, 8448df5c508da2c836b841ee24120fa7c5cc92df387David Brown * callCard and the dialpad handle to be gone. This is called before any OTA screen 845af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * gets drawn. 846af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 847af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaScreenInitialize() { 848b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaScreenInitialize()..."); 849b154630235935e1aab2a41eff9ed794d40084a02David Brown 850b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 851b154630235935e1aab2a41eff9ed794d40084a02David Brown // We should never be doing anything with UI elements in 852b154630235935e1aab2a41eff9ed794d40084a02David Brown // non-interactive mode. 853b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaScreenInitialize: not interactive!"); 854b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 855b154630235935e1aab2a41eff9ed794d40084a02David Brown } 856af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 857af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallPanel != null) mInCallPanel.setVisibility(View.GONE); 858af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mCallCard != null) mCallCard.hideCallCardElements(); 8598df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(false); 860af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 861986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate); 862af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 8639e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.GONE); 864af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 865af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 866af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 867af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 868af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 869986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 870986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.GONE); 871986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 872986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 873af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaCallCardBase.setVisibility(View.VISIBLE); 87413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setVisibility(View.VISIBLE); 875af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 876af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 877af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void hideOtaScreen() { 878af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("hideOtaScreen()..."); 879af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 880af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 881af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 882af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 883af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaCallCardBase.setVisibility(View.GONE); 884af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 885af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 886e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman public boolean isDialerOpened() { 887e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman return (mDialer != null && mDialer.isOpened()); 888e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } 889e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman 890af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 891af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show the appropriate OTA screen based on the current state of OTA call. 892b154630235935e1aab2a41eff9ed794d40084a02David Brown * 893b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is called from the InCallScreen when the screen needs to be 894b154630235935e1aab2a41eff9ed794d40084a02David Brown * refreshed (and thus is only ever used in interactive mode.) 895af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 896af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowProperScreen() { 897af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("otaShowProperScreen()..."); 898b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 899b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 900b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowProperScreen: not interactive!"); 901b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 902b154630235935e1aab2a41eff9ed794d40084a02David Brown } 903b154630235935e1aab2a41eff9ed794d40084a02David Brown 904af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallScreen.isForegroundActivity()) { 905af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("otaShowProperScreen(), OTA is foreground activity, currentstate =" 906af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaScreenState.otaScreenState); 907af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallPanel != null) { 908af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallPanel.setVisibility(View.GONE); 909af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 910af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaScreenState.otaScreenState 911af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION) { 912af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateScreen(); 913af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else if (mApplication.cdmaOtaScreenState.otaScreenState 914af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING) { 915af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowListeningScreen(); 916af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else if (mApplication.cdmaOtaScreenState.otaScreenState 917af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS) { 918af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowInProgressScreen(); 919af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 920af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 921af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 922af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowSpcErrorNotice(getOtaSpcDisplayTime()); 923af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 924af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 925af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 926af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 927af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 928af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Read configuration values for each OTA screen from config.xml. 929af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * These configuration values control visibility of each screen. 930af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 931af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void readXmlSettings() { 932af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings()..."); 933af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.configComplete) { 934af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 935af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 936af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 937af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.configComplete = true; 938af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowActivationScreen = 939af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowActivationScreen); 940af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivationScreen = tmpOtaShowActivationScreen; 941af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaShowActivationScreen" 942af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowActivationScreen); 943af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 944af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowListeningScreen = 945af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowListeningScreen); 946af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowListeningScreen = tmpOtaShowListeningScreen; 947af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaShowListeningScreen" 948af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowListeningScreen); 949af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 950af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowActivateFailTimes = 951af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowActivateFailTimes); 952af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivateFailTimes = tmpOtaShowActivateFailTimes; 953af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaShowActivateFailTimes" 954af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowActivateFailTimes); 955af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 956af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaPlaySuccessFailureTone = 957af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaPlaySuccessFailureTone); 958af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone = tmpOtaPlaySuccessFailureTone; 959af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaPlaySuccessFailureTone" 960af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone); 961af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 962af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 963af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 964af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle the click events for OTA buttons. 965af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 966af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onClickHandler(int id) { 967af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville switch (id) { 968af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaEndButton: 969af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaEndButton(); 970af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 971af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 972af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaSpeakerButton: 973af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaSpeakerButton(); 974af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 975af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 976af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaActivateButton: 977af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaActivateButton(); 978af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 979af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 98013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng case R.id.otaSkipButton: 98113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng onClickOtaActivateSkipButton(); 982af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 983af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 984986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller case R.id.otaNextButton: 985986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller onClickOtaActivateNextButton(); 986af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 987af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 988986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller case R.id.otaTryAgainButton: 989986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller onClickOtaTryAgainButton(); 990af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 991af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 992af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville default: 993af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log ("onClickHandler: received a click event for unrecognized id"); 994af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 995af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 996af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 997af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 998986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void onClickOtaTryAgainButton() { 999986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Activation Try Again Clicked!"); 1000986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1001986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller otaShowActivateScreen(); 1002986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller } 1003986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller } 1004986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1005af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaEndButton() { 1006986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Activation End Call Button Clicked!"); 1007af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 10088343169cc89621d46dce86449f5ee1ff5d3a4919John Wang if (PhoneUtils.hangup(mApplication.mCM) == false) { 1009a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // If something went wrong when placing the OTA call, 1010a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // the screen is not updated by the call disconnect 1011a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // handler and we have to do it here 1012a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent setSpeaker(false); 1013a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mInCallScreen.handleOtaCallEnd(); 1014a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent } 1015af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1016af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1017af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1018af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaSpeakerButton() { 1019af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OTA Speaker button Clicked!"); 1020af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1021af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville boolean isChecked = !PhoneUtils.isSpeakerOn(mContext); 1022af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville setSpeaker(isChecked); 1023af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1024af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1025af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1026af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaActivateButton() { 1027af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("Call Activation Clicked!"); 102813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaPerformActivation(); 1029af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1030af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 103113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void onClickOtaActivateSkipButton() { 103213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("Activation Skip Clicked!"); 103313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng DialogInterface.OnKeyListener keyListener; 103413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng keyListener = new DialogInterface.OnKeyListener() { 103513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public boolean onKey(DialogInterface dialog, int keyCode, 103613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng KeyEvent event) { 103713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("Ignoring key events..."); 103813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return true; 103913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 104013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }; 104113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipConfirmationDialog = new AlertDialog.Builder(mInCallScreen) 104213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setTitle(R.string.ota_skip_activation_dialog_title) 104313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setMessage(R.string.ota_skip_activation_dialog_message) 104413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setPositiveButton( 104513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng R.string.ota_skip_activation_dialog_skip_label, 104613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng new AlertDialog.OnClickListener() { 104713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public void onClick(DialogInterface dialog, int which) { 104813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaSkipActivation(); 104913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 105013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }) 105113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setNegativeButton( 105213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng R.string.ota_skip_activation_dialog_continue_label, 105313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng new AlertDialog.OnClickListener() { 105413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public void onClick(DialogInterface dialog, int which) { 105513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaPerformActivation(); 105613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 105713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }) 105813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setOnKeyListener(keyListener) 105913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .create(); 106013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipConfirmationDialog.show(); 1061af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1062af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1063986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void onClickOtaActivateNextButton() { 1064986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Dialog Next Clicked!"); 1065af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1066af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 1067af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 1068af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowHome(); 1069af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1070af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1071af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1072af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void dismissAllOtaDialogs() { 1073af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.spcErrorDialog != null) { 1074af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("- DISMISSING mSpcErrorDialog."); 1075af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.dismiss(); 1076af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog = null; 1077af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1078af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog != null) { 1079af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("- DISMISSING mOtaFailureDialog."); 1080af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.dismiss(); 1081af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = null; 1082af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1083af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1084af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1085af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private int getOtaSpcDisplayTime() { 1086af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("getOtaSpcDisplayTime()..."); 1087af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpSpcTime = 1; 1088af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1089af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long tmpOtaSpcRunningTime = 0; 1090af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long tmpOtaSpcLeftTime = 0; 1091af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcRunningTime = SystemClock.elapsedRealtime(); 1092af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcLeftTime = 1093af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcRunningTime - mApplication.cdmaOtaProvisionData.otaSpcUptime; 109417c36a10d09fac3e2312c0bcb839e0a704f42105w if (tmpOtaSpcLeftTime >= OTA_SPC_TIMEOUT*1000) { 1095af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpSpcTime = 1; 1096af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 1097af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpSpcTime = OTA_SPC_TIMEOUT - (int)tmpOtaSpcLeftTime/1000; 1098af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1099af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1100af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("getOtaSpcDisplayTime(), time for SPC error notice: " + tmpSpcTime); 1101af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return tmpSpcTime; 1102af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1103af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1104af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1105af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Initialize the OTA widgets for all OTA screens. 1106af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1107af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void initOtaInCallScreen() { 1108af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("initOtaInCallScreen()..."); 1109986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle = (TextView) mInCallScreen.findViewById(R.id.otaTitle); 1110af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate = (TextView) mInCallScreen.findViewById(R.id.otaActivate); 1111af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 11129e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer = 11139e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller (ScrollView) mInCallScreen.findViewById(R.id.otaListenProgressContainer); 1114af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress = 1115af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (TextView) mInCallScreen.findViewById(R.id.otaListenProgress); 1116af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar = 1117af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (ProgressBar) mInCallScreen.findViewById(R.id.progress_large); 1118af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setIndeterminate(true); 1119af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail = 1120af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (TextView) mInCallScreen.findViewById(R.id.otaSuccessFailStatus); 1121af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1122af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaCallCardBase = (View) mInCallScreen.findViewById(R.id.otaBase); 1123af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress = 1124af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaListenProgress); 1125af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate = 1126af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaActivate); 1127af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess = 1128af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaFailOrSuccessful); 1129af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1130af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaEndButton = (Button) mInCallScreen.findViewById(R.id.otaEndButton); 1131af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaEndButton.setOnClickListener(mInCallScreen); 1132af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaSpeakerButton = 1133af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (ToggleButton) mInCallScreen.findViewById(R.id.otaSpeakerButton); 1134af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaSpeakerButton.setOnClickListener(mInCallScreen); 1135af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaActivateButton = 1136af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (Button) mInCallScreen.findViewById(R.id.otaActivateButton); 1137af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaActivateButton.setOnClickListener(mInCallScreen); 113813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton = (Button) mInCallScreen.findViewById(R.id.otaSkipButton); 113913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setOnClickListener(mInCallScreen); 1140986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton = (Button) mInCallScreen.findViewById(R.id.otaNextButton); 1141986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setOnClickListener(mInCallScreen); 1142986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton = 1143986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller (Button) mInCallScreen.findViewById(R.id.otaTryAgainButton); 1144986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setOnClickListener(mInCallScreen); 1145a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 1146dfa83d531cdb88513f09e913424b7a16628b37d3David Brown mOtaWidgetData.otaDtmfDialerView = 1147dfa83d531cdb88513f09e913424b7a16628b37d3David Brown (DTMFTwelveKeyDialerView) mInCallScreen.findViewById(R.id.otaDtmfDialer); 1148dfa83d531cdb88513f09e913424b7a16628b37d3David Brown // Sanity-check: the otaDtmfDialer widget should *always* be present. 1149dfa83d531cdb88513f09e913424b7a16628b37d3David Brown if (mOtaWidgetData.otaDtmfDialerView == null) { 1150dfa83d531cdb88513f09e913424b7a16628b37d3David Brown Log.e(LOG_TAG, "onCreate: couldn't find otaDtmfDialer", new IllegalStateException()); 1151af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 11522f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11532f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11542f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // Create a new DTMFTwelveKeyDialer instance purely for use by the 11552f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // DTMFTwelveKeyDialerView ("otaDtmfDialerView") that comes from 11562f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // otacall_card.xml. 11572f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // (But note that mDialer is a separate DTMFTwelveKeyDialer 11582f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // instance, that belongs to the InCallScreen. This is confusing; 11592f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // see the TODO comment above.) 11602f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaCallCardDtmfDialer = new DTMFTwelveKeyDialer(mInCallScreen, 11612f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaWidgetData.otaDtmfDialerView, 11622f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown null /* no SlidingDrawer used here */); 11632f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11642f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // Initialize the new DTMFTwelveKeyDialer instance. This is 11652f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // needed to play local DTMF tones. 11662f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaCallCardDtmfDialer.startDialerSession(); 11672f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11682f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaWidgetData.otaDtmfDialerView.setDialer(mOtaCallCardDtmfDialer); 1169af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1170af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1171af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1172af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Clear out all OTA UI widget elements. Needs to get called 1173af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * when OTA call ends or InCallScreen is destroyed. 11744a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * @param disableSpeaker parameter control whether Speaker should be turned off. 1175af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 11764a5a966f0d43e04d336be1b94182346399a931f6Wink Saville public void cleanOtaScreen(boolean disableSpeaker) { 1177af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OTA ends, cleanOtaScreen!"); 1178af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1179986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaScreenState.otaScreenState = 1180986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 1181986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.isOtaCallCommitted = false; 1182986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 1183986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.inOtaSpcState = false; 1184986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.activationCount = 0; 1185986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.otaSpcUptime = 0; 11865c0517ae3c17505ffd466be79ab0026b7fe6c959Wink Saville mApplication.cdmaOtaInCallScreenUiState.state = State.UNDEFINED; 1187986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1188b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) { 1189b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInCallPanel != null) mInCallPanel.setVisibility(View.VISIBLE); 1190b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mCallCard != null) mCallCard.hideCallCardElements(); 1191b154630235935e1aab2a41eff9ed794d40084a02David Brown mDialer.setHandleVisible(true); 1192986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1193b154630235935e1aab2a41eff9ed794d40084a02David Brown // Free resources from the DTMFTwelveKeyDialer instance we created 1194b154630235935e1aab2a41eff9ed794d40084a02David Brown // in initOtaInCallScreen(). 1195b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mOtaCallCardDtmfDialer != null) { 1196b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaCallCardDtmfDialer.stopDialerSession(); 1197b154630235935e1aab2a41eff9ed794d40084a02David Brown } 11982f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 1199b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 1200b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.GONE); 1201b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 1202b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 1203b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 1204b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 1205b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 1206b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaCallCardBase.setVisibility(View.GONE); 1207b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 1208b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 1209b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 1210b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1211a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 1212a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // turn off the speaker in case it was turned on 1213a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // but the OTA call could not be completed 12144a5a966f0d43e04d336be1b94182346399a931f6Wink Saville if (disableSpeaker) { 12154a5a966f0d43e04d336be1b94182346399a931f6Wink Saville setSpeaker(false); 12164a5a966f0d43e04d336be1b94182346399a931f6Wink Saville } 1217af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1218af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1219af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1220af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Defines OTA information that needs to be maintained during 1221af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * an OTA call when display orientation changes. 1222af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1223af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaProvisionData { 1224af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean isOtaCallCommitted; 1225af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean isOtaCallIntentProcessed; 1226af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean inOtaSpcState; 1227af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int activationCount; 1228af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public long otaSpcUptime; 1229af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1230af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1231af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1232af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Defines OTA screen configuration items read from config.xml 1233af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * and used to control OTA display. 1234af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1235af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaConfigData { 1236af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowActivationScreen; 1237af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowListeningScreen; 1238af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowActivateFailTimes; 1239af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaPlaySuccessFailureTone; 1240af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean configComplete; 1241af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public CdmaOtaConfigData() { 1242af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("CdmaOtaConfigData constructor!"); 1243af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivationScreen = OTA_SHOW_ACTIVATION_SCREEN_OFF; 1244af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowListeningScreen = OTA_SHOW_LISTENING_SCREEN_OFF; 1245af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateFailTimes = OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF; 1246af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaPlaySuccessFailureTone = OTA_PLAY_SUCCESS_FAILURE_TONE_OFF; 1247af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1248af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1249af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1250af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1251f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * The state of the OTA InCallScreen UI. 1252f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1253f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public static class CdmaOtaInCallScreenUiState { 1254f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public enum State { 1255f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville UNDEFINED, 1256f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville NORMAL, 1257f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville ENDED 1258f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1259f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1260f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public State state; 1261f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1262f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public CdmaOtaInCallScreenUiState() { 1263f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville if (DBG) log("CdmaOtaInCallScreenState: constructor init to UNDEFINED"); 1264f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville state = CdmaOtaInCallScreenUiState.State.UNDEFINED; 1265f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1266f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1267f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1268f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1269f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * Save the Ota InCallScreen UI state 1270f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1271f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public void setCdmaOtaInCallScreenUiState(CdmaOtaInCallScreenUiState.State state) { 1272f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville if (DBG) log("setCdmaOtaInCallScreenState: " + state); 1273f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville mApplication.cdmaOtaInCallScreenUiState.state = state; 1274f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1275f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1276f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1277f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * Get the Ota InCallScreen UI state 1278f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1279f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public CdmaOtaInCallScreenUiState.State getCdmaOtaInCallScreenUiState() { 1280b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("getCdmaOtaInCallScreenState: " 1281b154630235935e1aab2a41eff9ed794d40084a02David Brown + mApplication.cdmaOtaInCallScreenUiState.state); 1282f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville return mApplication.cdmaOtaInCallScreenUiState.state; 1283f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1284f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1285f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1286af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * The OTA screen state machine. 1287af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1288af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaScreenState { 1289af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public enum OtaScreenState { 1290af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_UNDEFINED, 1291af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_ACTIVATION, 1292af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_LISTENING, 1293af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_PROGRESS, 1294af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_SUCCESS_FAILURE_DLG 1295af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1296af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1297af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public OtaScreenState otaScreenState; 1298af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1299af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public CdmaOtaScreenState() { 1300af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenState = OtaScreenState.OTA_STATUS_UNDEFINED; 1301af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1302b154630235935e1aab2a41eff9ed794d40084a02David Brown 1303b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent used to report an OTASP result status code back 1304b154630235935e1aab2a41eff9ed794d40084a02David Brown // to our caller. 1305b154630235935e1aab2a41eff9ed794d40084a02David Brown // 1306b154630235935e1aab2a41eff9ed794d40084a02David Brown // Our caller (presumably SetupWizard) creates this PendingIntent, 1307b154630235935e1aab2a41eff9ed794d40084a02David Brown // pointing back at itself, and passes it along as an extra with the 1308b154630235935e1aab2a41eff9ed794d40084a02David Brown // ACTION_PERFORM_CDMA_PROVISIONING intent. Then, when there's an 1309b154630235935e1aab2a41eff9ed794d40084a02David Brown // OTASP result to report, we send that PendingIntent back, adding an 1310b154630235935e1aab2a41eff9ed794d40084a02David Brown // extra called EXTRA_OTASP_RESULT_CODE to indicate the result. 1311b154630235935e1aab2a41eff9ed794d40084a02David Brown // 1312b154630235935e1aab2a41eff9ed794d40084a02David Brown // Possible result values are the OTASP_RESULT_* constants. 1313b154630235935e1aab2a41eff9ed794d40084a02David Brown public PendingIntent otaspResultCodePendingIntent; 1314b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1315b154630235935e1aab2a41eff9ed794d40084a02David Brown 1316b154630235935e1aab2a41eff9ed794d40084a02David Brown /** @see com.android.internal.telephony.Phone */ 1317b154630235935e1aab2a41eff9ed794d40084a02David Brown private static String otaProvisionStatusToString(int status) { 1318b154630235935e1aab2a41eff9ed794d40084a02David Brown switch (status) { 1319b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 1320b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SPL_UNLOCKED"; 1321b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 1322b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SPC_RETRIES_EXCEEDED"; 1323b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 1324b154630235935e1aab2a41eff9ed794d40084a02David Brown return "A_KEY_EXCHANGED"; 1325b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 1326b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SSD_UPDATED"; 1327b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 1328b154630235935e1aab2a41eff9ed794d40084a02David Brown return "NAM_DOWNLOADED"; 1329b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 1330b154630235935e1aab2a41eff9ed794d40084a02David Brown return "MDN_DOWNLOADED"; 1331b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 1332b154630235935e1aab2a41eff9ed794d40084a02David Brown return "IMSI_DOWNLOADED"; 1333b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 1334b154630235935e1aab2a41eff9ed794d40084a02David Brown return "PRL_DOWNLOADED"; 1335b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 1336b154630235935e1aab2a41eff9ed794d40084a02David Brown return "COMMITTED"; 1337b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 1338b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_STARTED"; 1339b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 1340b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_STOPPED"; 1341b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 1342b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_ABORTED"; 1343b154630235935e1aab2a41eff9ed794d40084a02David Brown default: 1344b154630235935e1aab2a41eff9ed794d40084a02David Brown return "<unknown status" + status + ">"; 1345b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1346af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1347af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1348af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private static void log(String msg) { 1349af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville Log.d(LOG_TAG, msg); 1350af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1351839b14d460986608fe577f89f789de854dc85b58Jim Miller 1352d3a8a3a138614071a7a8020e1579048c411abd78Wink Saville private static boolean isCdmaPhone() { 1353d3a8a3a138614071a7a8020e1579048c411abd78Wink Saville return (PhoneApp.getPhone().getPhoneType() == Phone.PHONE_TYPE_CDMA); 1354839b14d460986608fe577f89f789de854dc85b58Jim Miller } 1355af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville} 1356