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