OtaUtils.java revision d5251aa62c211ab6f7b66c877d862131d709bccb
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; 23af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.app.AlertDialog; 2413660626500d047d4a3a097e832bb175e1c4f894Freeman Ngimport android.app.PendingIntent; 2513660626500d047d4a3a097e832bb175e1c4f894Freeman Ngimport android.app.PendingIntent.CanceledException; 26af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.content.Context; 27af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.content.DialogInterface; 28af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.content.Intent; 29af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.os.AsyncResult; 30839b14d460986608fe577f89f789de854dc85b58Jim Millerimport android.os.Handler; 31af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.os.SystemClock; 32af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.util.Log; 33af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.KeyEvent; 34af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.View; 35af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.ViewGroup; 36af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.ViewStub; 37af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.view.WindowManager; 38af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.widget.Button; 39af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.widget.ProgressBar; 40b154630235935e1aab2a41eff9ed794d40084a02David Brownimport android.widget.ScrollView; 41af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savilleimport android.widget.TextView; 42b154630235935e1aab2a41eff9ed794d40084a02David Brownimport android.widget.ToggleButton; 43af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 44af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville/** 45af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handles all OTA Call related logic and UI functionality. 46e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * The InCallScreen interacts with this class to perform an OTA Call. 47e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * 48e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * OTA is a CDMA-specific feature: 49e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * OTA or OTASP == Over The Air service provisioning 50e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * SPC == Service Programming Code 51e31831f42ffa08456ef0d5d1461ddc70b9d1fcfeDavid Brown * TODO: Include pointer to more detailed documentation. 52b154630235935e1aab2a41eff9ed794d40084a02David Brown * 53b154630235935e1aab2a41eff9ed794d40084a02David Brown * TODO: This is Over The Air Service Provisioning (OTASP) 54b154630235935e1aab2a41eff9ed794d40084a02David Brown * A better name would be OtaspUtils.java. 55af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 56af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Savillepublic class OtaUtils { 57af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private static final String LOG_TAG = "OtaUtils"; 585c0517ae3c17505ffd466be79ab0026b7fe6c959Wink Saville private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 1); 59af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 60af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATION_SCREEN_OFF = 0; 61af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATION_SCREEN_ON = 1; 62af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_LISTENING_SCREEN_OFF =0; 63af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_LISTENING_SCREEN_ON =1; 64af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF = 0; 65af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_THREE = 3; 66af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_OFF = 0; 67af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_ON = 1; 68af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 6917c36a10d09fac3e2312c0bcb839e0a704f42105w // SPC Timeout is 60 seconds 7017c36a10d09fac3e2312c0bcb839e0a704f42105w public final int OTA_SPC_TIMEOUT = 60; 71af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public final int OTA_FAILURE_DIALOG_TIMEOUT = 2; 72af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 73b154630235935e1aab2a41eff9ed794d40084a02David Brown // Constants for OTASP-related Intents and intent extras. 74b154630235935e1aab2a41eff9ed794d40084a02David Brown // Watch out: these must agree with the corresponding constants in 75b154630235935e1aab2a41eff9ed794d40084a02David Brown // apps/SetupWizard! 76b154630235935e1aab2a41eff9ed794d40084a02David Brown 77b154630235935e1aab2a41eff9ed794d40084a02David Brown // Intent action to launch an OTASP call. 78b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String ACTION_PERFORM_CDMA_PROVISIONING = 79b154630235935e1aab2a41eff9ed794d40084a02David Brown "com.android.phone.PERFORM_CDMA_PROVISIONING"; 80b154630235935e1aab2a41eff9ed794d40084a02David Brown 81d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng // Intent action to launch activation on a non-voice capable device 82d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng public static final String ACTION_PERFORM_VOICELESS_CDMA_PROVISIONING = 83d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng "com.android.phone.PERFORM_VOICELESS_CDMA_PROVISIONING"; 84d92cf8295af01ac7c72486e95b6c52376df601faFreeman Ng 85b154630235935e1aab2a41eff9ed794d40084a02David Brown // Activity result codes for the ACTION_PERFORM_CDMA_PROVISIONING intent 86b154630235935e1aab2a41eff9ed794d40084a02David Brown // (see the InCallScreenShowActivation activity.) 87b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // 88b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // Note: currently, our caller won't ever actually receive the 89b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // RESULT_INTERACTIVE_OTASP_STARTED result code; see comments in 90b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // InCallScreenShowActivation.onCreate() for details. 91b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown 92b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int RESULT_INTERACTIVE_OTASP_STARTED = Activity.RESULT_FIRST_USER; 93b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int RESULT_NONINTERACTIVE_OTASP_STARTED = Activity.RESULT_FIRST_USER + 1; 94b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int RESULT_NONINTERACTIVE_OTASP_FAILED = Activity.RESULT_FIRST_USER + 2; 95b154630235935e1aab2a41eff9ed794d40084a02David Brown 96b154630235935e1aab2a41eff9ed794d40084a02David Brown // Testing: Extra for the ACTION_PERFORM_CDMA_PROVISIONING intent that 97b154630235935e1aab2a41eff9ed794d40084a02David Brown // allows the caller to manually enable/disable "interactive mode" for 987d38129b67491544c5969dc784db478b13918b08David Brown // the OTASP call. Only available in userdebug or eng builds. 99b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String EXTRA_OVERRIDE_INTERACTIVE_MODE = 100b154630235935e1aab2a41eff9ed794d40084a02David Brown "ota_override_interactive_mode"; 101b154630235935e1aab2a41eff9ed794d40084a02David Brown 102b154630235935e1aab2a41eff9ed794d40084a02David Brown // Extra for the ACTION_PERFORM_CDMA_PROVISIONING intent, holding a 103b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent which the phone app can use to send a result code 104b154630235935e1aab2a41eff9ed794d40084a02David Brown // back to the caller. 105b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String EXTRA_OTASP_RESULT_CODE_PENDING_INTENT = 106b154630235935e1aab2a41eff9ed794d40084a02David Brown "otasp_result_code_pending_intent"; 107b154630235935e1aab2a41eff9ed794d40084a02David Brown 108b154630235935e1aab2a41eff9ed794d40084a02David Brown // Extra attached to the above PendingIntent that indicates 109b154630235935e1aab2a41eff9ed794d40084a02David Brown // success or failure. 110b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final String EXTRA_OTASP_RESULT_CODE = 111b154630235935e1aab2a41eff9ed794d40084a02David Brown "otasp_result_code"; 112b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_UNKNOWN = 0; 113b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_USER_SKIPPED = 1; // Only meaningful with interactive OTASP 114b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_SUCCESS = 2; 115b154630235935e1aab2a41eff9ed794d40084a02David Brown public static final int OTASP_FAILURE = 3; 116b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // TODO: Distinguish between interactive and non-interactive success 117b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // and failure. Then, have the PendingIntent be sent after 118b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // interactive OTASP as well (so the caller can find out definitively 119b5d698eb0a399d6f8c5c1b82f9b39903408e3cb8David Brown // when interactive OTASP completes.) 120b154630235935e1aab2a41eff9ed794d40084a02David Brown 121b154630235935e1aab2a41eff9ed794d40084a02David Brown private static final String OTASP_NUMBER = "*228"; 122b154630235935e1aab2a41eff9ed794d40084a02David Brown private static final String OTASP_NUMBER_NON_INTERACTIVE = "*22899"; 123b154630235935e1aab2a41eff9ed794d40084a02David Brown 124af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private InCallScreen mInCallScreen; 125af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private Context mContext; 126af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private PhoneApp mApplication; 127af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private OtaWidgetData mOtaWidgetData; 128af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private ViewGroup mInCallPanel; 129af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private CallCard mCallCard; 1302f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 1312f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // The DTMFTwelveKeyDialer instance owned by the InCallScreen, which 1322f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // the InCallScreen passes in to our constructor. 133af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private DTMFTwelveKeyDialer mDialer; 1342f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // 1352f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // The DTMFTwelveKeyDialer instance that we create ourselves in 1362f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // initOtaInCallScreen(), and attach to the DTMFTwelveKeyDialerView 1372f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // ("otaDtmfDialerView") that comes from otacall_card.xml. 1382f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown private DTMFTwelveKeyDialer mOtaCallCardDtmfDialer; 1392f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // TODO: we ought to share a single DTMFTwelveKeyDialer instance for 1402f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // both these uses, but see bug 2432289 for related issues. 1412f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 14257a38778e8c9f58b24cea1062e451934cadc4b3dJim Miller private static boolean mIsWizardMode = true; 143af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 144b154630235935e1aab2a41eff9ed794d40084a02David Brown // In "interactive mode", the OtaUtils object is tied to an 145b154630235935e1aab2a41eff9ed794d40084a02David Brown // InCallScreen instance, where we display a bunch of UI specific to 146b154630235935e1aab2a41eff9ed794d40084a02David Brown // the OTASP call. But on devices that are not "voice capable", the 147b154630235935e1aab2a41eff9ed794d40084a02David Brown // OTASP call runs in a non-interactive mode, and we don't have 148b154630235935e1aab2a41eff9ed794d40084a02David Brown // an InCallScreen or CallCard or any OTASP UI elements at all. 149b154630235935e1aab2a41eff9ed794d40084a02David Brown private boolean mInteractive = true; 150b154630235935e1aab2a41eff9ed794d40084a02David Brown 151b154630235935e1aab2a41eff9ed794d40084a02David Brown 152af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 153af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * OtaWidgetData class represent all OTA UI elements 154af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 155af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private class OtaWidgetData { 156af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public Button otaEndButton; 157af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public Button otaActivateButton; 15813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public Button otaSkipButton; 159986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public Button otaNextButton; 160af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public ToggleButton otaSpeakerButton; 161af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View otaCallCardBase; 162af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View callCardOtaButtonsFailSuccess; 163af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public ProgressBar otaTextProgressBar; 164af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public TextView otaTextSuccessFail; 165af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View callCardOtaButtonsActivate; 166af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public View callCardOtaButtonsListenProgress; 167af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public TextView otaTextActivate; 168af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public TextView otaTextListenProgress; 1699e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller public ScrollView otaTextListenProgressContainer; 170af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public AlertDialog spcErrorDialog; 171af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public AlertDialog otaFailureDialog; 17213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public AlertDialog otaSkipConfirmationDialog; 173986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public TextView otaTitle; 174986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public DTMFTwelveKeyDialerView otaDtmfDialerView; 175986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller public Button otaTryAgainButton; 176af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 177af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 178af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public OtaUtils(Context context, 179af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville InCallScreen inCallScreen, 180af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville ViewGroup inCallPanel, 181af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CallCard callCard, 1828df5c508da2c836b841ee24120fa7c5cc92df387David Brown DTMFTwelveKeyDialer dialer) { 183af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 184af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("Enter OtaUtil constructor"); 185af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 186af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen = inCallScreen; 187af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext = context; 188af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallPanel = inCallPanel; 189af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mCallCard = callCard; 190af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer = dialer; 191af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication = PhoneApp.getInstance(); 192af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData = new OtaWidgetData(); 193af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 194b154630235935e1aab2a41eff9ed794d40084a02David Brown // If no InCallScreen was passed in, assume non-interactive mode. 195b154630235935e1aab2a41eff9ed794d40084a02David Brown mInteractive = (mInCallScreen != null); 196b154630235935e1aab2a41eff9ed794d40084a02David Brown 197b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) { 198b154630235935e1aab2a41eff9ed794d40084a02David Brown // inflate OTA Call card and footers 199b154630235935e1aab2a41eff9ed794d40084a02David Brown ViewStub otaCallCardStub = (ViewStub) mInCallScreen.findViewById(R.id.otaCallCardStub); 200b154630235935e1aab2a41eff9ed794d40084a02David Brown otaCallCardStub.inflate(); 201b154630235935e1aab2a41eff9ed794d40084a02David Brown readXmlSettings(); 202b154630235935e1aab2a41eff9ed794d40084a02David Brown initOtaInCallScreen(); 203b154630235935e1aab2a41eff9ed794d40084a02David Brown } 204af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 205a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 206839b14d460986608fe577f89f789de854dc85b58Jim Miller /** 207839b14d460986608fe577f89f789de854dc85b58Jim Miller * Starts the OTA provisioning call. If the MIN isn't available yet, it returns false and adds 208a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent * an event to return the request to the calling app when it becomes available. 209a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent * 210839b14d460986608fe577f89f789de854dc85b58Jim Miller * @param context 211839b14d460986608fe577f89f789de854dc85b58Jim Miller * @param handler 212839b14d460986608fe577f89f789de854dc85b58Jim Miller * @param request 213839b14d460986608fe577f89f789de854dc85b58Jim Miller * @return true if we were able to launch Ota activity or it's not required; false otherwise 214839b14d460986608fe577f89f789de854dc85b58Jim Miller */ 215839b14d460986608fe577f89f789de854dc85b58Jim Miller public static boolean maybeDoOtaCall(Context context, Handler handler, int request) { 21613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 217839b14d460986608fe577f89f789de854dc85b58Jim Miller PhoneApp app = PhoneApp.getInstance(); 218839b14d460986608fe577f89f789de854dc85b58Jim Miller Phone phone = app.phone; 219839b14d460986608fe577f89f789de854dc85b58Jim Miller 220839b14d460986608fe577f89f789de854dc85b58Jim Miller if (!isCdmaPhone()) { 221b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("Can't run provisioning on a non-CDMA phone"); 222839b14d460986608fe577f89f789de854dc85b58Jim Miller return true; // sanity check - a non-cdma phone doesn't need to run this 223839b14d460986608fe577f89f789de854dc85b58Jim Miller } 224839b14d460986608fe577f89f789de854dc85b58Jim Miller 225839b14d460986608fe577f89f789de854dc85b58Jim Miller if (!phone.isMinInfoReady()) { 226839b14d460986608fe577f89f789de854dc85b58Jim Miller if (DBG) log("MIN is not ready. Registering to receive notification."); 227839b14d460986608fe577f89f789de854dc85b58Jim Miller phone.registerForSubscriptionInfoReady(handler, request, null); 228839b14d460986608fe577f89f789de854dc85b58Jim Miller return false; 229839b14d460986608fe577f89f789de854dc85b58Jim Miller } 230839b14d460986608fe577f89f789de854dc85b58Jim Miller phone.unregisterForSubscriptionInfoReady(handler); 231839b14d460986608fe577f89f789de854dc85b58Jim Miller 232f0d315541b1b1f33fab5e7952471da6e886b53efWink Saville boolean phoneNeedsActivation = phone.needsOtaServiceProvisioning(); 233839b14d460986608fe577f89f789de854dc85b58Jim Miller if (DBG) log("phoneNeedsActivation is set to " + phoneNeedsActivation); 234a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 235839b14d460986608fe577f89f789de854dc85b58Jim Miller int otaShowActivationScreen = context.getResources().getInteger( 236839b14d460986608fe577f89f789de854dc85b58Jim Miller R.integer.OtaShowActivationScreen); 237839b14d460986608fe577f89f789de854dc85b58Jim Miller 238839b14d460986608fe577f89f789de854dc85b58Jim Miller if (DBG) log("otaShowActivationScreen: " + otaShowActivationScreen); 239839b14d460986608fe577f89f789de854dc85b58Jim Miller 240d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng // Run the OTASP call in "interactive" mode only if 241d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng // this is a "voice capable" device. 2422e97fab35871f41a9a8d8099ccb664b17d92554cDavid Brown if (PhoneApp.sVoiceCapable) { 243b154630235935e1aab2a41eff9ed794d40084a02David Brown if (phoneNeedsActivation 244b154630235935e1aab2a41eff9ed794d40084a02David Brown && (otaShowActivationScreen == OTA_SHOW_ACTIVATION_SCREEN_ON)) { 245b154630235935e1aab2a41eff9ed794d40084a02David Brown app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 246b154630235935e1aab2a41eff9ed794d40084a02David Brown Intent newIntent = new Intent(ACTION_PERFORM_CDMA_PROVISIONING); 247b154630235935e1aab2a41eff9ed794d40084a02David Brown newIntent.setClass(context, InCallScreen.class); 248b154630235935e1aab2a41eff9ed794d40084a02David Brown newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 249b154630235935e1aab2a41eff9ed794d40084a02David Brown mIsWizardMode = false; 250b154630235935e1aab2a41eff9ed794d40084a02David Brown context.startActivity(newIntent); 251b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("maybeDoOtaCall: voice capable; activation intent sent."); 252b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 253b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("maybeDoOtaCall: voice capable; activation intent NOT sent."); 254b154630235935e1aab2a41eff9ed794d40084a02David Brown } 255839b14d460986608fe577f89f789de854dc85b58Jim Miller } else { 256b154630235935e1aab2a41eff9ed794d40084a02David Brown if (phoneNeedsActivation) { 257d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 258d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng Intent newIntent = new Intent(ACTION_PERFORM_VOICELESS_CDMA_PROVISIONING); 259d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 260d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng context.startActivity(newIntent); 261d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng if (DBG) log("maybeDoOtaCall: non-interactive; activation intent sent."); 262b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 263d5251aa62c211ab6f7b66c877d862131d709bccbFreeman Ng if (DBG) log("maybeDoOtaCall: non-interactive, no need for OTASP."); 264b154630235935e1aab2a41eff9ed794d40084a02David Brown } 265839b14d460986608fe577f89f789de854dc85b58Jim Miller } 266839b14d460986608fe577f89f789de854dc85b58Jim Miller return true; 267839b14d460986608fe577f89f789de854dc85b58Jim Miller } 268af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 269b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 270b154630235935e1aab2a41eff9ed794d40084a02David Brown * Starts the OTASP call *without* involving the InCallScreen or 271b154630235935e1aab2a41eff9ed794d40084a02David Brown * displaying any UI. 272b154630235935e1aab2a41eff9ed794d40084a02David Brown * 273b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is used on data-only devices, which don't support any kind of 274b154630235935e1aab2a41eff9ed794d40084a02David Brown * in-call phone UI. 275b154630235935e1aab2a41eff9ed794d40084a02David Brown * 276b154630235935e1aab2a41eff9ed794d40084a02David Brown * @return PhoneUtils.CALL_STATUS_DIALED if we successfully 277b154630235935e1aab2a41eff9ed794d40084a02David Brown * dialed the OTASP number, or one of the other 278b154630235935e1aab2a41eff9ed794d40084a02David Brown * CALL_STATUS_* constants if there was a failure. 279b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 280b154630235935e1aab2a41eff9ed794d40084a02David Brown public static int startNonInteractiveOtasp(Context context) { 281b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("startNonInteractiveOtasp()..."); 282b154630235935e1aab2a41eff9ed794d40084a02David Brown PhoneApp app = PhoneApp.getInstance(); 283b154630235935e1aab2a41eff9ed794d40084a02David Brown 284b154630235935e1aab2a41eff9ed794d40084a02David Brown if (app.otaUtils != null) { 285b154630235935e1aab2a41eff9ed794d40084a02David Brown // An OtaUtils instance already exists. 286b154630235935e1aab2a41eff9ed794d40084a02David Brown // TODO: Is this actually an error condition? 287b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "startNonInteractiveOtasp: " 288b154630235935e1aab2a41eff9ed794d40084a02David Brown + "OtaUtils already exists; nuking the old one and starting again..."); 289b154630235935e1aab2a41eff9ed794d40084a02David Brown } 290b154630235935e1aab2a41eff9ed794d40084a02David Brown 291b154630235935e1aab2a41eff9ed794d40084a02David Brown // Create the OtaUtils instance, and indicate we're in 292b154630235935e1aab2a41eff9ed794d40084a02David Brown // "non-interactive mode" by passing in null for 293b154630235935e1aab2a41eff9ed794d40084a02David Brown // inCallScreen / callCard / dialer / etc. 294b154630235935e1aab2a41eff9ed794d40084a02David Brown app.otaUtils = new OtaUtils(context, 295b154630235935e1aab2a41eff9ed794d40084a02David Brown null, null, null, null); 296b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- created OtaUtils: " + app.otaUtils); 297b154630235935e1aab2a41eff9ed794d40084a02David Brown 298b154630235935e1aab2a41eff9ed794d40084a02David Brown // ... and kick off the OTASP call. 299b154630235935e1aab2a41eff9ed794d40084a02David Brown Phone phone = PhoneApp.getPhone(); 300b154630235935e1aab2a41eff9ed794d40084a02David Brown String number = OTASP_NUMBER_NON_INTERACTIVE; 301b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- placing call to '" + number + "'..."); 302b154630235935e1aab2a41eff9ed794d40084a02David Brown int callStatus = PhoneUtils.placeCall(context, 303b154630235935e1aab2a41eff9ed794d40084a02David Brown phone, 304b154630235935e1aab2a41eff9ed794d40084a02David Brown number, 305b154630235935e1aab2a41eff9ed794d40084a02David Brown null, // contactRef 306b154630235935e1aab2a41eff9ed794d40084a02David Brown false, //isEmergencyCall 307b154630235935e1aab2a41eff9ed794d40084a02David Brown null); // gatewayUri 308b154630235935e1aab2a41eff9ed794d40084a02David Brown 309b154630235935e1aab2a41eff9ed794d40084a02David Brown if (callStatus == PhoneUtils.CALL_STATUS_DIALED) { 310b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log(" ==> successful return from placeCall(): callStatus = " + callStatus); 311b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 312b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "Failure from placeCall() for OTA number '" 313b154630235935e1aab2a41eff9ed794d40084a02David Brown + number + "': code " + callStatus); 314b154630235935e1aab2a41eff9ed794d40084a02David Brown return callStatus; 315b154630235935e1aab2a41eff9ed794d40084a02David Brown } 316b154630235935e1aab2a41eff9ed794d40084a02David Brown 317b154630235935e1aab2a41eff9ed794d40084a02David Brown // TODO: Any other special work to do here? 318b154630235935e1aab2a41eff9ed794d40084a02David Brown // Such as: 319b154630235935e1aab2a41eff9ed794d40084a02David Brown // 320b154630235935e1aab2a41eff9ed794d40084a02David Brown // - manually kick off progress updates, either using TelephonyRegistry 321b154630235935e1aab2a41eff9ed794d40084a02David Brown // or else by sending PendingIntents directly to our caller? 322b154630235935e1aab2a41eff9ed794d40084a02David Brown // 323b154630235935e1aab2a41eff9ed794d40084a02David Brown // - manually silence the in-call audio? (Probably unnecessary 324b154630235935e1aab2a41eff9ed794d40084a02David Brown // if Stingray truly has no audio path from phone baseband 325b154630235935e1aab2a41eff9ed794d40084a02David Brown // to the device's speakers.) 326b154630235935e1aab2a41eff9ed794d40084a02David Brown // 327b154630235935e1aab2a41eff9ed794d40084a02David Brown 328b154630235935e1aab2a41eff9ed794d40084a02David Brown return callStatus; 329b154630235935e1aab2a41eff9ed794d40084a02David Brown } 330b154630235935e1aab2a41eff9ed794d40084a02David Brown 331af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void setSpeaker(boolean state) { 332af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("setSpeaker : " + state ); 333b154630235935e1aab2a41eff9ed794d40084a02David Brown 334b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 335b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("non-interactive mode, ignoring setSpeaker."); 336b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 337b154630235935e1aab2a41eff9ed794d40084a02David Brown } 338b154630235935e1aab2a41eff9ed794d40084a02David Brown 339af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (state == PhoneUtils.isSpeakerOn(mContext)) { 340af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("no change. returning"); 341af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 342af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 343af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 344af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (state && mInCallScreen.isBluetoothAvailable() 345af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville && mInCallScreen.isBluetoothAudioConnected()) { 346af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.disconnectBluetoothAudio(); 347af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 348425b8e3c9846d5e0e76466604b35cad8856d79deEric Laurent PhoneUtils.turnOnSpeaker(mContext, state, true); 349af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 350af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 351af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 352af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle OTA Provision events from Framework. Possible events are: 353af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * OTA Commit Event - OTA provisioning was successful 354af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * SPC retries exceeded - SPC failure retries has exceeded, and Phone needs to 355af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * power down. 356af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 357af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaProvisionStatusChanged(AsyncResult r) { 358af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int OtaStatus[] = (int[]) r.result; 359b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("Provision status event!"); 360b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaProvisionStatusChanged(): status = " 361b154630235935e1aab2a41eff9ed794d40084a02David Brown + OtaStatus[0] + " ==> " + otaProvisionStatusToString(OtaStatus[0])); 362b154630235935e1aab2a41eff9ed794d40084a02David Brown 363b154630235935e1aab2a41eff9ed794d40084a02David Brown // In practice, in a normal successful OTASP call, events come in as follows: 364b154630235935e1aab2a41eff9ed794d40084a02David Brown // - SPL_UNLOCKED within a couple of seconds after the call starts 365b154630235935e1aab2a41eff9ed794d40084a02David Brown // - then a delay of around 45 seconds 366b154630235935e1aab2a41eff9ed794d40084a02David Brown // - then PRL_DOWNLOADED and MDN_DOWNLOADED and COMMITTED within a span of 2 seconds 367af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 368af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville switch(OtaStatus[0]) { 369af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 370b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaProvisionStatusChanged(): RETRIES EXCEEDED"); 371b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 372af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.otaSpcUptime = SystemClock.elapsedRealtime(); 3736c5cf46a2a31f0bffe9df36da8922971f7ee296bDavid Brown // STOPSHIP: otaShowSpcErrorNotice() is currently unsafe to use if 3746c5cf46a2a31f0bffe9df36da8922971f7ee296bDavid Brown // mInteractive is false. We need to either (a) only call it in 3756c5cf46a2a31f0bffe9df36da8922971f7ee296bDavid Brown // interactive mode, or (b) fix it so that it does something sane 3766c5cf46a2a31f0bffe9df36da8922971f7ee296bDavid Brown // whether or not mInCallScreen exists. (See bug 3144568.) 377af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowSpcErrorNotice(OTA_SPC_TIMEOUT); 378af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Power.shutdown(); 379af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 38065336771f727928a14d1d8fe175390ef7a06f71dWink Saville 381af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 38265336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): DONE, isOtaCallCommitted set to true"); 383b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 384b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaProvisionData.isOtaCallCommitted = true; 38565336771f727928a14d1d8fe175390ef7a06f71dWink Saville break; 38665336771f727928a14d1d8fe175390ef7a06f71dWink Saville 38765336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 38865336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 38965336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 39065336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 39165336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 39265336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 39365336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 39465336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 39565336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 39665336771f727928a14d1d8fe175390ef7a06f71dWink Saville case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 39765336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): change to ProgressScreen"); 398b154630235935e1aab2a41eff9ed794d40084a02David Brown updateOtaspProgress(); 39965336771f727928a14d1d8fe175390ef7a06f71dWink Saville break; 40065336771f727928a14d1d8fe175390ef7a06f71dWink Saville 40165336771f727928a14d1d8fe175390ef7a06f71dWink Saville default: 40265336771f727928a14d1d8fe175390ef7a06f71dWink Saville if (DBG) log("onOtaProvisionStatusChanged(): Ignoring OtaStatus " + OtaStatus[0]); 403af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 404af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 405af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 406af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 407b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 408b154630235935e1aab2a41eff9ed794d40084a02David Brown * Handle a disconnect event from the OTASP call. 409b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 410b154630235935e1aab2a41eff9ed794d40084a02David Brown public void onOtaspDisconnect() { 411b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("onOtaspDisconnect()..."); 412b154630235935e1aab2a41eff9ed794d40084a02David Brown // We only handle this event explicitly in non-interactive mode. 413b154630235935e1aab2a41eff9ed794d40084a02David Brown // (In interactive mode, the InCallScreen does any post-disconnect 414b154630235935e1aab2a41eff9ed794d40084a02David Brown // cleanup.) 415b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 416b154630235935e1aab2a41eff9ed794d40084a02David Brown // Send a success or failure indication back to our caller. 417b154630235935e1aab2a41eff9ed794d40084a02David Brown updateNonInteractiveOtaSuccessFailure(); 418b154630235935e1aab2a41eff9ed794d40084a02David Brown } 419b154630235935e1aab2a41eff9ed794d40084a02David Brown } 420b154630235935e1aab2a41eff9ed794d40084a02David Brown 421af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowHome() { 422af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowHome()..."); 423af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 424af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 4254a5a966f0d43e04d336be1b94182346399a931f6Wink Saville mInCallScreen.endInCallScreenSession(); 426af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville Intent intent = new Intent(Intent.ACTION_MAIN); 427af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville intent.addCategory (Intent.CATEGORY_HOME); 428af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 429af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.startActivity(intent); 430af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 431af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 432af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 43313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void otaSkipActivation() { 43413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("otaSkipActivation()..."); 43513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 436b154630235935e1aab2a41eff9ed794d40084a02David Brown sendOtaspResult(OTASP_USER_SKIPPED); 43713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 438b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) mInCallScreen.finish(); 43913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return; 44013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 44113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 442b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 443b154630235935e1aab2a41eff9ed794d40084a02David Brown * Actually initiate the OTASP call. This method is triggered by the 444b154630235935e1aab2a41eff9ed794d40084a02David Brown * onscreen "Activate" button, and is only used in interactive mode. 445b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 44613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void otaPerformActivation() { 44713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("otaPerformActivation()..."); 448b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 449b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 450b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaPerformActivation: not interactive!"); 451b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 452b154630235935e1aab2a41eff9ed794d40084a02David Brown } 453b154630235935e1aab2a41eff9ed794d40084a02David Brown 45413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 45513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng Intent newIntent = new Intent(Intent.ACTION_CALL); 456b154630235935e1aab2a41eff9ed794d40084a02David Brown newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, OTASP_NUMBER); 45713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mInCallScreen.internalResolveIntent(newIntent); 45813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaShowListeningScreen(); 45913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 46013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return; 46113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 46213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng 463af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 464af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show Activation Screen when phone powers up and OTA provision is 465af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * required. Also shown when activation fails and user needs 46613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng * to re-attempt it. Contains ACTIVATE and SKIP buttons 46713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng * which allow user to start OTA activation or skip the activation process. 468af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 469af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowActivateScreen() { 470af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowActivationScreen()..."); 471af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.otaShowActivationScreen 472af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == OTA_SHOW_ACTIVATION_SCREEN_ON) { 473af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowActivationScreen(): show activation screen"); 474e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 475af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 47613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setVisibility(mIsWizardMode ? 47757a38778e8c9f58b24cea1062e451934cadc4b3dJim Miller View.VISIBLE : View.INVISIBLE); 478af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.VISIBLE); 479af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.VISIBLE); 480e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } else { 4818df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(true); 482af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 483af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 484af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION; 485af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 486af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowActivationScreen(): show home screen"); 487af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowHome(); 488af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 489af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 490af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 491af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 492af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show "Listen for Instruction" screen during OTA call. Shown when OTA Call 493af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * is initiated and user needs to listen for network instructions and press 494af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * appropriate DTMF digits to proceed to the "Programming in Progress" phase. 495af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 496af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowListeningScreen() { 497b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowListeningScreen()..."); 498b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 499b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 500b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowListeningScreen: not interactive!"); 501b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 502b154630235935e1aab2a41eff9ed794d40084a02David Brown } 503b154630235935e1aab2a41eff9ed794d40084a02David Brown 504af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.otaShowListeningScreen 505af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == OTA_SHOW_LISTENING_SCREEN_ON) { 506af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowListeningScreen(): show listening screen"); 507e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 508af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 5099e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.VISIBLE); 510af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_listen); 511986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaDtmfDialerView.setVisibility(View.VISIBLE); 512af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 513986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 514a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 515a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 516e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } else { 5178df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(true); 518af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 519af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 520af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING; 521af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 522af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Update the state of the in-call menu items. 523af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.updateMenuItems(); 524af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 525af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowListeningScreen(): show progress screen"); 526af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowInProgressScreen(); 527af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 528af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 529af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 530af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 531b154630235935e1aab2a41eff9ed794d40084a02David Brown * Do any necessary updates (of onscreen UI, for example) 532b154630235935e1aab2a41eff9ed794d40084a02David Brown * based on the latest status of the OTASP call. 533b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 534b154630235935e1aab2a41eff9ed794d40084a02David Brown private void updateOtaspProgress() { 535b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("updateOtaspProgress()... mInteractive = " + mInteractive); 536b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) { 537b154630235935e1aab2a41eff9ed794d40084a02David Brown // On regular phones we just call through to 538b154630235935e1aab2a41eff9ed794d40084a02David Brown // otaShowInProgressScreen(), which updates the 539b154630235935e1aab2a41eff9ed794d40084a02David Brown // InCallScreen's onscreen UI. 540b154630235935e1aab2a41eff9ed794d40084a02David Brown otaShowInProgressScreen(); 541b154630235935e1aab2a41eff9ed794d40084a02David Brown } else { 542b154630235935e1aab2a41eff9ed794d40084a02David Brown // We're not using the InCallScreen to show OTA progress. 543b154630235935e1aab2a41eff9ed794d40084a02David Brown 544b154630235935e1aab2a41eff9ed794d40084a02David Brown // For now, at least, there's nothing to do here. 545b154630235935e1aab2a41eff9ed794d40084a02David Brown // The overall "success" or "failure" indication we send back 546b154630235935e1aab2a41eff9ed794d40084a02David Brown // (to our caller) is triggered by the DISCONNECT event; 547b154630235935e1aab2a41eff9ed794d40084a02David Brown // see updateNonInteractiveOtaSuccessFailure(). 548b154630235935e1aab2a41eff9ed794d40084a02David Brown 549b154630235935e1aab2a41eff9ed794d40084a02David Brown // But if we ever need to send *intermediate* progress updates back 550b154630235935e1aab2a41eff9ed794d40084a02David Brown // to our caller, we'd do that here, possbily using the same 551b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent that we already use to indicate success or failure. 552b154630235935e1aab2a41eff9ed794d40084a02David Brown } 553b154630235935e1aab2a41eff9ed794d40084a02David Brown } 554b154630235935e1aab2a41eff9ed794d40084a02David Brown 555b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 556b154630235935e1aab2a41eff9ed794d40084a02David Brown * When a non-interactive OTASP call completes, send a success or 557b154630235935e1aab2a41eff9ed794d40084a02David Brown * failure indication back to our caller. 558b154630235935e1aab2a41eff9ed794d40084a02David Brown * 559b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is basically the non-interactive equivalent of 560b154630235935e1aab2a41eff9ed794d40084a02David Brown * otaShowSuccessFailure(). 561b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 562b154630235935e1aab2a41eff9ed794d40084a02David Brown private void updateNonInteractiveOtaSuccessFailure() { 563b154630235935e1aab2a41eff9ed794d40084a02David Brown // This is basically the same logic as otaShowSuccessFailure(): we 564b154630235935e1aab2a41eff9ed794d40084a02David Brown // check the isOtaCallCommitted bit, and if that's true it means 565b154630235935e1aab2a41eff9ed794d40084a02David Brown // that activation was successful. 566b154630235935e1aab2a41eff9ed794d40084a02David Brown 567b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("updateNonInteractiveOtaSuccessFailure(): isOtaCallCommitted = " 568b154630235935e1aab2a41eff9ed794d40084a02David Brown + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 569b154630235935e1aab2a41eff9ed794d40084a02David Brown int resultCode = 570b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaProvisionData.isOtaCallCommitted 571b154630235935e1aab2a41eff9ed794d40084a02David Brown ? OTASP_SUCCESS : OTASP_FAILURE; 572b154630235935e1aab2a41eff9ed794d40084a02David Brown sendOtaspResult(resultCode); 573b154630235935e1aab2a41eff9ed794d40084a02David Brown } 574b154630235935e1aab2a41eff9ed794d40084a02David Brown 575b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 576b154630235935e1aab2a41eff9ed794d40084a02David Brown * Sends the specified OTASP result code back to our caller (presumably 577b154630235935e1aab2a41eff9ed794d40084a02David Brown * SetupWizard) via the PendingIntent that they originally sent along with 578b154630235935e1aab2a41eff9ed794d40084a02David Brown * the ACTION_PERFORM_CDMA_PROVISIONING intent. 579b154630235935e1aab2a41eff9ed794d40084a02David Brown */ 580b154630235935e1aab2a41eff9ed794d40084a02David Brown private void sendOtaspResult(int resultCode) { 581b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("sendOtaspResult: resultCode = " + resultCode); 582b154630235935e1aab2a41eff9ed794d40084a02David Brown 583b154630235935e1aab2a41eff9ed794d40084a02David Brown // Pass the success or failure indication back to our caller by 584b154630235935e1aab2a41eff9ed794d40084a02David Brown // adding an additional extra to the PendingIntent we already 585b154630235935e1aab2a41eff9ed794d40084a02David Brown // have. 586b154630235935e1aab2a41eff9ed794d40084a02David Brown // (NB: there's a PendingIntent send() method that takes a resultCode 587b154630235935e1aab2a41eff9ed794d40084a02David Brown // directly, but we can't use that here since that call is only 588b154630235935e1aab2a41eff9ed794d40084a02David Brown // meaningful for pending intents that are actually used as activity 589b154630235935e1aab2a41eff9ed794d40084a02David Brown // results.) 590b154630235935e1aab2a41eff9ed794d40084a02David Brown 591b154630235935e1aab2a41eff9ed794d40084a02David Brown Intent extraStuff = new Intent(); 592b154630235935e1aab2a41eff9ed794d40084a02David Brown extraStuff.putExtra(EXTRA_OTASP_RESULT_CODE, resultCode); 593b154630235935e1aab2a41eff9ed794d40084a02David Brown // When we call PendingIntent.send() below, the extras from this 594b154630235935e1aab2a41eff9ed794d40084a02David Brown // intent will get merged with any extras already present in 595b154630235935e1aab2a41eff9ed794d40084a02David Brown // cdmaOtaScreenState.otaspResultCodePendingIntent. 596b154630235935e1aab2a41eff9ed794d40084a02David Brown 597b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mApplication.cdmaOtaScreenState == null) { 598b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.e(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: no cdmaOtaScreenState object!"); 599b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 600b154630235935e1aab2a41eff9ed794d40084a02David Brown } 601b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent == null) { 602b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "updateNonInteractiveOtaSuccessFailure: " 603b154630235935e1aab2a41eff9ed794d40084a02David Brown + "null otaspResultCodePendingIntent!"); 604b154630235935e1aab2a41eff9ed794d40084a02David Brown // This *should* never happen, since SetupWizard always passes this 605b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent along with the ACTION_PERFORM_CDMA_PROVISIONING 606b154630235935e1aab2a41eff9ed794d40084a02David Brown // intent. 607b154630235935e1aab2a41eff9ed794d40084a02David Brown // (But if this happens it's not a fatal error, it just means that 608b154630235935e1aab2a41eff9ed794d40084a02David Brown // our original caller has no way of finding out whether the OTASP 609b154630235935e1aab2a41eff9ed794d40084a02David Brown // call ultimately failed or succeeded...) 610b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 611b154630235935e1aab2a41eff9ed794d40084a02David Brown } 612b154630235935e1aab2a41eff9ed794d40084a02David Brown 613b154630235935e1aab2a41eff9ed794d40084a02David Brown try { 614b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("- sendOtaspResult: SENDING PENDING INTENT: " + 615b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent); 616b154630235935e1aab2a41eff9ed794d40084a02David Brown mApplication.cdmaOtaScreenState.otaspResultCodePendingIntent.send( 617b154630235935e1aab2a41eff9ed794d40084a02David Brown mContext, 618b154630235935e1aab2a41eff9ed794d40084a02David Brown 0, /* resultCode (unused) */ 619b154630235935e1aab2a41eff9ed794d40084a02David Brown extraStuff); 620b154630235935e1aab2a41eff9ed794d40084a02David Brown } catch (CanceledException e) { 621b154630235935e1aab2a41eff9ed794d40084a02David Brown // should never happen because no code cancels the pending intent right now, 622b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.e(LOG_TAG, "PendingIntent send() failed: " + e); 623b154630235935e1aab2a41eff9ed794d40084a02David Brown } 624b154630235935e1aab2a41eff9ed794d40084a02David Brown } 625b154630235935e1aab2a41eff9ed794d40084a02David Brown 626b154630235935e1aab2a41eff9ed794d40084a02David Brown /** 627af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show "Programming In Progress" screen during OTA call. Shown when OTA 628af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * provisioning is in progress after user has selected an option. 629af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 630af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowInProgressScreen() { 631b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowInProgressScreen()..."); 632b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 633b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 634b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowInProgressScreen: not interactive!"); 635b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 636b154630235935e1aab2a41eff9ed794d40084a02David Brown } 637b154630235935e1aab2a41eff9ed794d40084a02David Brown 638e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (!isDialerOpened()) { 639af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 6409e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.VISIBLE); 641af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_progress); 642af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setVisibility(View.VISIBLE); 643af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE); 6449bd141ba20a6cf6dcb745aca6c5c05a9c88f3a98Jim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE); 645a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent boolean speakerOn = PhoneUtils.isSpeakerOn(mContext); 646a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn); 647e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } else { 6488df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(true); 649af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 650af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 651af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS; 652af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 653af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville // Update the state of the in-call menu items. 654af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallScreen.updateMenuItems(); 655af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 656af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 657af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 658af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming failure dialog when OTA provisioning fails. 659af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * If OTA provisioning attempts fail more than 3 times, then unsuccessful 660af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * dialog is shown. Otherwise a two-second notice is shown with unsuccessful 661af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * information. When notice expires, phone returns to activation screen. 662af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 663986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void otaShowProgramFailure(int length) { 664af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure()..."); 665af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.activationCount++; 666af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if ((mApplication.cdmaOtaProvisionData.activationCount < 667af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivateFailTimes) 668af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville && (mApplication.cdmaOtaConfigData.otaShowActivationScreen == 669af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_SHOW_ACTIVATION_SCREEN_ON)) { 670af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure(): activationCount" 671af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaProvisionData.activationCount); 672af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure(): show failure notice"); 673af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailureNotice(length); 674af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 675af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailure(): show failure dialog"); 676af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailureDialog(); 677af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 678af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 679af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 680af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 681af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show either programming success dialog when OTA provisioning succeeds, or 682f0d315541b1b1f33fab5e7952471da6e886b53efWink Saville * programming failure dialog when it fails. See {@link #otaShowProgramFailure} 683af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * for more details. 684af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 685af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowSuccessFailure() { 686b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaShowSuccessFailure()..."); 687b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 688b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 689b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowSuccessFailure: not interactive!"); 690b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 691b154630235935e1aab2a41eff9ed794d40084a02David Brown } 692b154630235935e1aab2a41eff9ed794d40084a02David Brown 693af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenInitialize(); 694af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSuccessFailure(): isOtaCallCommitted" 695af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaProvisionData.isOtaCallCommitted); 696af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.isOtaCallCommitted) { 697af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSuccessFailure(), show success dialog"); 698af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramSuccessDialog(); 699af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 700af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSuccessFailure(), show failure dialog"); 701af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowProgramFailure(OTA_FAILURE_DIALOG_TIMEOUT); 702af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 703af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 704af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 705af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 706af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 707af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming failure dialog when OTA provisioning fails more than 3 708af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * times. 709af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 710af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramFailureDialog() { 711af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailureDialog()..."); 712af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 713af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 714986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_problem_with_activation); 715af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 716af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_unsuccessful); 717af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 718986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setVisibility(View.VISIBLE); 719af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 720e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 721af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer.closeDialer(false); 722af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 723af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 724af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 725af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 726af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show programming success dialog when OTA provisioning succeeds. 727af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 728af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramSuccessDialog() { 729af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramSuccessDialog()..."); 730af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 731af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG; 732986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate_success); 733af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE); 734af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_successful); 735af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE); 736986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setVisibility(View.VISIBLE); 737af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 738e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 739af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer.closeDialer(false); 740af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 741af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 742af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 743af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 744af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show SPC failure notice when SPC attempts exceed 15 times. 745af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * During OTA provisioning, if SPC code is incorrect OTA provisioning will 746af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * fail. When SPC attempts are over 15, it shows SPC failure notice for one minute and 747af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * then phone will power down. 748af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 749af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowSpcErrorNotice(int length) { 750af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowSpcErrorNotice()..."); 751af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.spcErrorDialog == null) { 752af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaProvisionData.inOtaSpcState = true; 753af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville DialogInterface.OnKeyListener keyListener; 754af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville keyListener = new DialogInterface.OnKeyListener() { 755af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 756af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville log("Ignoring key events..."); 757af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return true; 758af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville }}; 759af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog = new AlertDialog.Builder(mInCallScreen) 760af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setMessage(R.string.ota_spc_failure) 761af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setOnKeyListener(keyListener) 762af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .create(); 763af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.getWindow().addFlags( 764af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 765af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 766af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.show(); 767af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville //close the dialer if open 768e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman if (isDialerOpened()) { 769af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mDialer.closeDialer(false); 770af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 771af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long noticeTime = length*1000; 772325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown if (DBG) log("OtaShowSpcErrorNotice(), remaining SPC noticeTime" + noticeTime); 773325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown mInCallScreen.requestCloseSpcErrorNotice(noticeTime); 774af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 775af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 776af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 777af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 778af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * When SPC notice times out, force phone to power down. 779af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 780af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaCloseSpcNotice() { 78117c36a10d09fac3e2312c0bcb839e0a704f42105w if (DBG) log("onOtaCloseSpcNotice(), send shutdown intent"); 78217c36a10d09fac3e2312c0bcb839e0a704f42105w Intent shutdown = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); 78317c36a10d09fac3e2312c0bcb839e0a704f42105w shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM, false); 78417c36a10d09fac3e2312c0bcb839e0a704f42105w shutdown.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 78517c36a10d09fac3e2312c0bcb839e0a704f42105w mContext.startActivity(shutdown); 786af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 787af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 788af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 789af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show two-second notice when OTA provisioning fails and number of failed attempts 790af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * is less then 3. 791af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 792af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaShowProgramFailureNotice(int length) { 793af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OtaShowProgramFailureNotice()..."); 794af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog == null) { 795af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = new AlertDialog.Builder(mInCallScreen) 796af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .setMessage(R.string.ota_failure) 797af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville .create(); 798af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.getWindow().addFlags( 799af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 800af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 801af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.show(); 802af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 803af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long noticeTime = length*1000; 804325cc2ced6f1ff5fb1708abfcc5e9c73ac0cd962David Brown mInCallScreen.requestCloseOtaFailureNotice(noticeTime); 805af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 806af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 807af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 808af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 809af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle OTA unsuccessful notice expiry. Dismisses the 810af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * two-second notice and shows the activation screen. 811af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 812af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onOtaCloseFailureNotice() { 813af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("onOtaCloseFailureNotice()..."); 814af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog != null) { 815af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.dismiss(); 816af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = null; 817af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 818af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateScreen(); 819af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 820af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 821af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 822af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Initialize all OTA UI elements to be gone. Also set inCallPanel, 8238df5c508da2c836b841ee24120fa7c5cc92df387David Brown * callCard and the dialpad handle to be gone. This is called before any OTA screen 824af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * gets drawn. 825af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 826af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void otaScreenInitialize() { 827b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("otaScreenInitialize()..."); 828b154630235935e1aab2a41eff9ed794d40084a02David Brown 829b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 830b154630235935e1aab2a41eff9ed794d40084a02David Brown // We should never be doing anything with UI elements in 831b154630235935e1aab2a41eff9ed794d40084a02David Brown // non-interactive mode. 832b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaScreenInitialize: not interactive!"); 833b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 834b154630235935e1aab2a41eff9ed794d40084a02David Brown } 835af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 836af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallPanel != null) mInCallPanel.setVisibility(View.GONE); 837af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mCallCard != null) mCallCard.hideCallCardElements(); 8388df5c508da2c836b841ee24120fa7c5cc92df387David Brown mDialer.setHandleVisible(false); 839af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 840986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate); 841af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 8429e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.GONE); 843af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 844af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 845af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 846af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 847af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 848986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 849986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaSpeakerButton.setVisibility(View.GONE); 850986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 851986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 852af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaCallCardBase.setVisibility(View.VISIBLE); 85313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setVisibility(View.VISIBLE); 854af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 855af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 856af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void hideOtaScreen() { 857af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("hideOtaScreen()..."); 858af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 859af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 860af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 861af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 862af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaCallCardBase.setVisibility(View.GONE); 863af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 864af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 865e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman public boolean isDialerOpened() { 866e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman return (mDialer != null && mDialer.isOpened()); 867e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman } 868e4a6da04f5ed72f8be2e578b91d041493277e248Paul Berman 869af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 870af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Show the appropriate OTA screen based on the current state of OTA call. 871b154630235935e1aab2a41eff9ed794d40084a02David Brown * 872b154630235935e1aab2a41eff9ed794d40084a02David Brown * This is called from the InCallScreen when the screen needs to be 873b154630235935e1aab2a41eff9ed794d40084a02David Brown * refreshed (and thus is only ever used in interactive mode.) 874af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 875af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void otaShowProperScreen() { 876af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("otaShowProperScreen()..."); 877b154630235935e1aab2a41eff9ed794d40084a02David Brown if (!mInteractive) { 878b154630235935e1aab2a41eff9ed794d40084a02David Brown // We shouldn't ever get here in non-interactive mode! 879b154630235935e1aab2a41eff9ed794d40084a02David Brown Log.w(LOG_TAG, "otaShowProperScreen: not interactive!"); 880b154630235935e1aab2a41eff9ed794d40084a02David Brown return; 881b154630235935e1aab2a41eff9ed794d40084a02David Brown } 882b154630235935e1aab2a41eff9ed794d40084a02David Brown 883af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallScreen.isForegroundActivity()) { 884af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("otaShowProperScreen(), OTA is foreground activity, currentstate =" 885af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaScreenState.otaScreenState); 886af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mInCallPanel != null) { 887af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mInCallPanel.setVisibility(View.GONE); 888af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 889af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaScreenState.otaScreenState 890af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION) { 891af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateScreen(); 892af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else if (mApplication.cdmaOtaScreenState.otaScreenState 893af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING) { 894af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowListeningScreen(); 895af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else if (mApplication.cdmaOtaScreenState.otaScreenState 896af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS) { 897af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowInProgressScreen(); 898af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 899af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 900af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 901af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowSpcErrorNotice(getOtaSpcDisplayTime()); 902af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 903af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 904af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 905af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 906af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 907af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Read configuration values for each OTA screen from config.xml. 908af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * These configuration values control visibility of each screen. 909af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 910af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void readXmlSettings() { 911af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings()..."); 912af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaConfigData.configComplete) { 913af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return; 914af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 915af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 916af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.configComplete = true; 917af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowActivationScreen = 918af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowActivationScreen); 919af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivationScreen = tmpOtaShowActivationScreen; 920af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaShowActivationScreen" 921af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowActivationScreen); 922af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 923af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowListeningScreen = 924af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowListeningScreen); 925af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowListeningScreen = tmpOtaShowListeningScreen; 926af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaShowListeningScreen" 927af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowListeningScreen); 928af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 929af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaShowActivateFailTimes = 930af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaShowActivateFailTimes); 931af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaShowActivateFailTimes = tmpOtaShowActivateFailTimes; 932af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaShowActivateFailTimes" 933af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaShowActivateFailTimes); 934af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 935af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpOtaPlaySuccessFailureTone = 936af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mContext.getResources().getInteger(R.integer.OtaPlaySuccessFailureTone); 937af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone = tmpOtaPlaySuccessFailureTone; 938af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("readXmlSettings(), otaPlaySuccessFailureTone" 939af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville + mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone); 940af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 941af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 942af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 943af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Handle the click events for OTA buttons. 944af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 945af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void onClickHandler(int id) { 946af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville switch (id) { 947af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaEndButton: 948af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaEndButton(); 949af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 950af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 951af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaSpeakerButton: 952af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaSpeakerButton(); 953af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 954af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 955af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville case R.id.otaActivateButton: 956af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville onClickOtaActivateButton(); 957af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 958af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 95913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng case R.id.otaSkipButton: 96013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng onClickOtaActivateSkipButton(); 961af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 962af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 963986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller case R.id.otaNextButton: 964986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller onClickOtaActivateNextButton(); 965af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 966af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 967986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller case R.id.otaTryAgainButton: 968986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller onClickOtaTryAgainButton(); 969af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 970af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 971af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville default: 972af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log ("onClickHandler: received a click event for unrecognized id"); 973af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville break; 974af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 975af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 976af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 977986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void onClickOtaTryAgainButton() { 978986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Activation Try Again Clicked!"); 979986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 980986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller otaShowActivateScreen(); 981986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller } 982986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller } 983986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 984af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaEndButton() { 985986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Activation End Call Button Clicked!"); 986af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 9878343169cc89621d46dce86449f5ee1ff5d3a4919John Wang if (PhoneUtils.hangup(mApplication.mCM) == false) { 988a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // If something went wrong when placing the OTA call, 989a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // the screen is not updated by the call disconnect 990a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // handler and we have to do it here 991a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent setSpeaker(false); 992a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent mInCallScreen.handleOtaCallEnd(); 993a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent } 994af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 995af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 996af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 997af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaSpeakerButton() { 998af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OTA Speaker button Clicked!"); 999af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1000af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville boolean isChecked = !PhoneUtils.isSpeakerOn(mContext); 1001af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville setSpeaker(isChecked); 1002af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1003af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1004af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1005af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void onClickOtaActivateButton() { 1006af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("Call Activation Clicked!"); 100713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaPerformActivation(); 1008af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1009af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 101013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng private void onClickOtaActivateSkipButton() { 101113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("Activation Skip Clicked!"); 101213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng DialogInterface.OnKeyListener keyListener; 101313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng keyListener = new DialogInterface.OnKeyListener() { 101413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public boolean onKey(DialogInterface dialog, int keyCode, 101513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng KeyEvent event) { 101613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng if (DBG) log("Ignoring key events..."); 101713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng return true; 101813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 101913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }; 102013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipConfirmationDialog = new AlertDialog.Builder(mInCallScreen) 102113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setTitle(R.string.ota_skip_activation_dialog_title) 102213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setMessage(R.string.ota_skip_activation_dialog_message) 102313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setPositiveButton( 102413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng R.string.ota_skip_activation_dialog_skip_label, 102513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng new AlertDialog.OnClickListener() { 102613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public void onClick(DialogInterface dialog, int which) { 102713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaSkipActivation(); 102813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 102913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }) 103013660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setNegativeButton( 103113660626500d047d4a3a097e832bb175e1c4f894Freeman Ng R.string.ota_skip_activation_dialog_continue_label, 103213660626500d047d4a3a097e832bb175e1c4f894Freeman Ng new AlertDialog.OnClickListener() { 103313660626500d047d4a3a097e832bb175e1c4f894Freeman Ng public void onClick(DialogInterface dialog, int which) { 103413660626500d047d4a3a097e832bb175e1c4f894Freeman Ng otaPerformActivation(); 103513660626500d047d4a3a097e832bb175e1c4f894Freeman Ng } 103613660626500d047d4a3a097e832bb175e1c4f894Freeman Ng }) 103713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .setOnKeyListener(keyListener) 103813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng .create(); 103913660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipConfirmationDialog.show(); 1040af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1041af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1042986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller private void onClickOtaActivateNextButton() { 1043986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller if (DBG) log("Dialog Next Clicked!"); 1044af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1045af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mApplication.cdmaOtaScreenState.otaScreenState = 1046af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 1047af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowHome(); 1048af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1049af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1050af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1051af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void dismissAllOtaDialogs() { 1052af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.spcErrorDialog != null) { 1053af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("- DISMISSING mSpcErrorDialog."); 1054af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog.dismiss(); 1055af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.spcErrorDialog = null; 1056af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1057af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mOtaWidgetData.otaFailureDialog != null) { 1058af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("- DISMISSING mOtaFailureDialog."); 1059af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog.dismiss(); 1060af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaFailureDialog = null; 1061af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1062af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1063af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1064af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private int getOtaSpcDisplayTime() { 1065af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("getOtaSpcDisplayTime()..."); 1066af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville int tmpSpcTime = 1; 1067af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (mApplication.cdmaOtaProvisionData.inOtaSpcState) { 1068af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long tmpOtaSpcRunningTime = 0; 1069af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville long tmpOtaSpcLeftTime = 0; 1070af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcRunningTime = SystemClock.elapsedRealtime(); 1071af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcLeftTime = 1072af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpOtaSpcRunningTime - mApplication.cdmaOtaProvisionData.otaSpcUptime; 107317c36a10d09fac3e2312c0bcb839e0a704f42105w if (tmpOtaSpcLeftTime >= OTA_SPC_TIMEOUT*1000) { 1074af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpSpcTime = 1; 1075af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } else { 1076af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville tmpSpcTime = OTA_SPC_TIMEOUT - (int)tmpOtaSpcLeftTime/1000; 1077af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1078af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1079af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("getOtaSpcDisplayTime(), time for SPC error notice: " + tmpSpcTime); 1080af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville return tmpSpcTime; 1081af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1082af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1083af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1084af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Initialize the OTA widgets for all OTA screens. 1085af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1086af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private void initOtaInCallScreen() { 1087af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("initOtaInCallScreen()..."); 1088986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTitle = (TextView) mInCallScreen.findViewById(R.id.otaTitle); 1089af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate = (TextView) mInCallScreen.findViewById(R.id.otaActivate); 1090af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 10919e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller mOtaWidgetData.otaTextListenProgressContainer = 10929e9d66682248d0d9d0514b906f4c0a5ee7b9f7d3Jim Miller (ScrollView) mInCallScreen.findViewById(R.id.otaListenProgressContainer); 1093af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextListenProgress = 1094af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (TextView) mInCallScreen.findViewById(R.id.otaListenProgress); 1095af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar = 1096af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (ProgressBar) mInCallScreen.findViewById(R.id.progress_large); 1097af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextProgressBar.setIndeterminate(true); 1098af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaTextSuccessFail = 1099af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (TextView) mInCallScreen.findViewById(R.id.otaSuccessFailStatus); 1100af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1101af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaCallCardBase = (View) mInCallScreen.findViewById(R.id.otaBase); 1102af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsListenProgress = 1103af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaListenProgress); 1104af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsActivate = 1105af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaActivate); 1106af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.callCardOtaButtonsFailSuccess = 1107af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (View) mInCallScreen.findViewById(R.id.callCardOtaFailOrSuccessful); 1108af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1109af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaEndButton = (Button) mInCallScreen.findViewById(R.id.otaEndButton); 1110af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaEndButton.setOnClickListener(mInCallScreen); 1111af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaSpeakerButton = 1112af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (ToggleButton) mInCallScreen.findViewById(R.id.otaSpeakerButton); 1113af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaSpeakerButton.setOnClickListener(mInCallScreen); 1114af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaActivateButton = 1115af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville (Button) mInCallScreen.findViewById(R.id.otaActivateButton); 1116af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville mOtaWidgetData.otaActivateButton.setOnClickListener(mInCallScreen); 111713660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton = (Button) mInCallScreen.findViewById(R.id.otaSkipButton); 111813660626500d047d4a3a097e832bb175e1c4f894Freeman Ng mOtaWidgetData.otaSkipButton.setOnClickListener(mInCallScreen); 1119986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton = (Button) mInCallScreen.findViewById(R.id.otaNextButton); 1120986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaNextButton.setOnClickListener(mInCallScreen); 1121986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton = 1122986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller (Button) mInCallScreen.findViewById(R.id.otaTryAgainButton); 1123986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mOtaWidgetData.otaTryAgainButton.setOnClickListener(mInCallScreen); 1124a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 1125dfa83d531cdb88513f09e913424b7a16628b37d3David Brown mOtaWidgetData.otaDtmfDialerView = 1126dfa83d531cdb88513f09e913424b7a16628b37d3David Brown (DTMFTwelveKeyDialerView) mInCallScreen.findViewById(R.id.otaDtmfDialer); 1127dfa83d531cdb88513f09e913424b7a16628b37d3David Brown // Sanity-check: the otaDtmfDialer widget should *always* be present. 1128dfa83d531cdb88513f09e913424b7a16628b37d3David Brown if (mOtaWidgetData.otaDtmfDialerView == null) { 1129dfa83d531cdb88513f09e913424b7a16628b37d3David Brown Log.e(LOG_TAG, "onCreate: couldn't find otaDtmfDialer", new IllegalStateException()); 1130af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 11312f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11322f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11332f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // Create a new DTMFTwelveKeyDialer instance purely for use by the 11342f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // DTMFTwelveKeyDialerView ("otaDtmfDialerView") that comes from 11352f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // otacall_card.xml. 11362f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // (But note that mDialer is a separate DTMFTwelveKeyDialer 11372f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // instance, that belongs to the InCallScreen. This is confusing; 11382f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // see the TODO comment above.) 11392f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaCallCardDtmfDialer = new DTMFTwelveKeyDialer(mInCallScreen, 11402f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaWidgetData.otaDtmfDialerView, 11412f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown null /* no SlidingDrawer used here */); 11422f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11432f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // Initialize the new DTMFTwelveKeyDialer instance. This is 11442f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown // needed to play local DTMF tones. 11452f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaCallCardDtmfDialer.startDialerSession(); 11462f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 11472f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown mOtaWidgetData.otaDtmfDialerView.setDialer(mOtaCallCardDtmfDialer); 1148af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1149af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1150af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1151af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Clear out all OTA UI widget elements. Needs to get called 1152af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * when OTA call ends or InCallScreen is destroyed. 11534a5a966f0d43e04d336be1b94182346399a931f6Wink Saville * @param disableSpeaker parameter control whether Speaker should be turned off. 1154af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 11554a5a966f0d43e04d336be1b94182346399a931f6Wink Saville public void cleanOtaScreen(boolean disableSpeaker) { 1156af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("OTA ends, cleanOtaScreen!"); 1157af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1158986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaScreenState.otaScreenState = 1159986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED; 1160986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.isOtaCallCommitted = false; 1161986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.isOtaCallIntentProcessed = false; 1162986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.inOtaSpcState = false; 1163986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.activationCount = 0; 1164986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller mApplication.cdmaOtaProvisionData.otaSpcUptime = 0; 11655c0517ae3c17505ffd466be79ab0026b7fe6c959Wink Saville mApplication.cdmaOtaInCallScreenUiState.state = State.UNDEFINED; 1166986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1167b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInteractive) { 1168b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mInCallPanel != null) mInCallPanel.setVisibility(View.VISIBLE); 1169b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mCallCard != null) mCallCard.hideCallCardElements(); 1170b154630235935e1aab2a41eff9ed794d40084a02David Brown mDialer.setHandleVisible(true); 1171986d2f46bd9572b563b89627fa60a9ea0853a91fJim Miller 1172b154630235935e1aab2a41eff9ed794d40084a02David Brown // Free resources from the DTMFTwelveKeyDialer instance we created 1173b154630235935e1aab2a41eff9ed794d40084a02David Brown // in initOtaInCallScreen(). 1174b154630235935e1aab2a41eff9ed794d40084a02David Brown if (mOtaCallCardDtmfDialer != null) { 1175b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaCallCardDtmfDialer.stopDialerSession(); 1176b154630235935e1aab2a41eff9ed794d40084a02David Brown } 11772f22a9001166458ef4b04f6142b6d6a480af1c9dDavid Brown 1178b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextActivate.setVisibility(View.GONE); 1179b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.GONE); 1180b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE); 1181b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE); 1182b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE); 1183b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE); 1184b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE); 1185b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaCallCardBase.setVisibility(View.GONE); 1186b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE); 1187b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaNextButton.setVisibility(View.GONE); 1188b154630235935e1aab2a41eff9ed794d40084a02David Brown mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE); 1189b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1190a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent 1191a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // turn off the speaker in case it was turned on 1192a44a437fae34920b0ecbf66400ac50e10e5ae49eEric Laurent // but the OTA call could not be completed 11934a5a966f0d43e04d336be1b94182346399a931f6Wink Saville if (disableSpeaker) { 11944a5a966f0d43e04d336be1b94182346399a931f6Wink Saville setSpeaker(false); 11954a5a966f0d43e04d336be1b94182346399a931f6Wink Saville } 1196af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1197af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1198af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1199af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Defines OTA information that needs to be maintained during 1200af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * an OTA call when display orientation changes. 1201af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1202af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaProvisionData { 1203af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean isOtaCallCommitted; 1204af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean isOtaCallIntentProcessed; 1205af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean inOtaSpcState; 1206af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int activationCount; 1207af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public long otaSpcUptime; 1208af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1209af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1210af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1211af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Defines OTA screen configuration items read from config.xml 1212af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * and used to control OTA display. 1213af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1214af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaConfigData { 1215af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowActivationScreen; 1216af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowListeningScreen; 1217af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaShowActivateFailTimes; 1218af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public int otaPlaySuccessFailureTone; 1219af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public boolean configComplete; 1220af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public CdmaOtaConfigData() { 1221af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if (DBG) log("CdmaOtaConfigData constructor!"); 1222af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivationScreen = OTA_SHOW_ACTIVATION_SCREEN_OFF; 1223af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowListeningScreen = OTA_SHOW_LISTENING_SCREEN_OFF; 1224af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaShowActivateFailTimes = OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF; 1225af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaPlaySuccessFailureTone = OTA_PLAY_SUCCESS_FAILURE_TONE_OFF; 1226af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1227af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1228af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1229af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 1230f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * The state of the OTA InCallScreen UI. 1231f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1232f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public static class CdmaOtaInCallScreenUiState { 1233f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public enum State { 1234f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville UNDEFINED, 1235f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville NORMAL, 1236f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville ENDED 1237f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1238f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1239f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public State state; 1240f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1241f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public CdmaOtaInCallScreenUiState() { 1242f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville if (DBG) log("CdmaOtaInCallScreenState: constructor init to UNDEFINED"); 1243f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville state = CdmaOtaInCallScreenUiState.State.UNDEFINED; 1244f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1245f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1246f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1247f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1248f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * Save the Ota InCallScreen UI state 1249f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1250f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public void setCdmaOtaInCallScreenUiState(CdmaOtaInCallScreenUiState.State state) { 1251f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville if (DBG) log("setCdmaOtaInCallScreenState: " + state); 1252f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville mApplication.cdmaOtaInCallScreenUiState.state = state; 1253f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1254f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1255f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1256f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville * Get the Ota InCallScreen UI state 1257f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville */ 1258f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville public CdmaOtaInCallScreenUiState.State getCdmaOtaInCallScreenUiState() { 1259b154630235935e1aab2a41eff9ed794d40084a02David Brown if (DBG) log("getCdmaOtaInCallScreenState: " 1260b154630235935e1aab2a41eff9ed794d40084a02David Brown + mApplication.cdmaOtaInCallScreenUiState.state); 1261f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville return mApplication.cdmaOtaInCallScreenUiState.state; 1262f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville } 1263f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville 1264f6eb7893215a875863e1e0200e4aa3174137f76cWink Saville /** 1265af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * The OTA screen state machine. 1266af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1267af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public static class CdmaOtaScreenState { 1268af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public enum OtaScreenState { 1269af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_UNDEFINED, 1270af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_ACTIVATION, 1271af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_LISTENING, 1272af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_PROGRESS, 1273af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville OTA_STATUS_SUCCESS_FAILURE_DLG 1274af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1275af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1276af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public OtaScreenState otaScreenState; 1277af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1278af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public CdmaOtaScreenState() { 1279af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville otaScreenState = OtaScreenState.OTA_STATUS_UNDEFINED; 1280af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1281b154630235935e1aab2a41eff9ed794d40084a02David Brown 1282b154630235935e1aab2a41eff9ed794d40084a02David Brown // PendingIntent used to report an OTASP result status code back 1283b154630235935e1aab2a41eff9ed794d40084a02David Brown // to our caller. 1284b154630235935e1aab2a41eff9ed794d40084a02David Brown // 1285b154630235935e1aab2a41eff9ed794d40084a02David Brown // Our caller (presumably SetupWizard) creates this PendingIntent, 1286b154630235935e1aab2a41eff9ed794d40084a02David Brown // pointing back at itself, and passes it along as an extra with the 1287b154630235935e1aab2a41eff9ed794d40084a02David Brown // ACTION_PERFORM_CDMA_PROVISIONING intent. Then, when there's an 1288b154630235935e1aab2a41eff9ed794d40084a02David Brown // OTASP result to report, we send that PendingIntent back, adding an 1289b154630235935e1aab2a41eff9ed794d40084a02David Brown // extra called EXTRA_OTASP_RESULT_CODE to indicate the result. 1290b154630235935e1aab2a41eff9ed794d40084a02David Brown // 1291b154630235935e1aab2a41eff9ed794d40084a02David Brown // Possible result values are the OTASP_RESULT_* constants. 1292b154630235935e1aab2a41eff9ed794d40084a02David Brown public PendingIntent otaspResultCodePendingIntent; 1293b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1294b154630235935e1aab2a41eff9ed794d40084a02David Brown 1295b154630235935e1aab2a41eff9ed794d40084a02David Brown /** @see com.android.internal.telephony.Phone */ 1296b154630235935e1aab2a41eff9ed794d40084a02David Brown private static String otaProvisionStatusToString(int status) { 1297b154630235935e1aab2a41eff9ed794d40084a02David Brown switch (status) { 1298b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED: 1299b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SPL_UNLOCKED"; 1300b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED: 1301b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SPC_RETRIES_EXCEEDED"; 1302b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED: 1303b154630235935e1aab2a41eff9ed794d40084a02David Brown return "A_KEY_EXCHANGED"; 1304b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED: 1305b154630235935e1aab2a41eff9ed794d40084a02David Brown return "SSD_UPDATED"; 1306b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED: 1307b154630235935e1aab2a41eff9ed794d40084a02David Brown return "NAM_DOWNLOADED"; 1308b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED: 1309b154630235935e1aab2a41eff9ed794d40084a02David Brown return "MDN_DOWNLOADED"; 1310b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED: 1311b154630235935e1aab2a41eff9ed794d40084a02David Brown return "IMSI_DOWNLOADED"; 1312b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED: 1313b154630235935e1aab2a41eff9ed794d40084a02David Brown return "PRL_DOWNLOADED"; 1314b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: 1315b154630235935e1aab2a41eff9ed794d40084a02David Brown return "COMMITTED"; 1316b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED: 1317b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_STARTED"; 1318b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: 1319b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_STOPPED"; 1320b154630235935e1aab2a41eff9ed794d40084a02David Brown case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED: 1321b154630235935e1aab2a41eff9ed794d40084a02David Brown return "OTAPA_ABORTED"; 1322b154630235935e1aab2a41eff9ed794d40084a02David Brown default: 1323b154630235935e1aab2a41eff9ed794d40084a02David Brown return "<unknown status" + status + ">"; 1324b154630235935e1aab2a41eff9ed794d40084a02David Brown } 1325af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1326af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 1327af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville private static void log(String msg) { 1328af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville Log.d(LOG_TAG, msg); 1329af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1330839b14d460986608fe577f89f789de854dc85b58Jim Miller 1331d3a8a3a138614071a7a8020e1579048c411abd78Wink Saville private static boolean isCdmaPhone() { 1332d3a8a3a138614071a7a8020e1579048c411abd78Wink Saville return (PhoneApp.getPhone().getPhoneType() == Phone.PHONE_TYPE_CDMA); 1333839b14d460986608fe577f89f789de854dc85b58Jim Miller } 1334af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville} 1335