OtaUtils.java revision d23dc59768909d8e18b42c908764c7d340935796
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; 30211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brownimport android.net.Uri; 31af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.os.AsyncResult; 32839b14d460986608fe577f89f789de854dc85b58Jim Millerimport android.os.Handler; 33af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.os.SystemClock; 34af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.util.Log; 35af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.KeyEvent; 36af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.View; 37af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.ViewGroup; 38af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.ViewStub; 39af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.WindowManager; 40af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.widget.Button; 41af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.widget.ProgressBar; 42b154630235935e1aab2a41eff9ed794d40084a02David Brownimport android.widget.ScrollView; 43af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.widget.TextView; 44b154630235935e1aab2a41eff9ed794d40084a02David Brownimport android.widget.ToggleButton; 45af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 46af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville/** 477c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown * Handles all OTASP Call related logic and UI functionality. 487c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown * The InCallScreen interacts with this class to perform an OTASP Call. 49e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * 507c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown * OTASP is a CDMA-specific feature: 51e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * OTA or OTASP == Over The Air service provisioning 52e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * SPC == Service Programming Code 53e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * TODO: Include pointer to more detailed documentation. 54b154630235935e1aab2a41eff9ed794d40084a02David Brown * 55b154630235935e1aab2a41eff9ed794d40084a02David Brown * TODO: This is Over The Air Service Provisioning (OTASP) 56b154630235935e1aab2a41eff9ed794d40084a02David Brown * A better name would be OtaspUtils.java. 57af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 58af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savillepublic class OtaUtils { 59af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private static final String LOG_TAG = "OtaUtils"; 60c3098c14cb1c0444d61ba1b6d0b81175e93bbd75David Brown private static final boolean DBG = true; 61af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 62af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATION_SCREEN_OFF = 0; 63af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATION_SCREEN_ON = 1; 64af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_LISTENING_SCREEN_OFF =0; 65af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_LISTENING_SCREEN_ON =1; 66af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF = 0; 67af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_THREE = 3; 68af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_OFF = 0; 69af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_ON = 1; 70af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 7117c36a10d09fac3e2312c0bcb839e0a704f42105w // SPC Timeout is 60 seconds 7217c36a10d09fac3e2312c0bcb839e0a704f42105w public final int OTA_SPC_TIMEOUT = 60; 73af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public final int OTA_FAILURE_DIALOG_TIMEOUT = 2; 74af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 75b154630235935e1aab2a41eff9ed794d40084a02David Brown // Constants for OTASP-related Intents and intent extras. 76b154630235935e1aab2a41eff9ed794d40084a02David Brown // Watch out: these must agree with the corresponding constants in 77b154630235935e1aab2a41eff9ed794d40084a02David Brown // apps/SetupWizard! 78b154630235935e1aab2a41eff9ed794d40084a02David Brown 79b154630235935e1aab2a41eff9ed794d40084a02David Brown // Intent action to launch an OTASP call. 80b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String ACTION_PERFORM_CDMA_PROVISIONING = 81b154630235935e1aab2a41eff9ed794d40084a02David Brown "com.android.phone.PERFORM_CDMA_PROVISIONING"; 82b154630235935e1aab2a41eff9ed794d40084a02David Brown 83d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng // Intent action to launch activation on a non-voice capable device 84d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng public static final String ACTION_PERFORM_VOICELESS_CDMA_PROVISIONING = 85d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng "com.android.phone.PERFORM_VOICELESS_CDMA_PROVISIONING"; 86d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng 870c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng // boolean voiceless provisioning extra that enables a "don't show this again" checkbox 880c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng // the user can check to never see the activity upon bootup again 890c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng public static final String EXTRA_VOICELESS_PROVISIONING_OFFER_DONTSHOW = 900c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng "com.android.phone.VOICELESS_PROVISIONING_OFFER_DONTSHOW"; 910c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng 92b154630235935e1aab2a41eff9ed794d40084a02David Brown // Activity result codes for the ACTION_PERFORM_CDMA_PROVISIONING intent 93b154630235935e1aab2a41eff9ed794d40084a02David Brown // (see the InCallScreenShowActivation activity.) 94b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // 95b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // Note: currently, our caller won't ever actually receive the 96b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // RESULT_INTERACTIVE_OTASP_STARTED result code; see comments in 97b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // InCallScreenShowActivation.onCreate() for details. 98b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown 99b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int RESULT_INTERACTIVE_OTASP_STARTED = Activity.RESULT_FIRST_USER; 100b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int RESULT_NONINTERACTIVE_OTASP_STARTED = Activity.RESULT_FIRST_USER + 1; 101b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int RESULT_NONINTERACTIVE_OTASP_FAILED = Activity.RESULT_FIRST_USER + 2; 102b154630235935e1aab2a41eff9ed794d40084a02David Brown 103b154630235935e1aab2a41eff9ed794d40084a02David Brown // Testing: Extra for the ACTION_PERFORM_CDMA_PROVISIONING intent that 104b154630235935e1aab2a41eff9ed794d40084a02David Brown // allows the caller to manually enable/disable "interactive mode" for 1057d38129b67491544c5969dc784db478b13918b08David Brown // the OTASP call. Only available in userdebug or eng builds. 106b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String EXTRA_OVERRIDE_INTERACTIVE_MODE = 107b154630235935e1aab2a41eff9ed794d40084a02David Brown "ota_override_interactive_mode"; 108b154630235935e1aab2a41eff9ed794d40084a02David Brown 109b154630235935e1aab2a41eff9ed794d40084a02David Brown // Extra for the ACTION_PERFORM_CDMA_PROVISIONING intent, holding a 110b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent which the phone app can use to send a result code 111b154630235935e1aab2a41eff9ed794d40084a02David Brown // back to the caller. 112b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String EXTRA_OTASP_RESULT_CODE_PENDING_INTENT = 113b154630235935e1aab2a41eff9ed794d40084a02David Brown "otasp_result_code_pending_intent"; 114b154630235935e1aab2a41eff9ed794d40084a02David Brown 115b154630235935e1aab2a41eff9ed794d40084a02David Brown // Extra attached to the above PendingIntent that indicates 116b154630235935e1aab2a41eff9ed794d40084a02David Brown // success or failure. 117b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String EXTRA_OTASP_RESULT_CODE = 118b154630235935e1aab2a41eff9ed794d40084a02David Brown "otasp_result_code"; 119b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_UNKNOWN = 0; 120b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_USER_SKIPPED = 1; // Only meaningful with interactive OTASP 121b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_SUCCESS = 2; 122b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_FAILURE = 3; 12362995702f659b906127351596305906ccd0d7cb5Freeman Ng // failed due to CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED 12462995702f659b906127351596305906ccd0d7cb5Freeman Ng public static final int OTASP_FAILURE_SPC_RETRIES = 4; 125b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // TODO: Distinguish between interactive and non-interactive success 126b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // and failure. Then, have the PendingIntent be sent after 127b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // interactive OTASP as well (so the caller can find out definitively 128b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // when interactive OTASP completes.) 129b154630235935e1aab2a41eff9ed794d40084a02David Brown 130b154630235935e1aab2a41eff9ed794d40084a02David Brown private static final String OTASP_NUMBER = "*228"; 131b154630235935e1aab2a41eff9ed794d40084a02David Brown private static final String OTASP_NUMBER_NON_INTERACTIVE = "*22899"; 132b154630235935e1aab2a41eff9ed794d40084a02David Brown 133af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private InCallScreen mInCallScreen; 134af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private Context mContext; 135af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private PhoneApp mApplication; 136af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private OtaWidgetData mOtaWidgetData; 137af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private ViewGroup mInCallPanel; 138af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private CallCard mCallCard; 1392f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 1407c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown // The DTMFTwelveKeyDialer instance. We create this in 1417c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown // initOtaInCallScreen(), and attach it to the DTMFTwelveKeyDialerView 1422f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // ("otaDtmfDialerView") that comes from otacall_card.xml. 1432f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown private DTMFTwelveKeyDialer mOtaCallCardDtmfDialer; 1442f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 14557a38778e8c9f58b24cea1062e451934cadc4b3dJim Miller private static boolean mIsWizardMode = true; 146af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 147b154630235935e1aab2a41eff9ed794d40084a02David Brown // In "interactive mode", the OtaUtils object is tied to an 148b154630235935e1aab2a41eff9ed794d40084a02David Brown // InCallScreen instance, where we display a bunch of UI specific to 149b154630235935e1aab2a41eff9ed794d40084a02David Brown // the OTASP call. But on devices that are not "voice capable", the 150b154630235935e1aab2a41eff9ed794d40084a02David Brown // OTASP call runs in a non-interactive mode, and we don't have 151b154630235935e1aab2a41eff9ed794d40084a02David Brown // an InCallScreen or CallCard or any OTASP UI elements at all. 152b154630235935e1aab2a41eff9ed794d40084a02David Brown private boolean mInteractive = true; 153b154630235935e1aab2a41eff9ed794d40084a02David Brown 154b154630235935e1aab2a41eff9ed794d40084a02David Brown 155af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 156af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * OtaWidgetData class represent all OTA UI elements 157211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 158211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * TODO(OTASP): It's really ugly for the OtaUtils object to reach into the 159211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * InCallScreen like this and directly manipulate its widgets. 160211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 161211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Instead, the model/view separation should be more clear: OtaUtils 162211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * should only know about a higher-level abstraction of the 163211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * OTASP-specific UI state (just like how the CallController uses the 164211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * InCallUiState object), and the InCallScreen itself should translate 165211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * that higher-level abstraction into actual onscreen views and widgets. 166af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 167af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private class OtaWidgetData { 168af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public Button otaEndButton; 169af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public Button otaActivateButton; 17013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public Button otaSkipButton; 171986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public Button otaNextButton; 172af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public ToggleButton otaSpeakerButton; 1737c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown public ViewGroup otaUpperWidgets; 174af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View callCardOtaButtonsFailSuccess; 175af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public ProgressBar otaTextProgressBar; 176af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public TextView otaTextSuccessFail; 177af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View callCardOtaButtonsActivate; 178af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View callCardOtaButtonsListenProgress; 179af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public TextView otaTextActivate; 180af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public TextView otaTextListenProgress; 181af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public AlertDialog spcErrorDialog; 182af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public AlertDialog otaFailureDialog; 18313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public AlertDialog otaSkipConfirmationDialog; 184986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public TextView otaTitle; 185986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public DTMFTwelveKeyDialerView otaDtmfDialerView; 186986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public Button otaTryAgainButton; 187af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 188af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 189211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown /** 190211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * OtaUtils constructor. 191211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 192211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * @param context the Context of the calling Activity or Application 193211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * @param interactive if true, use the InCallScreen to display the progress 194211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * and result of the OTASP call. In practice this is 195211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * true IFF the current device is a voice-capable phone. 196211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 197211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Note if interactive is true, you must also call updateUiWidgets() as soon 198211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * as the InCallScreen instance is ready. 199211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown */ 200211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown public OtaUtils(Context context, boolean interactive) { 201211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("OtaUtils constructor..."); 202211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mApplication = PhoneApp.getInstance(); 203211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mContext = context; 204211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mInteractive = interactive; 205211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 206211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 207211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown /** 208211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Updates the OtaUtils object's references to some UI elements belonging to 209211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * the InCallScreen. This is used only in interactive mode. 210211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 211211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Use clearUiWidgets() to clear out these references. (The InCallScreen 212211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * is responsible for doing this from its onDestroy() method.) 213211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 214211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * This method has no effect if the UI widgets have already been set up. 215211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * (In other words, it's safe to call this every time through 216211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * InCallScreen.onResume().) 217211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown */ 218211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown public void updateUiWidgets(InCallScreen inCallScreen, 219211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown ViewGroup inCallPanel, 2207c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown CallCard callCard) { 221211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("updateUiWidgets()... mInCallScreen = " + mInCallScreen); 222211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 223211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (!mInteractive) { 224211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown throw new IllegalStateException("updateUiWidgets() called in non-interactive mode"); 225211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 226af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 227211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (mInCallScreen != null) { 228211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("updateUiWidgets(): widgets already set up, nothing to do..."); 229211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown return; 230211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 231af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 232af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen = inCallScreen; 233af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallPanel = inCallPanel; 234af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mCallCard = callCard; 235af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData = new OtaWidgetData(); 236af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 237211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Inflate OTASP-specific UI elements: 238211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown ViewStub otaCallCardStub = (ViewStub) mInCallScreen.findViewById(R.id.otaCallCardStub); 239211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (otaCallCardStub != null) { 240211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // If otaCallCardStub is null here, that means it's already been 241211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // inflated (which could have happened in the current InCallScreen 242211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // instance for a *prior* OTASP call.) 243b154630235935e1aab2a41eff9ed794d40084a02David Brown otaCallCardStub.inflate(); 244b154630235935e1aab2a41eff9ed794d40084a02David Brown } 245211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 246211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown readXmlSettings(); 247211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown initOtaInCallScreen(); 248211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 249211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 250211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown /** 251211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Clear out the OtaUtils object's references to any InCallScreen UI 252211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * elements. This is the opposite of updateUiWidgets(). 253211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown */ 254211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown public void clearUiWidgets() { 255211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mInCallScreen = null; 256211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mInCallPanel = null; 257211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mCallCard = null; 258211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mOtaWidgetData = null; 259af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 260a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 261839b14d460986608fe577f89f789de854dc85b58Jim Miller /** 262839b14d460986608fe577f89f789de854dc85b58Jim Miller * Starts the OTA provisioning call. If the MIN isn't available yet, it returns false and adds 263a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent * an event to return the request to the calling app when it becomes available. 264a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent * 265839b14d460986608fe577f89f789de854dc85b58Jim Miller * @param context 266839b14d460986608fe577f89f789de854dc85b58Jim Miller * @param handler 267839b14d460986608fe577f89f789de854dc85b58Jim Miller * @param request 268839b14d460986608fe577f89f789de854dc85b58Jim Miller * @return true if we were able to launch Ota activity or it's not required; false otherwise 269839b14d460986608fe577f89f789de854dc85b58Jim Miller */ 270839b14d460986608fe577f89f789de854dc85b58Jim Miller public static boolean maybeDoOtaCall(Context context, Handler handler, int request) { 271839b14d460986608fe577f89f789de854dc85b58Jim Miller PhoneApp app = PhoneApp.getInstance(); 272839b14d460986608fe577f89f789de854dc85b58Jim Miller Phone phone = app.phone; 273839b14d460986608fe577f89f789de854dc85b58Jim Miller 274777b22c936d2bfa8140427402906a140d17180dcFreeman Ng if (ActivityManager.isRunningInTestHarness()) { 275777b22c936d2bfa8140427402906a140d17180dcFreeman Ng Log.i(LOG_TAG, "Don't run provisioning when in test harness"); 276777b22c936d2bfa8140427402906a140d17180dcFreeman Ng return true; 277777b22c936d2bfa8140427402906a140d17180dcFreeman Ng } 278777b22c936d2bfa8140427402906a140d17180dcFreeman Ng 2797c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (!TelephonyCapabilities.supportsOtasp(phone)) { 2807c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown // Presumably not a CDMA phone. 2817c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("maybeDoOtaCall: OTASP not supported on this device"); 2827c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown return true; // Nothing to do here. 283839b14d460986608fe577f89f789de854dc85b58Jim Miller } 284839b14d460986608fe577f89f789de854dc85b58Jim Miller 285839b14d460986608fe577f89f789de854dc85b58Jim Miller if (!phone.isMinInfoReady()) { 286839b14d460986608fe577f89f789de854dc85b58Jim Miller if (DBG) log("MIN is not ready. Registering to receive notification."); 287839b14d460986608fe577f89f789de854dc85b58Jim Miller phone.registerForSubscriptionInfoReady(handler, request, null); 288839b14d460986608fe577f89f789de854dc85b58Jim Miller return false; 289839b14d460986608fe577f89f789de854dc85b58Jim Miller } 290839b14d460986608fe577f89f789de854dc85b58Jim Miller phone.unregisterForSubscriptionInfoReady(handler); 291839b14d460986608fe577f89f789de854dc85b58Jim Miller 292f0d315541b1b1f33fab5e7952471da6e886b53efWink Saville boolean phoneNeedsActivation = phone.needsOtaServiceProvisioning(); 293839b14d460986608fe577f89f789de854dc85b58Jim Miller if (DBG) log("phoneNeedsActivation is set to " + phoneNeedsActivation); 294a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 295839b14d460986608fe577f89f789de854dc85b58Jim Miller int otaShowActivationScreen = context.getResources().getInteger( 296839b14d460986608fe577f89f789de854dc85b58Jim Miller R.integer.OtaShowActivationScreen); 297839b14d460986608fe577f89f789de854dc85b58Jim Miller if (DBG) log("otaShowActivationScreen: " + otaShowActivationScreen); 298839b14d460986608fe577f89f789de854dc85b58Jim Miller 299d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng // Run the OTASP call in "interactive" mode only if 300d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng // this is a "voice capable" device. 3012e97fab35871f41a9a8d8099ccb664b17d92554cDavid Brown if (PhoneApp.sVoiceCapable) { 302b154630235935e1aab2a41eff9ed794d40084a02David Brown if (phoneNeedsActivation 303b154630235935e1aab2a41eff9ed794d40084a02David Brown && (otaShowActivationScreen == OTA_SHOW_ACTIVATION_SCREEN_ON)) { 304b154630235935e1aab2a41eff9ed794d40084a02David Brown app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 305211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mIsWizardMode = false; 30658e4707b6cc021a663deae3e614364545ec9ee6aDavid Brown 307211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) Log.d(LOG_TAG, "==> Starting interactive CDMA provisioning..."); 308211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown OtaUtils.startInteractiveOtasp(context); 30958e4707b6cc021a663deae3e614364545ec9ee6aDavid Brown 310211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("maybeDoOtaCall: voice capable; activation started."); 311b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 312211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("maybeDoOtaCall: voice capable; activation NOT started."); 313b154630235935e1aab2a41eff9ed794d40084a02David Brown } 314839b14d460986608fe577f89f789de854dc85b58Jim Miller } else { 315b154630235935e1aab2a41eff9ed794d40084a02David Brown if (phoneNeedsActivation) { 316d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 317d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng Intent newIntent = new Intent(ACTION_PERFORM_VOICELESS_CDMA_PROVISIONING); 318d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 3190c38cb459cd32bbe1db923fa77fa9f4671f7edfaFreeman Ng newIntent.putExtra(EXTRA_VOICELESS_PROVISIONING_OFFER_DONTSHOW, true); 320d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng context.startActivity(newIntent); 321d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng if (DBG) log("maybeDoOtaCall: non-interactive; activation intent sent."); 322b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 323d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng if (DBG) log("maybeDoOtaCall: non-interactive, no need for OTASP."); 324b154630235935e1aab2a41eff9ed794d40084a02David Brown } 325839b14d460986608fe577f89f789de854dc85b58Jim Miller } 326839b14d460986608fe577f89f789de854dc85b58Jim Miller return true; 327839b14d460986608fe577f89f789de854dc85b58Jim Miller } 328af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 329b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 330211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Starts a normal "interactive" OTASP call (i.e. CDMA activation 331211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * for regular voice-capable phone devices.) 332211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 333211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * This method is called from the InCallScreenShowActivation activity when 334211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * handling the ACTION_PERFORM_CDMA_PROVISIONING intent. 335211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown */ 336211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown public static void startInteractiveOtasp(Context context) { 337211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("startInteractiveOtasp()..."); 338211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown PhoneApp app = PhoneApp.getInstance(); 339211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 340211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // There are two ways to start OTASP on voice-capable devices: 341211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 342211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // (1) via the PERFORM_CDMA_PROVISIONING intent 343211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // - this is triggered by the "Activate device" button in settings, 344211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // or can be launched automatically upon boot if the device 345211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // thinks it needs to be provisioned. 346211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // - the intent is handled by InCallScreenShowActivation.onCreate(), 347211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // which calls this method 348211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // - we prepare for OTASP by initializing the OtaUtils object 349211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // - we bring up the InCallScreen in the ready-to-activate state 350211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // - when the user presses the "Activate" button we launch the 351211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // call by calling CallController.placeCall() via the 352211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // otaPerformActivation() method. 353211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 354211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // (2) by manually making an outgoing call to a special OTASP number 355211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // like "*228" or "*22899". 356211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // - That sequence does NOT involve this method (OtaUtils.startInteractiveOtasp()). 357211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Instead, the outgoing call request goes straight to CallController.placeCall(). 358211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // - CallController.placeCall() notices that it's an OTASP 359211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // call, and initializes the OtaUtils object. 360211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // - The InCallScreen is launched (as the last step of 361211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // CallController.placeCall()). The InCallScreen notices that 362211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // OTASP is active and shows the correct UI. 363211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 364211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // TODO(OTASP): but for now, use the behavior of scenario (2) in all 365211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // cases, since there's still some InCallScreen cleanup necessary to get 366211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // scenario (1) to work. 367211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 368211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // But ultimately the code here needs to bring up the InCallScreen in 369211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // the special "activate" state (see OtaUtils.otaShowActivateScreen()), 370211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // where we won't actually make the call till the user presses the 371211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // "Activate" button. 372211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 373211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // So simply place an outgoing call to the special OTASP number: 374211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown Intent newIntent = new Intent(Intent.ACTION_CALL); 37565454c803eb305c4740885ad4995a871b034a58aDavid Brown newIntent.setData(Uri.fromParts(Constants.SCHEME_TEL, OTASP_NUMBER, null)); 376211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 377211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown Log.i(LOG_TAG, "startInteractiveOtasp: placing call: " + newIntent); 378211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown app.callController.placeCall(newIntent); 379211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 380211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 381211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // TODO(OTASP): still need more cleanup to simplify the mApp.cdma*State objects. 382211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 383211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Here's some possibly-redundant code that might still need to 384211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // happen as part of this sequence: 385211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 386211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // (1) Original block of code from InCallScreen.checkIsOtaCall(), when 387211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // handling ACTION_PERFORM_CDMA_PROVISIONING: 388211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 389211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // if (action.equals(OtaUtils.ACTION_PERFORM_CDMA_PROVISIONING)) { 390211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // if (DBG) log("checkIsOtaCall action = ACTION_PERFORM_CDMA_PROVISIONING"); 391211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // if (!mApp.cdmaOtaProvisionData.isOtaCallIntentProcessed) { 392211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // if (DBG) log("ACTION_PERFORM_CDMA_PROVISIONING not handled before"); 393211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // mApp.cdmaOtaProvisionData.isOtaCallIntentProcessed = true; 394211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // mApp.cdmaOtaScreenState.otaScreenState = 395211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION; 396211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // } 397211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // isOtaCall = true; 398211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // } 399211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 400211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // (2) Similar block originally from InCallScreen.internalResolveIntent(): 401211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 402211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // // The ACTION_PERFORM_CDMA_PROVISIONING intent tells us to launch 403211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // // the CDMA OTASP call. (Note: on non-voice-capable devices, this 404211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // // intent is handled by the OtaUtils class without involving the 405211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // // InCallScreen at all.) 406211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // // 407211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // // TODO: This needs to be handled by the CallController, not here 408211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // // (see bug 4194458). This action should probably have its own 409211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // // receiver somewhere else in the phone app, and call the 410211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // // CallController API from there. 411211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // if ((action.equals(OtaUtils.ACTION_PERFORM_CDMA_PROVISIONING)) 412211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // && (TelephonyCapabilities.supportsOtasp(mPhone))) { 413211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // setInCallScreenMode(InCallScreenMode.OTA_NORMAL); 414211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // if ((mApp.cdmaOtaProvisionData != null) 415211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // && (!mApp.cdmaOtaProvisionData.isOtaCallIntentProcessed)) { 416211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // mApp.cdmaOtaProvisionData.isOtaCallIntentProcessed = true; 417211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // mApp.cdmaOtaScreenState.otaScreenState = 418211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION; 419211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // } 420211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // return; 421211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 422211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // } 423211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 424211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 425211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown /** 426b154630235935e1aab2a41eff9ed794d40084a02David Brown * Starts the OTASP call *without* involving the InCallScreen or 427b154630235935e1aab2a41eff9ed794d40084a02David Brown * displaying any UI. 428b154630235935e1aab2a41eff9ed794d40084a02David Brown * 429b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is used on data-only devices, which don't support any kind of 430b154630235935e1aab2a41eff9ed794d40084a02David Brown * in-call phone UI. 431b154630235935e1aab2a41eff9ed794d40084a02David Brown * 432b154630235935e1aab2a41eff9ed794d40084a02David Brown * @return PhoneUtils.CALL_STATUS_DIALED if we successfully 433b154630235935e1aab2a41eff9ed794d40084a02David Brown * dialed the OTASP number, or one of the other 434b154630235935e1aab2a41eff9ed794d40084a02David Brown * CALL_STATUS_* constants if there was a failure. 435b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 436b154630235935e1aab2a41eff9ed794d40084a02David Brown public static int startNonInteractiveOtasp(Context context) { 437b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("startNonInteractiveOtasp()..."); 438b154630235935e1aab2a41eff9ed794d40084a02David Brown PhoneApp app = PhoneApp.getInstance(); 439b154630235935e1aab2a41eff9ed794d40084a02David Brown 440b154630235935e1aab2a41eff9ed794d40084a02David Brown if (app.otaUtils != null) { 441211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // An OtaUtils instance already exists, presumably from a previous OTASP call. 442211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown Log.i(LOG_TAG, "startNonInteractiveOtasp: " 443b154630235935e1aab2a41eff9ed794d40084a02David Brown + "OtaUtils already exists; nuking the old one and starting again..."); 444b154630235935e1aab2a41eff9ed794d40084a02David Brown } 445b154630235935e1aab2a41eff9ed794d40084a02David Brown 446211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Create the OtaUtils instance. 447211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown app.otaUtils = new OtaUtils(context, false /* non-interactive mode */); 448b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- created OtaUtils: " + app.otaUtils); 449b154630235935e1aab2a41eff9ed794d40084a02David Brown 450b154630235935e1aab2a41eff9ed794d40084a02David Brown // ... and kick off the OTASP call. 45175e3711d82d0c98444f6c438437cad41d862fca6David Brown // TODO(InCallScreen redesign): This should probably go through 45275e3711d82d0c98444f6c438437cad41d862fca6David Brown // the CallController, rather than directly calling 45375e3711d82d0c98444f6c438437cad41d862fca6David Brown // PhoneUtils.placeCall(). 454b154630235935e1aab2a41eff9ed794d40084a02David Brown Phone phone = PhoneApp.getPhone(); 455b154630235935e1aab2a41eff9ed794d40084a02David Brown String number = OTASP_NUMBER_NON_INTERACTIVE; 456211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown Log.i(LOG_TAG, "startNonInteractiveOtasp: placing call to '" + number + "'..."); 457b154630235935e1aab2a41eff9ed794d40084a02David Brown int callStatus = PhoneUtils.placeCall(context, 458b154630235935e1aab2a41eff9ed794d40084a02David Brown phone, 459b154630235935e1aab2a41eff9ed794d40084a02David Brown number, 460b154630235935e1aab2a41eff9ed794d40084a02David Brown null, // contactRef 461b154630235935e1aab2a41eff9ed794d40084a02David Brown false, //isEmergencyCall 462b154630235935e1aab2a41eff9ed794d40084a02David Brown null); // gatewayUri 463b154630235935e1aab2a41eff9ed794d40084a02David Brown 464b154630235935e1aab2a41eff9ed794d40084a02David Brown if (callStatus == PhoneUtils.CALL_STATUS_DIALED) { 465b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log(" ==> successful return from placeCall(): callStatus = " + callStatus); 466b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 467b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "Failure from placeCall() for OTA number '" 468b154630235935e1aab2a41eff9ed794d40084a02David Brown + number + "': code " + callStatus); 469b154630235935e1aab2a41eff9ed794d40084a02David Brown return callStatus; 470b154630235935e1aab2a41eff9ed794d40084a02David Brown } 471b154630235935e1aab2a41eff9ed794d40084a02David Brown 472b154630235935e1aab2a41eff9ed794d40084a02David Brown // TODO: Any other special work to do here? 473b154630235935e1aab2a41eff9ed794d40084a02David Brown // Such as: 474b154630235935e1aab2a41eff9ed794d40084a02David Brown // 475b154630235935e1aab2a41eff9ed794d40084a02David Brown // - manually kick off progress updates, either using TelephonyRegistry 476b154630235935e1aab2a41eff9ed794d40084a02David Brown // or else by sending PendingIntents directly to our caller? 477b154630235935e1aab2a41eff9ed794d40084a02David Brown // 478b154630235935e1aab2a41eff9ed794d40084a02David Brown // - manually silence the in-call audio? (Probably unnecessary 479b154630235935e1aab2a41eff9ed794d40084a02David Brown // if Stingray truly has no audio path from phone baseband 480b154630235935e1aab2a41eff9ed794d40084a02David Brown // to the device's speakers.) 481b154630235935e1aab2a41eff9ed794d40084a02David Brown // 482b154630235935e1aab2a41eff9ed794d40084a02David Brown 483b154630235935e1aab2a41eff9ed794d40084a02David Brown return callStatus; 484b154630235935e1aab2a41eff9ed794d40084a02David Brown } 485b154630235935e1aab2a41eff9ed794d40084a02David Brown 486211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown /** 487211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * @return true if the specified Intent is a CALL action that's an attempt 488211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * to initate an OTASP call. 489211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 490211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * OTASP is a CDMA-specific concept, so this method will always return false 491211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * on GSM phones. 492211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 493211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * This code was originally part of the InCallScreen.checkIsOtaCall() method. 494211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown */ 495211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown public static boolean isOtaspCallIntent(Intent intent) { 496211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("isOtaspCallIntent(" + intent + ")..."); 497211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown PhoneApp app = PhoneApp.getInstance(); 498211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown Phone phone = app.mCM.getDefaultPhone(); 499211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 500211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (intent == null) { 501211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown return false; 502211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 503211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (!TelephonyCapabilities.supportsOtasp(phone)) { 504211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown return false; 505211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 506211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 507211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown String action = intent.getAction(); 508211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (action == null) { 509211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown return false; 510211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 511211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (!action.equals(Intent.ACTION_CALL)) { 512211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("isOtaspCallIntent: not a CALL action: '" + action + "' ==> not OTASP"); 513211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown return false; 514211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 515211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 516211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if ((app.cdmaOtaScreenState == null) || (app.cdmaOtaProvisionData == null)) { 517211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Uh oh -- something wrong with our internal OTASP state. 518211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // (Since this is an OTASP-capable device, these objects 519211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // *should* have already been created by PhoneApp.onCreate().) 520211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown throw new IllegalStateException("isOtaspCallIntent: " 521211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown + "app.cdmaOta* objects(s) not initialized"); 522211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 523211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 524211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // This is an OTASP call iff the number we're trying to dial is one of 525211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // the magic OTASP numbers. 526211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown String number; 527211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown try { 528211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown number = CallController.getInitialNumber(intent); 529211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } catch (PhoneUtils.VoiceMailNumberMissingException ex) { 530211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // This was presumably a "voicemail:" intent, so it's 531211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // obviously not an OTASP number. 532211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("isOtaspCallIntent: VoiceMailNumberMissingException => not OTASP"); 533211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown return false; 534211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 535211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (phone.isOtaSpNumber(number)) { 536211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("isOtaSpNumber: ACTION_CALL to '" + number + "' ==> OTASP call!"); 537211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown return true; 538211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 539211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown return false; 540211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 541211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 542211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown /** 543211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Set up for an OTASP call. 544211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 545211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * This method is called as part of the CallController placeCall() sequence 546211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * before initiating an outgoing OTASP call. 547211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 548211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * The purpose of this method is mainly to create and initialize the 549211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * OtaUtils instance, along with some other misc pre-OTASP cleanup. 550211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown */ 551211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown public static void setupOtaspCall(Intent intent) { 552211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("setupOtaspCall(): preparing for OTASP call to " + intent); 553211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown PhoneApp app = PhoneApp.getInstance(); 554211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 555211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (app.otaUtils != null) { 556211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // An OtaUtils instance already exists, presumably from a prior OTASP call. 557211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Nuke the old one and start this call with a fresh instance. 558211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown Log.i(LOG_TAG, "setupOtaspCall: " 559211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown + "OtaUtils already exists; replacing with new instance..."); 560211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 561211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 562211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Create the OtaUtils instance. 563211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown app.otaUtils = new OtaUtils(app.getApplicationContext(), true /* interactive */); 564211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("- created OtaUtils: " + app.otaUtils); 565211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 566211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // NOTE we still need to call OtaUtils.updateUiWidgets() once the 567211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // InCallScreen instance is ready; see InCallScreen.checkOtaspStateOnResume() 568211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 569211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 570211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Make sure the InCallScreen knows that it needs to switch into OTASP mode. 571211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 572211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // NOTE in gingerbread and earlier, we used to do 573211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // setInCallScreenMode(InCallScreenMode.OTA_NORMAL); 574211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // directly in the InCallScreen, back when this check happened inside the InCallScreen. 575211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // 576211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // But now, set the global CdmaOtaInCallScreenUiState object into 577211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // NORMAL mode, which will then cause the InCallScreen (when it 578211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // comes up) to realize that an OTA call is active. 579211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 580211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown app.otaUtils.setCdmaOtaInCallScreenUiState( 581211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown OtaUtils.CdmaOtaInCallScreenUiState.State.NORMAL); 582211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 583211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // TODO(OTASP): note app.inCallUiState.inCallScreenMode and 584211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // app.cdmaOtaInCallScreenUiState.state are mostly redundant. Combine them. 585211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown app.inCallUiState.inCallScreenMode = InCallUiState.InCallScreenMode.OTA_NORMAL; 586211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 587211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Also, since the OTA call is now just starting, clear out 588211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // the "committed" flag in app.cdmaOtaProvisionData. 589211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (app.cdmaOtaProvisionData != null) { 590211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown app.cdmaOtaProvisionData.isOtaCallCommitted = false; 591211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 592211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 593211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 594af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void setSpeaker(boolean state) { 595af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("setSpeaker : " + state ); 596b154630235935e1aab2a41eff9ed794d40084a02David Brown 597b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 598b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("non-interactive mode, ignoring setSpeaker."); 599b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 600b154630235935e1aab2a41eff9ed794d40084a02David Brown } 601b154630235935e1aab2a41eff9ed794d40084a02David Brown 602af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (state == PhoneUtils.isSpeakerOn(mContext)) { 603af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("no change. returning"); 604af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 605af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 606af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 607af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (state && mInCallScreen.isBluetoothAvailable() 608af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville && mInCallScreen.isBluetoothAudioConnected()) { 609af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.disconnectBluetoothAudio(); 610af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 611425b8e3c9846d5e0e76466604b35cad8856d79deEric Laurent PhoneUtils.turnOnSpeaker(mContext, state, true); 612af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 613af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 614af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 615211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Handles OTA Provision events from the telephony layer. 616211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * These events come in to this method whether or not 617211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * the InCallScreen is visible. 618211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * 619211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown * Possible events are: 620af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * OTA Commit Event - OTA provisioning was successful 621af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * SPC retries exceeded - SPC failure retries has exceeded, and Phone needs to 622af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * power down. 623af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 624af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaProvisionStatusChanged(AsyncResult r) { 625af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int OtaStatus[] = (int[]) r.result; 626b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("Provision status event!"); 627b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaProvisionStatusChanged(): status = " 628b154630235935e1aab2a41eff9ed794d40084a02David Brown + OtaStatus[0] + " ==> " + otaProvisionStatusToString(OtaStatus[0])); 629b154630235935e1aab2a41eff9ed794d40084a02David Brown 630b154630235935e1aab2a41eff9ed794d40084a02David Brown // In practice, in a normal successful OTASP call, events come in as follows: 631b154630235935e1aab2a41eff9ed794d40084a02David Brown // - SPL_UNLOCKED within a couple of seconds after the call starts 632b154630235935e1aab2a41eff9ed794d40084a02David Brown // - then a delay of around 45 seconds 633b154630235935e1aab2a41eff9ed794d40084a02David Brown // - then PRL_DOWNLOADED and MDN_DOWNLOADED and COMMITTED within a span of 2 seconds 634af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 635af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville switch(OtaStatus[0]) { 636af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 637b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaProvisionStatusChanged(): RETRIES EXCEEDED"); 638b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 639af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.otaSpcUptime = SystemClock.elapsedRealtime(); 64062995702f659b906127351596305906ccd0d7cb5Freeman Ng if (mInteractive) { 64162995702f659b906127351596305906ccd0d7cb5Freeman Ng otaShowSpcErrorNotice(OTA_SPC_TIMEOUT); 64262995702f659b906127351596305906ccd0d7cb5Freeman Ng } else { 64362995702f659b906127351596305906ccd0d7cb5Freeman Ng sendOtaspResult(OTASP_FAILURE_SPC_RETRIES); 64462995702f659b906127351596305906ccd0d7cb5Freeman Ng } 645af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Power.shutdown(); 646af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 64765336771f727928a14d1d8fe175390ef7a06f71dWink Saville 648af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 64965336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): DONE, isOtaCallCommitted set to true"); 650b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 651b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaProvisionData.isOtaCallCommitted = true; 65265336771f727928a14d1d8fe175390ef7a06f71dWink Saville break; 65365336771f727928a14d1d8fe175390ef7a06f71dWink Saville 65465336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 65565336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 65665336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 65765336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 65865336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 65965336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 66065336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 66165336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 66265336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 66365336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 66465336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): change to ProgressScreen"); 665b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 66665336771f727928a14d1d8fe175390ef7a06f71dWink Saville break; 66765336771f727928a14d1d8fe175390ef7a06f71dWink Saville 66865336771f727928a14d1d8fe175390ef7a06f71dWink Saville default: 66965336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): Ignoring OtaStatus " + OtaStatus[0]); 670af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 671af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 672af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 673af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 674b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 675b154630235935e1aab2a41eff9ed794d40084a02David Brown * Handle a disconnect event from the OTASP call. 676b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 677b154630235935e1aab2a41eff9ed794d40084a02David Brown public void onOtaspDisconnect() { 678b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaspDisconnect()..."); 679b154630235935e1aab2a41eff9ed794d40084a02David Brown // We only handle this event explicitly in non-interactive mode. 680b154630235935e1aab2a41eff9ed794d40084a02David Brown // (In interactive mode, the InCallScreen does any post-disconnect 681b154630235935e1aab2a41eff9ed794d40084a02David Brown // cleanup.) 682b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 683b154630235935e1aab2a41eff9ed794d40084a02David Brown // Send a success or failure indication back to our caller. 684b154630235935e1aab2a41eff9ed794d40084a02David Brown updateNonInteractiveOtaSuccessFailure(); 685b154630235935e1aab2a41eff9ed794d40084a02David Brown } 686b154630235935e1aab2a41eff9ed794d40084a02David Brown } 687b154630235935e1aab2a41eff9ed794d40084a02David Brown 688af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowHome() { 6897c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowHome()..."); 690af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 691af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 6924a5a966f0d43e04d336be1b94182346399a931f6Wink Saville mInCallScreen.endInCallScreenSession(); 693af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville Intent intent = new Intent(Intent.ACTION_MAIN); 694af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville intent.addCategory (Intent.CATEGORY_HOME); 695af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 696af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.startActivity(intent); 697af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 698af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 699af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 70013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void otaSkipActivation() { 70113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("otaSkipActivation()..."); 70213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 703b154630235935e1aab2a41eff9ed794d40084a02David Brown sendOtaspResult(OTASP_USER_SKIPPED); 70413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 705b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) mInCallScreen.finish(); 70613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return; 70713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 70813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 709b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 710b154630235935e1aab2a41eff9ed794d40084a02David Brown * Actually initiate the OTASP call. This method is triggered by the 711b154630235935e1aab2a41eff9ed794d40084a02David Brown * onscreen "Activate" button, and is only used in interactive mode. 712b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 71313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void otaPerformActivation() { 71413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("otaPerformActivation()..."); 715b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 716b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 717b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaPerformActivation: not interactive!"); 718b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 719b154630235935e1aab2a41eff9ed794d40084a02David Brown } 720b154630235935e1aab2a41eff9ed794d40084a02David Brown 72113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 722211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // Place an outgoing call to the special OTASP number: 72313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng Intent newIntent = new Intent(Intent.ACTION_CALL); 72465454c803eb305c4740885ad4995a871b034a58aDavid Brown newIntent.setData(Uri.fromParts(Constants.SCHEME_TEL, OTASP_NUMBER, null)); 72575e3711d82d0c98444f6c438437cad41d862fca6David Brown 72675e3711d82d0c98444f6c438437cad41d862fca6David Brown // Initiate the outgoing call: 727211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mApplication.callController.placeCall(newIntent); 72875e3711d82d0c98444f6c438437cad41d862fca6David Brown 72975e3711d82d0c98444f6c438437cad41d862fca6David Brown // ...and get the in-call UI into the right state. 73013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaShowListeningScreen(); 7317c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mInCallScreen.requestUpdateScreen(); 73213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 73313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return; 73413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 73513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 736af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 737af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show Activation Screen when phone powers up and OTA provision is 738af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * required. Also shown when activation fails and user needs 73913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng * to re-attempt it. Contains ACTIVATE and SKIP buttons 74013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng * which allow user to start OTA activation or skip the activation process. 741af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 742af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowActivateScreen() { 7437c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowActivateScreen()..."); 744af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.otaShowActivationScreen 745af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == OTA_SHOW_ACTIVATION_SCREEN_ON) { 7467c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowActivateScreen(): show activation screen"); 747e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 748af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 74913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setVisibility(mIsWizardMode ? 75057a38778e8c9f58b24cea1062e451934cadc4b3dJim Miller View.VISIBLE : View.INVISIBLE); 751af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.VISIBLE); 752af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.VISIBLE); 753af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 754af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 755af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION; 756af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 7577c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowActivateScreen(): show home screen"); 758af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowHome(); 759af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 760af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 761af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 762af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 763af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show "Listen for Instruction" screen during OTA call. Shown when OTA Call 764af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * is initiated and user needs to listen for network instructions and press 765af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * appropriate DTMF digits to proceed to the "Programming in Progress" phase. 766af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 767af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowListeningScreen() { 768b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowListeningScreen()..."); 769b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 770b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 771b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowListeningScreen: not interactive!"); 772b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 773b154630235935e1aab2a41eff9ed794d40084a02David Brown } 774b154630235935e1aab2a41eff9ed794d40084a02David Brown 775af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.otaShowListeningScreen 776af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == OTA_SHOW_LISTENING_SCREEN_ON) { 7777c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowListeningScreen(): show listening screen"); 778e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 779af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 7807c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaWidgetData.otaTextListenProgress.setVisibility(View.VISIBLE); 781af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_listen); 782986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaDtmfDialerView.setVisibility(View.VISIBLE); 783af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 784986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 785a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 786a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 787af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 788af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 789af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING; 790af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 7917c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowListeningScreen(): show progress screen"); 792af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowInProgressScreen(); 793af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 794af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 795af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 796af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 797b154630235935e1aab2a41eff9ed794d40084a02David Brown * Do any necessary updates (of onscreen UI, for example) 798b154630235935e1aab2a41eff9ed794d40084a02David Brown * based on the latest status of the OTASP call. 799b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 800b154630235935e1aab2a41eff9ed794d40084a02David Brown private void updateOtaspProgress() { 801b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("updateOtaspProgress()... mInteractive = " + mInteractive); 802b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) { 803b154630235935e1aab2a41eff9ed794d40084a02David Brown // On regular phones we just call through to 804b154630235935e1aab2a41eff9ed794d40084a02David Brown // otaShowInProgressScreen(), which updates the 805b154630235935e1aab2a41eff9ed794d40084a02David Brown // InCallScreen's onscreen UI. 806b154630235935e1aab2a41eff9ed794d40084a02David Brown otaShowInProgressScreen(); 807b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 808b154630235935e1aab2a41eff9ed794d40084a02David Brown // We're not using the InCallScreen to show OTA progress. 809b154630235935e1aab2a41eff9ed794d40084a02David Brown 810b154630235935e1aab2a41eff9ed794d40084a02David Brown // For now, at least, there's nothing to do here. 811b154630235935e1aab2a41eff9ed794d40084a02David Brown // The overall "success" or "failure" indication we send back 812b154630235935e1aab2a41eff9ed794d40084a02David Brown // (to our caller) is triggered by the DISCONNECT event; 813b154630235935e1aab2a41eff9ed794d40084a02David Brown // see updateNonInteractiveOtaSuccessFailure(). 814b154630235935e1aab2a41eff9ed794d40084a02David Brown 815b154630235935e1aab2a41eff9ed794d40084a02David Brown // But if we ever need to send *intermediate* progress updates back 816b154630235935e1aab2a41eff9ed794d40084a02David Brown // to our caller, we'd do that here, possbily using the same 817b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent that we already use to indicate success or failure. 818b154630235935e1aab2a41eff9ed794d40084a02David Brown } 819b154630235935e1aab2a41eff9ed794d40084a02David Brown } 820b154630235935e1aab2a41eff9ed794d40084a02David Brown 821b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 822b154630235935e1aab2a41eff9ed794d40084a02David Brown * When a non-interactive OTASP call completes, send a success or 823b154630235935e1aab2a41eff9ed794d40084a02David Brown * failure indication back to our caller. 824b154630235935e1aab2a41eff9ed794d40084a02David Brown * 825b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is basically the non-interactive equivalent of 826b154630235935e1aab2a41eff9ed794d40084a02David Brown * otaShowSuccessFailure(). 827b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 828b154630235935e1aab2a41eff9ed794d40084a02David Brown private void updateNonInteractiveOtaSuccessFailure() { 829b154630235935e1aab2a41eff9ed794d40084a02David Brown // This is basically the same logic as otaShowSuccessFailure(): we 830b154630235935e1aab2a41eff9ed794d40084a02David Brown // check the isOtaCallCommitted bit, and if that's true it means 831b154630235935e1aab2a41eff9ed794d40084a02David Brown // that activation was successful. 832b154630235935e1aab2a41eff9ed794d40084a02David Brown 833b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("updateNonInteractiveOtaSuccessFailure(): isOtaCallCommitted = " 834b154630235935e1aab2a41eff9ed794d40084a02David Brown + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 835b154630235935e1aab2a41eff9ed794d40084a02David Brown int resultCode = 836b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaProvisionData.isOtaCallCommitted 837b154630235935e1aab2a41eff9ed794d40084a02David Brown ? OTASP_SUCCESS : OTASP_FAILURE; 838b154630235935e1aab2a41eff9ed794d40084a02David Brown sendOtaspResult(resultCode); 839b154630235935e1aab2a41eff9ed794d40084a02David Brown } 840b154630235935e1aab2a41eff9ed794d40084a02David Brown 841b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 842b154630235935e1aab2a41eff9ed794d40084a02David Brown * Sends the specified OTASP result code back to our caller (presumably 843b154630235935e1aab2a41eff9ed794d40084a02David Brown * SetupWizard) via the PendingIntent that they originally sent along with 844b154630235935e1aab2a41eff9ed794d40084a02David Brown * the ACTION_PERFORM_CDMA_PROVISIONING intent. 845b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 846b154630235935e1aab2a41eff9ed794d40084a02David Brown private void sendOtaspResult(int resultCode) { 847b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("sendOtaspResult: resultCode = " + resultCode); 848b154630235935e1aab2a41eff9ed794d40084a02David Brown 849b154630235935e1aab2a41eff9ed794d40084a02David Brown // Pass the success or failure indication back to our caller by 850b154630235935e1aab2a41eff9ed794d40084a02David Brown // adding an additional extra to the PendingIntent we already 851b154630235935e1aab2a41eff9ed794d40084a02David Brown // have. 852b154630235935e1aab2a41eff9ed794d40084a02David Brown // (NB: there's a PendingIntent send() method that takes a resultCode 853b154630235935e1aab2a41eff9ed794d40084a02David Brown // directly, but we can't use that here since that call is only 854b154630235935e1aab2a41eff9ed794d40084a02David Brown // meaningful for pending intents that are actually used as activity 855b154630235935e1aab2a41eff9ed794d40084a02David Brown // results.) 856b154630235935e1aab2a41eff9ed794d40084a02David Brown 857b154630235935e1aab2a41eff9ed794d40084a02David Brown Intent extraStuff = new Intent(); 858b154630235935e1aab2a41eff9ed794d40084a02David Brown extraStuff.putExtra(EXTRA_OTASP_RESULT_CODE, resultCode); 859b154630235935e1aab2a41eff9ed794d40084a02David Brown // When we call PendingIntent.send() below, the extras from this 860b154630235935e1aab2a41eff9ed794d40084a02David Brown // intent will get merged with any extras already present in 861b154630235935e1aab2a41eff9ed794d40084a02David Brown // cdmaOtaScreenState.otaspResultCodePendingIntent. 862b154630235935e1aab2a41eff9ed794d40084a02David Brown 863b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mApplication.cdmaOtaScreenState == null) { 864b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.e(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: no cdmaOtaScreenState object!"); 865b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 866b154630235935e1aab2a41eff9ed794d40084a02David Brown } 867b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent == null) { 868b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: " 869b154630235935e1aab2a41eff9ed794d40084a02David Brown + "null otaspResultCodePendingIntent!"); 870b154630235935e1aab2a41eff9ed794d40084a02David Brown // This *should* never happen, since SetupWizard always passes this 871b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent along with the ACTION_PERFORM_CDMA_PROVISIONING 872b154630235935e1aab2a41eff9ed794d40084a02David Brown // intent. 873b154630235935e1aab2a41eff9ed794d40084a02David Brown // (But if this happens it's not a fatal error, it just means that 874b154630235935e1aab2a41eff9ed794d40084a02David Brown // our original caller has no way of finding out whether the OTASP 875b154630235935e1aab2a41eff9ed794d40084a02David Brown // call ultimately failed or succeeded...) 876b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 877b154630235935e1aab2a41eff9ed794d40084a02David Brown } 878b154630235935e1aab2a41eff9ed794d40084a02David Brown 879b154630235935e1aab2a41eff9ed794d40084a02David Brown try { 880b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- sendOtaspResult: SENDING PENDING INTENT: " + 881b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent); 882b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent.send( 883b154630235935e1aab2a41eff9ed794d40084a02David Brown mContext, 884b154630235935e1aab2a41eff9ed794d40084a02David Brown 0, /* resultCode (unused) */ 885b154630235935e1aab2a41eff9ed794d40084a02David Brown extraStuff); 886b154630235935e1aab2a41eff9ed794d40084a02David Brown } catch (CanceledException e) { 887b154630235935e1aab2a41eff9ed794d40084a02David Brown // should never happen because no code cancels the pending intent right now, 888b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.e(LOG_TAG, "PendingIntent send() failed: " + e); 889b154630235935e1aab2a41eff9ed794d40084a02David Brown } 890b154630235935e1aab2a41eff9ed794d40084a02David Brown } 891b154630235935e1aab2a41eff9ed794d40084a02David Brown 892b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 893af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show "Programming In Progress" screen during OTA call. Shown when OTA 894af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * provisioning is in progress after user has selected an option. 895af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 896af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowInProgressScreen() { 897b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowInProgressScreen()..."); 898b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 899b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 900b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowInProgressScreen: not interactive!"); 901b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 902b154630235935e1aab2a41eff9ed794d40084a02David Brown } 903b154630235935e1aab2a41eff9ed794d40084a02David Brown 904211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mApplication.cdmaOtaScreenState.otaScreenState = 905211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS; 906211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 907211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if ((mOtaWidgetData == null) || (mInCallScreen == null)) { 908211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown Log.w(LOG_TAG, "otaShowInProgressScreen: UI widgets not set up yet!"); 909211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 910211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // TODO(OTASP): our CdmaOtaScreenState is now correct; we just set 911211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // it to OTA_STATUS_PROGRESS. But we still need to make sure that 912211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // when the InCallScreen eventually comes to the foreground, it 913211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown // notices that state and does all the same UI updating we do below. 914211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown return; 915211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 916211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown 917e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 918af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 9197c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaWidgetData.otaTextListenProgress.setVisibility(View.VISIBLE); 920af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_progress); 921af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setVisibility(View.VISIBLE); 922af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 9239bd141ba20a6cf6dcb745aca6c5c05a9c88f3a98Jim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 924a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 925a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 926af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 927af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 928af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 929af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 930af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming failure dialog when OTA provisioning fails. 931af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * If OTA provisioning attempts fail more than 3 times, then unsuccessful 932af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * dialog is shown. Otherwise a two-second notice is shown with unsuccessful 933af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * information. When notice expires, phone returns to activation screen. 934af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 935986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void otaShowProgramFailure(int length) { 9367c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowProgramFailure()..."); 937af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.activationCount++; 938af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if ((mApplication.cdmaOtaProvisionData.activationCount < 939af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivateFailTimes) 940af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville && (mApplication.cdmaOtaConfigData.otaShowActivationScreen == 941af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_SHOW_ACTIVATION_SCREEN_ON)) { 9427c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowProgramFailure(): activationCount" 943af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaProvisionData.activationCount); 9447c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowProgramFailure(): show failure notice"); 945af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailureNotice(length); 946af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 9477c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowProgramFailure(): show failure dialog"); 948af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailureDialog(); 949af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 950af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 951af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 952af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 953af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show either programming success dialog when OTA provisioning succeeds, or 954f0d315541b1b1f33fab5e7952471da6e886b53efWink Saville * programming failure dialog when it fails. See {@link #otaShowProgramFailure} 955af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * for more details. 956af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 957af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowSuccessFailure() { 958b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowSuccessFailure()..."); 959b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 960b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 961b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowSuccessFailure: not interactive!"); 962b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 963b154630235935e1aab2a41eff9ed794d40084a02David Brown } 964b154630235935e1aab2a41eff9ed794d40084a02David Brown 965af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 9667c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowSuccessFailure(): isOtaCallCommitted" 967af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 968af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.isOtaCallCommitted) { 9697c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowSuccessFailure(), show success dialog"); 970af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramSuccessDialog(); 971af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 9727c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowSuccessFailure(), show failure dialog"); 973af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailure(OTA_FAILURE_DIALOG_TIMEOUT); 974af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 975af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 976af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 977af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 978af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 979af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming failure dialog when OTA provisioning fails more than 3 980af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * times. 981af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 982af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramFailureDialog() { 9837c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowProgramFailureDialog()..."); 984af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 985af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 986986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_problem_with_activation); 987af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 988af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_unsuccessful); 989af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 990986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setVisibility(View.VISIBLE); 991af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 992e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 9937c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaCallCardDtmfDialer.closeDialer(false); 994af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 995af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 996af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 997af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 998af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming success dialog when OTA provisioning succeeds. 999af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1000af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramSuccessDialog() { 10017c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowProgramSuccessDialog()..."); 1002af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 1003af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 1004986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate_success); 1005af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 1006af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_successful); 1007af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 1008986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setVisibility(View.VISIBLE); 1009af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 1010e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 10117c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaCallCardDtmfDialer.closeDialer(false); 1012af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1013af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1014af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1015af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1016af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show SPC failure notice when SPC attempts exceed 15 times. 1017af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * During OTA provisioning, if SPC code is incorrect OTA provisioning will 1018af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * fail. When SPC attempts are over 15, it shows SPC failure notice for one minute and 1019af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * then phone will power down. 1020af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1021af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowSpcErrorNotice(int length) { 10227c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowSpcErrorNotice()..."); 1023af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.spcErrorDialog == null) { 1024af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.inOtaSpcState = true; 1025af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville DialogInterface.OnKeyListener keyListener; 1026af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville keyListener = new DialogInterface.OnKeyListener() { 1027af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 1028af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville log("Ignoring key events..."); 1029af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return true; 1030af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville }}; 1031af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog = new AlertDialog.Builder(mInCallScreen) 1032af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setMessage(R.string.ota_spc_failure) 1033af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setOnKeyListener(keyListener) 1034af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .create(); 1035af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.getWindow().addFlags( 1036af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 1037af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 1038af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.show(); 1039af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 1040e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 10417c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaCallCardDtmfDialer.closeDialer(false); 1042af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1043af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long noticeTime = length*1000; 10447c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowSpcErrorNotice(), remaining SPC noticeTime" + noticeTime); 1045325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown mInCallScreen.requestCloseSpcErrorNotice(noticeTime); 1046af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1047af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1048af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1049af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1050af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * When SPC notice times out, force phone to power down. 1051af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1052af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaCloseSpcNotice() { 105317c36a10d09fac3e2312c0bcb839e0a704f42105w if (DBG) log("onOtaCloseSpcNotice(), send shutdown intent"); 105417c36a10d09fac3e2312c0bcb839e0a704f42105w Intent shutdown = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); 105517c36a10d09fac3e2312c0bcb839e0a704f42105w shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM, false); 105617c36a10d09fac3e2312c0bcb839e0a704f42105w shutdown.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 105717c36a10d09fac3e2312c0bcb839e0a704f42105w mContext.startActivity(shutdown); 1058af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1059af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1060af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1061af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show two-second notice when OTA provisioning fails and number of failed attempts 1062af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * is less then 3. 1063af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1064af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramFailureNotice(int length) { 10657c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("otaShowProgramFailureNotice()..."); 1066af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog == null) { 1067af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = new AlertDialog.Builder(mInCallScreen) 1068af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setMessage(R.string.ota_failure) 1069af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .create(); 1070af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.getWindow().addFlags( 1071af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 1072af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 1073af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.show(); 1074af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1075af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long noticeTime = length*1000; 1076325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown mInCallScreen.requestCloseOtaFailureNotice(noticeTime); 1077af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1078af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1079af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1080af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1081af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle OTA unsuccessful notice expiry. Dismisses the 1082af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * two-second notice and shows the activation screen. 1083af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1084af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaCloseFailureNotice() { 1085af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("onOtaCloseFailureNotice()..."); 1086af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog != null) { 1087af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.dismiss(); 1088af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = null; 1089af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1090af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateScreen(); 1091af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1092af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1093af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1094af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Initialize all OTA UI elements to be gone. Also set inCallPanel, 10958df5c508da2c836b841ee24120fa7c5cc92df387David Brown * callCard and the dialpad handle to be gone. This is called before any OTA screen 1096af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * gets drawn. 1097af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1098af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaScreenInitialize() { 1099b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaScreenInitialize()..."); 1100b154630235935e1aab2a41eff9ed794d40084a02David Brown 1101b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 1102b154630235935e1aab2a41eff9ed794d40084a02David Brown // We should never be doing anything with UI elements in 1103b154630235935e1aab2a41eff9ed794d40084a02David Brown // non-interactive mode. 1104b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaScreenInitialize: not interactive!"); 1105b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 1106b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1107af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1108af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallPanel != null) mInCallPanel.setVisibility(View.GONE); 1109af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mCallCard != null) mCallCard.hideCallCardElements(); 1110af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1111986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate); 1112af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 11137c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaWidgetData.otaTextListenProgress.setVisibility(View.GONE); 1114af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 1115af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 1116af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 1117af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 1118af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 1119986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 1120986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.GONE); 1121986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 1122986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 11237c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaWidgetData.otaUpperWidgets.setVisibility(View.VISIBLE); 112413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setVisibility(View.VISIBLE); 1125af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1126af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1127af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void hideOtaScreen() { 1128af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("hideOtaScreen()..."); 1129af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1130af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 1131af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 1132af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 11337c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaWidgetData.otaUpperWidgets.setVisibility(View.GONE); 1134af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1135af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1136e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman public boolean isDialerOpened() { 11377c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown boolean retval = (mOtaCallCardDtmfDialer != null && mOtaCallCardDtmfDialer.isOpened()); 11387c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("- isDialerOpened() ==> " + retval); 11397c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown return retval; 1140e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } 1141e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman 1142af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1143af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show the appropriate OTA screen based on the current state of OTA call. 1144b154630235935e1aab2a41eff9ed794d40084a02David Brown * 1145b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is called from the InCallScreen when the screen needs to be 1146b154630235935e1aab2a41eff9ed794d40084a02David Brown * refreshed (and thus is only ever used in interactive mode.) 1147af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1148af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowProperScreen() { 1149af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("otaShowProperScreen()..."); 1150b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 1151b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 1152b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowProperScreen: not interactive!"); 1153b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 1154b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1155b154630235935e1aab2a41eff9ed794d40084a02David Brown 1156211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if ((mInCallScreen != null) && mInCallScreen.isForegroundActivity()) { 1157211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("otaShowProperScreen(): InCallScreen in foreground, currentstate = " 1158af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaScreenState.otaScreenState); 1159af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallPanel != null) { 1160af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallPanel.setVisibility(View.GONE); 1161af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1162af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaScreenState.otaScreenState 1163af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION) { 1164af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateScreen(); 1165af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else if (mApplication.cdmaOtaScreenState.otaScreenState 1166af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING) { 1167af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowListeningScreen(); 1168af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else if (mApplication.cdmaOtaScreenState.otaScreenState 1169af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS) { 1170af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowInProgressScreen(); 1171af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1172af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1173af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1174af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowSpcErrorNotice(getOtaSpcDisplayTime()); 1175af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1176af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1177af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1178af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1179af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1180af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Read configuration values for each OTA screen from config.xml. 1181af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * These configuration values control visibility of each screen. 1182af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1183af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void readXmlSettings() { 1184af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings()..."); 1185af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.configComplete) { 1186af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 1187af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1188af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1189af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.configComplete = true; 1190af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowActivationScreen = 1191af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowActivationScreen); 1192af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivationScreen = tmpOtaShowActivationScreen; 11937c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("readXmlSettings(), otaShowActivationScreen = " 1194af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowActivationScreen); 1195af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1196af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowListeningScreen = 1197af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowListeningScreen); 1198af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowListeningScreen = tmpOtaShowListeningScreen; 11997c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("readXmlSettings(), otaShowListeningScreen = " 1200af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowListeningScreen); 1201af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1202af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowActivateFailTimes = 1203af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowActivateFailTimes); 1204af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivateFailTimes = tmpOtaShowActivateFailTimes; 12057c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("readXmlSettings(), otaShowActivateFailTimes = " 1206af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowActivateFailTimes); 1207af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1208af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaPlaySuccessFailureTone = 1209af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaPlaySuccessFailureTone); 1210af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone = tmpOtaPlaySuccessFailureTone; 12117c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown if (DBG) log("readXmlSettings(), otaPlaySuccessFailureTone = " 1212af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone); 1213af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1214af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1215af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1216af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle the click events for OTA buttons. 1217af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1218af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onClickHandler(int id) { 1219af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville switch (id) { 1220af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaEndButton: 1221af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaEndButton(); 1222af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 1223af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1224af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaSpeakerButton: 1225af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaSpeakerButton(); 1226af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 1227af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1228af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaActivateButton: 1229af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaActivateButton(); 1230af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 1231af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 123213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng case R.id.otaSkipButton: 123313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng onClickOtaActivateSkipButton(); 1234af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 1235af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1236986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller case R.id.otaNextButton: 1237986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller onClickOtaActivateNextButton(); 1238af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 1239af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1240986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller case R.id.otaTryAgainButton: 1241986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller onClickOtaTryAgainButton(); 1242af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 1243af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1244af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville default: 1245af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log ("onClickHandler: received a click event for unrecognized id"); 1246af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 1247af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1248af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1249af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1250986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void onClickOtaTryAgainButton() { 1251986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Activation Try Again Clicked!"); 1252986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1253986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller otaShowActivateScreen(); 1254986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller } 1255986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller } 1256986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1257af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaEndButton() { 1258986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Activation End Call Button Clicked!"); 1259af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 12608343169cc89621d46dce86449f5ee1ff5d3a4919John Wang if (PhoneUtils.hangup(mApplication.mCM) == false) { 1261a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // If something went wrong when placing the OTA call, 1262a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // the screen is not updated by the call disconnect 1263a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // handler and we have to do it here 1264a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent setSpeaker(false); 1265a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mInCallScreen.handleOtaCallEnd(); 1266a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent } 1267af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1268af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1269af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1270af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaSpeakerButton() { 1271af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OTA Speaker button Clicked!"); 1272af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1273af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville boolean isChecked = !PhoneUtils.isSpeakerOn(mContext); 1274af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville setSpeaker(isChecked); 1275af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1276af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1277af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1278af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaActivateButton() { 1279af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("Call Activation Clicked!"); 128013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaPerformActivation(); 1281af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1282af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 128313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void onClickOtaActivateSkipButton() { 128413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("Activation Skip Clicked!"); 128513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng DialogInterface.OnKeyListener keyListener; 128613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng keyListener = new DialogInterface.OnKeyListener() { 128713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public boolean onKey(DialogInterface dialog, int keyCode, 128813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng KeyEvent event) { 128913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("Ignoring key events..."); 129013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return true; 129113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 129213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }; 129313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipConfirmationDialog = new AlertDialog.Builder(mInCallScreen) 129413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setTitle(R.string.ota_skip_activation_dialog_title) 129513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setMessage(R.string.ota_skip_activation_dialog_message) 129613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setPositiveButton( 1297d23dc59768909d8e18b42c908764c7d340935796David Brown android.R.string.ok, 1298d23dc59768909d8e18b42c908764c7d340935796David Brown // "OK" means "skip activation". 129913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng new AlertDialog.OnClickListener() { 130013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public void onClick(DialogInterface dialog, int which) { 130113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaSkipActivation(); 130213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 130313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }) 130413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setNegativeButton( 1305d23dc59768909d8e18b42c908764c7d340935796David Brown android.R.string.cancel, 1306d23dc59768909d8e18b42c908764c7d340935796David Brown // "Cancel" means just dismiss the dialog. 1307d23dc59768909d8e18b42c908764c7d340935796David Brown // Don't actually start an activation call. 1308d23dc59768909d8e18b42c908764c7d340935796David Brown null) 130913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setOnKeyListener(keyListener) 131013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .create(); 131113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipConfirmationDialog.show(); 1312af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1313af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1314986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void onClickOtaActivateNextButton() { 1315986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Dialog Next Clicked!"); 1316af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1317af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 1318af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 1319af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowHome(); 1320af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1321af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1322af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1323af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void dismissAllOtaDialogs() { 1324211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (mOtaWidgetData != null) { 1325211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (mOtaWidgetData.spcErrorDialog != null) { 1326211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("- DISMISSING mSpcErrorDialog."); 1327211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mOtaWidgetData.spcErrorDialog.dismiss(); 1328211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mOtaWidgetData.spcErrorDialog = null; 1329211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 1330211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (mOtaWidgetData.otaFailureDialog != null) { 1331211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (DBG) log("- DISMISSING mOtaFailureDialog."); 1332211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mOtaWidgetData.otaFailureDialog.dismiss(); 1333211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown mOtaWidgetData.otaFailureDialog = null; 1334211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown } 1335af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1336af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1337af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1338af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private int getOtaSpcDisplayTime() { 1339af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("getOtaSpcDisplayTime()..."); 1340af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpSpcTime = 1; 1341af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1342af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long tmpOtaSpcRunningTime = 0; 1343af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long tmpOtaSpcLeftTime = 0; 1344af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcRunningTime = SystemClock.elapsedRealtime(); 1345af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcLeftTime = 1346af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcRunningTime - mApplication.cdmaOtaProvisionData.otaSpcUptime; 134717c36a10d09fac3e2312c0bcb839e0a704f42105w if (tmpOtaSpcLeftTime >= OTA_SPC_TIMEOUT*1000) { 1348af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpSpcTime = 1; 1349af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 1350af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpSpcTime = OTA_SPC_TIMEOUT - (int)tmpOtaSpcLeftTime/1000; 1351af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1352af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1353af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("getOtaSpcDisplayTime(), time for SPC error notice: " + tmpSpcTime); 1354af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return tmpSpcTime; 1355af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1356af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1357af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1358af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Initialize the OTA widgets for all OTA screens. 1359af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1360af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void initOtaInCallScreen() { 1361af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("initOtaInCallScreen()..."); 1362986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle = (TextView) mInCallScreen.findViewById(R.id.otaTitle); 1363af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate = (TextView) mInCallScreen.findViewById(R.id.otaActivate); 1364af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 1365af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress = 1366af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (TextView) mInCallScreen.findViewById(R.id.otaListenProgress); 1367af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar = 1368af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (ProgressBar) mInCallScreen.findViewById(R.id.progress_large); 1369af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setIndeterminate(true); 1370af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail = 1371af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (TextView) mInCallScreen.findViewById(R.id.otaSuccessFailStatus); 1372af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 13737c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaWidgetData.otaUpperWidgets = 13747c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown (ViewGroup) mInCallScreen.findViewById(R.id.otaUpperWidgets); 1375af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress = 1376af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaListenProgress); 1377af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate = 1378af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaActivate); 1379af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess = 1380af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaFailOrSuccessful); 1381af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1382af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaEndButton = (Button) mInCallScreen.findViewById(R.id.otaEndButton); 1383af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaEndButton.setOnClickListener(mInCallScreen); 1384af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaSpeakerButton = 1385af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (ToggleButton) mInCallScreen.findViewById(R.id.otaSpeakerButton); 1386af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaSpeakerButton.setOnClickListener(mInCallScreen); 1387af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaActivateButton = 1388af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (Button) mInCallScreen.findViewById(R.id.otaActivateButton); 1389af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaActivateButton.setOnClickListener(mInCallScreen); 139013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton = (Button) mInCallScreen.findViewById(R.id.otaSkipButton); 139113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setOnClickListener(mInCallScreen); 1392986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton = (Button) mInCallScreen.findViewById(R.id.otaNextButton); 1393986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setOnClickListener(mInCallScreen); 1394986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton = 1395986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller (Button) mInCallScreen.findViewById(R.id.otaTryAgainButton); 1396986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setOnClickListener(mInCallScreen); 1397a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 1398dfa83d531cdb88513f09e913424b7a16628b37d3David Brown mOtaWidgetData.otaDtmfDialerView = 13997c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown (DTMFTwelveKeyDialerView) mInCallScreen.findViewById(R.id.otaDtmfDialerView); 14007c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown // Sanity-check: the otaDtmfDialerView widget should *always* be present. 1401dfa83d531cdb88513f09e913424b7a16628b37d3David Brown if (mOtaWidgetData.otaDtmfDialerView == null) { 14027c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown throw new IllegalStateException("initOtaInCallScreen: couldn't find otaDtmfDialerView"); 1403af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 14042f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 14052f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // Create a new DTMFTwelveKeyDialer instance purely for use by the 14062f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // DTMFTwelveKeyDialerView ("otaDtmfDialerView") that comes from 14072f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // otacall_card.xml. 14082f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaCallCardDtmfDialer = new DTMFTwelveKeyDialer(mInCallScreen, 14094ba332e62c4d54b2623ccdc59fafd46ecba08cf0David Brown mOtaWidgetData.otaDtmfDialerView); 14102f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 14112f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // Initialize the new DTMFTwelveKeyDialer instance. This is 14122f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // needed to play local DTMF tones. 14132f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaCallCardDtmfDialer.startDialerSession(); 14142f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 14152f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaWidgetData.otaDtmfDialerView.setDialer(mOtaCallCardDtmfDialer); 1416af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1417af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1418af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1419af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Clear out all OTA UI widget elements. Needs to get called 1420af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * when OTA call ends or InCallScreen is destroyed. 14214a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * @param disableSpeaker parameter control whether Speaker should be turned off. 1422af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 14234a5a966f0d43e04d336be1b94182346399a931f6Wink Saville public void cleanOtaScreen(boolean disableSpeaker) { 1424af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OTA ends, cleanOtaScreen!"); 1425af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1426986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaScreenState.otaScreenState = 1427986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 1428986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.isOtaCallCommitted = false; 1429986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 1430986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.inOtaSpcState = false; 1431986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.activationCount = 0; 1432986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.otaSpcUptime = 0; 14335c0517ae3c17505ffd466be79ab0026b7fe6c959Wink Saville mApplication.cdmaOtaInCallScreenUiState.state = State.UNDEFINED; 1434986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1435211ff4c5c95f63f845b953f0020dfb516c01fcadDavid Brown if (mInteractive && (mOtaWidgetData != null)) { 1436b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInCallPanel != null) mInCallPanel.setVisibility(View.VISIBLE); 1437b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mCallCard != null) mCallCard.hideCallCardElements(); 1438986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1439b154630235935e1aab2a41eff9ed794d40084a02David Brown // Free resources from the DTMFTwelveKeyDialer instance we created 1440b154630235935e1aab2a41eff9ed794d40084a02David Brown // in initOtaInCallScreen(). 1441b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mOtaCallCardDtmfDialer != null) { 1442b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaCallCardDtmfDialer.stopDialerSession(); 1443b154630235935e1aab2a41eff9ed794d40084a02David Brown } 14442f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 1445b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 14467c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaWidgetData.otaTextListenProgress.setVisibility(View.GONE); 1447b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 1448b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 1449b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 1450b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 1451b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 14527c8cb32060a685b2f20c1e0cf181fc392be840e0David Brown mOtaWidgetData.otaUpperWidgets.setVisibility(View.GONE); 1453b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 1454b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 1455b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 1456b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1457a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 1458a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // turn off the speaker in case it was turned on 1459a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // but the OTA call could not be completed 14604a5a966f0d43e04d336be1b94182346399a931f6Wink Saville if (disableSpeaker) { 14614a5a966f0d43e04d336be1b94182346399a931f6Wink Saville setSpeaker(false); 14624a5a966f0d43e04d336be1b94182346399a931f6Wink Saville } 1463af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1464af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1465af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1466af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Defines OTA information that needs to be maintained during 1467af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * an OTA call when display orientation changes. 1468af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1469af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaProvisionData { 1470af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean isOtaCallCommitted; 1471af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean isOtaCallIntentProcessed; 1472af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean inOtaSpcState; 1473af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int activationCount; 1474af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public long otaSpcUptime; 1475af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1476af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1477af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1478af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Defines OTA screen configuration items read from config.xml 1479af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * and used to control OTA display. 1480af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1481af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaConfigData { 1482af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowActivationScreen; 1483af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowListeningScreen; 1484af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowActivateFailTimes; 1485af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaPlaySuccessFailureTone; 1486af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean configComplete; 1487af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public CdmaOtaConfigData() { 1488af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("CdmaOtaConfigData constructor!"); 1489af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivationScreen = OTA_SHOW_ACTIVATION_SCREEN_OFF; 1490af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowListeningScreen = OTA_SHOW_LISTENING_SCREEN_OFF; 1491af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateFailTimes = OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF; 1492af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaPlaySuccessFailureTone = OTA_PLAY_SUCCESS_FAILURE_TONE_OFF; 1493af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1494af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1495af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1496af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1497f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * The state of the OTA InCallScreen UI. 1498f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1499f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public static class CdmaOtaInCallScreenUiState { 1500f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public enum State { 1501f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville UNDEFINED, 1502f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville NORMAL, 1503f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville ENDED 1504f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1505f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1506f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public State state; 1507f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1508f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public CdmaOtaInCallScreenUiState() { 1509f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville if (DBG) log("CdmaOtaInCallScreenState: constructor init to UNDEFINED"); 1510f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville state = CdmaOtaInCallScreenUiState.State.UNDEFINED; 1511f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1512f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1513f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1514f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1515f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * Save the Ota InCallScreen UI state 1516f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1517f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public void setCdmaOtaInCallScreenUiState(CdmaOtaInCallScreenUiState.State state) { 1518f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville if (DBG) log("setCdmaOtaInCallScreenState: " + state); 1519f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville mApplication.cdmaOtaInCallScreenUiState.state = state; 1520f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1521f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1522f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1523f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * Get the Ota InCallScreen UI state 1524f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1525f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public CdmaOtaInCallScreenUiState.State getCdmaOtaInCallScreenUiState() { 1526b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("getCdmaOtaInCallScreenState: " 1527b154630235935e1aab2a41eff9ed794d40084a02David Brown + mApplication.cdmaOtaInCallScreenUiState.state); 1528f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville return mApplication.cdmaOtaInCallScreenUiState.state; 1529f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1530f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1531f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1532af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * The OTA screen state machine. 1533af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1534af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaScreenState { 1535af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public enum OtaScreenState { 1536af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_UNDEFINED, 1537af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_ACTIVATION, 1538af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_LISTENING, 1539af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_PROGRESS, 1540af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_SUCCESS_FAILURE_DLG 1541af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1542af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1543af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public OtaScreenState otaScreenState; 1544af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1545af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public CdmaOtaScreenState() { 1546af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenState = OtaScreenState.OTA_STATUS_UNDEFINED; 1547af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1548b154630235935e1aab2a41eff9ed794d40084a02David Brown 1549b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent used to report an OTASP result status code back 1550b154630235935e1aab2a41eff9ed794d40084a02David Brown // to our caller. 1551b154630235935e1aab2a41eff9ed794d40084a02David Brown // 1552b154630235935e1aab2a41eff9ed794d40084a02David Brown // Our caller (presumably SetupWizard) creates this PendingIntent, 1553b154630235935e1aab2a41eff9ed794d40084a02David Brown // pointing back at itself, and passes it along as an extra with the 1554b154630235935e1aab2a41eff9ed794d40084a02David Brown // ACTION_PERFORM_CDMA_PROVISIONING intent. Then, when there's an 1555b154630235935e1aab2a41eff9ed794d40084a02David Brown // OTASP result to report, we send that PendingIntent back, adding an 1556b154630235935e1aab2a41eff9ed794d40084a02David Brown // extra called EXTRA_OTASP_RESULT_CODE to indicate the result. 1557b154630235935e1aab2a41eff9ed794d40084a02David Brown // 1558b154630235935e1aab2a41eff9ed794d40084a02David Brown // Possible result values are the OTASP_RESULT_* constants. 1559b154630235935e1aab2a41eff9ed794d40084a02David Brown public PendingIntent otaspResultCodePendingIntent; 1560b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1561b154630235935e1aab2a41eff9ed794d40084a02David Brown 1562b154630235935e1aab2a41eff9ed794d40084a02David Brown /** @see com.android.internal.telephony.Phone */ 1563b154630235935e1aab2a41eff9ed794d40084a02David Brown private static String otaProvisionStatusToString(int status) { 1564b154630235935e1aab2a41eff9ed794d40084a02David Brown switch (status) { 1565b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 1566b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SPL_UNLOCKED"; 1567b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 1568b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SPC_RETRIES_EXCEEDED"; 1569b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 1570b154630235935e1aab2a41eff9ed794d40084a02David Brown return "A_KEY_EXCHANGED"; 1571b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 1572b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SSD_UPDATED"; 1573b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 1574b154630235935e1aab2a41eff9ed794d40084a02David Brown return "NAM_DOWNLOADED"; 1575b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 1576b154630235935e1aab2a41eff9ed794d40084a02David Brown return "MDN_DOWNLOADED"; 1577b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 1578b154630235935e1aab2a41eff9ed794d40084a02David Brown return "IMSI_DOWNLOADED"; 1579b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 1580b154630235935e1aab2a41eff9ed794d40084a02David Brown return "PRL_DOWNLOADED"; 1581b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 1582b154630235935e1aab2a41eff9ed794d40084a02David Brown return "COMMITTED"; 1583b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 1584b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_STARTED"; 1585b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 1586b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_STOPPED"; 1587b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 1588b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_ABORTED"; 1589b154630235935e1aab2a41eff9ed794d40084a02David Brown default: 1590b154630235935e1aab2a41eff9ed794d40084a02David Brown return "<unknown status" + status + ">"; 1591b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1592af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1593af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1594af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private static void log(String msg) { 1595af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville Log.d(LOG_TAG, msg); 1596af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1597af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville} 1598