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