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