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