1767a662ecde33c3979bf02b793d392aca0403162Wink Saville/*
2767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Copyright (C) 2006 The Android Open Source Project
3767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
4767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5767a662ecde33c3979bf02b793d392aca0403162Wink Saville * you may not use this file except in compliance with the License.
6767a662ecde33c3979bf02b793d392aca0403162Wink Saville * You may obtain a copy of the License at
7767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
8767a662ecde33c3979bf02b793d392aca0403162Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
10767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Unless required by applicable law or agreed to in writing, software
11767a662ecde33c3979bf02b793d392aca0403162Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12767a662ecde33c3979bf02b793d392aca0403162Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13767a662ecde33c3979bf02b793d392aca0403162Wink Saville * See the License for the specific language governing permissions and
14767a662ecde33c3979bf02b793d392aca0403162Wink Saville * limitations under the License.
15767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
16767a662ecde33c3979bf02b793d392aca0403162Wink Saville
17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony;
18767a662ecde33c3979bf02b793d392aca0403162Wink Saville
19767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.AsyncResult;
20767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Handler;
21767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Message;
22767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Registrant;
23767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.RegistrantList;
24767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.ServiceState;
25e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
26767a662ecde33c3979bf02b793d392aca0403162Wink Saville
27767a662ecde33c3979bf02b793d392aca0403162Wink Saville/**
28767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide}
29767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
30767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic abstract class ServiceStateTracker extends Handler {
3100416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink
32767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected CommandsInterface cm;
33767a662ecde33c3979bf02b793d392aca0403162Wink Saville
34767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public ServiceState ss;
35767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected ServiceState newSS;
36767a662ecde33c3979bf02b793d392aca0403162Wink Saville
37e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public SignalStrength mSignalStrength;
38e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
3988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    // TODO - this should not be public
4088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    public RestrictedState mRestrictedState = new RestrictedState();
4188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt
42fd2d01302781af91d77557a99874111a4fee8365Wink Saville    /* The otaspMode passed to PhoneStateListener#onOtaspChanged */
43fd2d01302781af91d77557a99874111a4fee8365Wink Saville    static public final int OTASP_UNINITIALIZED = 0;
44fd2d01302781af91d77557a99874111a4fee8365Wink Saville    static public final int OTASP_UNKNOWN = 1;
45fd2d01302781af91d77557a99874111a4fee8365Wink Saville    static public final int OTASP_NEEDED = 2;
46fd2d01302781af91d77557a99874111a4fee8365Wink Saville    static public final int OTASP_NOT_NEEDED = 3;
47fd2d01302781af91d77557a99874111a4fee8365Wink Saville
4800416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    /**
4900416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * A unique identifier to track requests associated with a poll
5000416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * and ignore stale responses.  The value is a count-down of
5100416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * expected responses in this pollingContext.
5200416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     */
53767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected int[] pollingContext;
54767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected boolean mDesiredPowerState;
55767a662ecde33c3979bf02b793d392aca0403162Wink Saville
5600416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    /**
57db09b5db60fa05ba65662faa86422b9ec69493a1Wink Saville     *  Values correspond to ServiceState.RADIO_TECHNOLOGY_ definitions.
58db09b5db60fa05ba65662faa86422b9ec69493a1Wink Saville     */
59db09b5db60fa05ba65662faa86422b9ec69493a1Wink Saville    protected int mRadioTechnology = 0;
60db09b5db60fa05ba65662faa86422b9ec69493a1Wink Saville    protected int mNewRadioTechnology = 0;
61db09b5db60fa05ba65662faa86422b9ec69493a1Wink Saville
62db09b5db60fa05ba65662faa86422b9ec69493a1Wink Saville    /**
6300416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * By default, strength polling is enabled.  However, if we're
6400416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * getting unsolicited signal strength updates from the radio, set
6500416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * value to true and don't bother polling any more.
6600416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     */
6700416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    protected boolean dontPollSignalStrength = false;
68767a662ecde33c3979bf02b793d392aca0403162Wink Saville
6988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    protected RegistrantList mRoamingOnRegistrants = new RegistrantList();
7088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    protected RegistrantList mRoamingOffRegistrants = new RegistrantList();
7188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    protected RegistrantList mAttachedRegistrants = new RegistrantList();
7288d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    protected RegistrantList mDetachedRegistrants = new RegistrantList();
7388d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    protected RegistrantList mNetworkAttachedRegistrants = new RegistrantList();
7488d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    protected RegistrantList mPsRestrictEnabledRegistrants = new RegistrantList();
7588d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    protected RegistrantList mPsRestrictDisabledRegistrants = new RegistrantList();
7688d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt
7795bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    /* Radio power off pending flag and tag counter */
7895bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    private boolean mPendingRadioPowerOffAfterDataOff = false;
7995bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    private int mPendingRadioPowerOffAfterDataOffTag = 0;
80767a662ecde33c3979bf02b793d392aca0403162Wink Saville
81767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected  static final boolean DBG = true;
82767a662ecde33c3979bf02b793d392aca0403162Wink Saville
8300416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    /** Signal strength poll rate. */
84767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int POLL_PERIOD_MILLIS = 20 * 1000;
85767a662ecde33c3979bf02b793d392aca0403162Wink Saville
8600416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    /** Waiting period before recheck gprs and voice registration. */
87767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public static final int DEFAULT_GPRS_CHECK_PERIOD_MILLIS = 60 * 1000;
88767a662ecde33c3979bf02b793d392aca0403162Wink Saville
8900416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    /** GSM events */
90767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RADIO_STATE_CHANGED               = 1;
91767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_NETWORK_STATE_CHANGED             = 2;
92767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_GET_SIGNAL_STRENGTH               = 3;
93767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_POLL_STATE_REGISTRATION           = 4;
94767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_POLL_STATE_GPRS                   = 5;
95767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_POLL_STATE_OPERATOR               = 6;
96767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_POLL_SIGNAL_STRENGTH              = 10;
97767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_NITZ_TIME                         = 11;
98767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_SIGNAL_STRENGTH_UPDATE            = 12;
99767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RADIO_AVAILABLE                   = 13;
100767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_POLL_STATE_NETWORK_SELECTION_MODE = 14;
101767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_GET_LOC_DONE                      = 15;
102767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_SIM_RECORDS_LOADED                = 16;
103767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_SIM_READY                         = 17;
104767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_LOCATION_UPDATES_ENABLED          = 18;
105767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_GET_PREFERRED_NETWORK_TYPE        = 19;
106767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_SET_PREFERRED_NETWORK_TYPE        = 20;
107767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RESET_PREFERRED_NETWORK_TYPE      = 21;
108767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_CHECK_REPORT_GPRS                 = 22;
109767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RESTRICTED_STATE_CHANGED          = 23;
1100a57e5b730beaea75c1c1b1ca51b40c463918b4dTammo Spalink
11100416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    /** CDMA events */
112767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_POLL_STATE_REGISTRATION_CDMA      = 24;
113767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_POLL_STATE_OPERATOR_CDMA          = 25;
114767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RUIM_READY                        = 26;
115767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RUIM_RECORDS_LOADED               = 27;
116e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final int EVENT_POLL_SIGNAL_STRENGTH_CDMA         = 28;
117e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final int EVENT_GET_SIGNAL_STRENGTH_CDMA          = 29;
118e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final int EVENT_NETWORK_STATE_CHANGED_CDMA        = 30;
119e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final int EVENT_GET_LOC_DONE_CDMA                 = 31;
120e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final int EVENT_SIGNAL_STRENGTH_UPDATE_CDMA       = 32;
121e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final int EVENT_NV_LOADED                         = 33;
122e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final int EVENT_POLL_STATE_CDMA_SUBSCRIPTION      = 34;
123e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final int EVENT_NV_READY                          = 35;
124e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final int EVENT_ERI_FILE_LOADED                   = 36;
125daccacb865947c00f277f1823333e2fbf91e652aWink Saville    protected static final int EVENT_OTA_PROVISION_STATUS_CHANGE       = 37;
126fa2944d93f4c5050fb4a99d90006791c2995b31cYong Zhang    protected static final int EVENT_SET_RADIO_POWER_OFF               = 38;
127767a662ecde33c3979bf02b793d392aca0403162Wink Saville
128767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final String TIMEZONE_PROPERTY = "persist.sys.timezone";
129767a662ecde33c3979bf02b793d392aca0403162Wink Saville
13000416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    /**
13100416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * List of ISO codes for countries that can have an offset of
13200416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * GMT+0 when not in daylight savings time.  This ignores some
13300416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * small places such as the Canary Islands (Spain) and
13400416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink     * Danmarkshavn (Denmark).  The list must be sorted by code.
13500416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    */
136767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final String[] GMT_COUNTRY_CODES = {
137767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "bf", // Burkina Faso
138767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "ci", // Cote d'Ivoire
139767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "eh", // Western Sahara
140767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "fo", // Faroe Islands, Denmark
141767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "gh", // Ghana
142767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "gm", // Gambia
143767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "gn", // Guinea
144767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "gw", // Guinea Bissau
145767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "ie", // Ireland
146767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "lr", // Liberia
147767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "is", // Iceland
148767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "ma", // Morocco
149767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "ml", // Mali
150767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "mr", // Mauritania
151767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "pt", // Portugal
152767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "sl", // Sierra Leone
153767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "sn", // Senegal
154767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "st", // Sao Tome and Principe
155767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "tg", // Togo
156767a662ecde33c3979bf02b793d392aca0403162Wink Saville        "uk", // U.K
157767a662ecde33c3979bf02b793d392aca0403162Wink Saville    };
158767a662ecde33c3979bf02b793d392aca0403162Wink Saville
15900416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink    /** Reason for registration denial. */
160e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final String REGISTRATION_DENIED_GEN  = "General";
161e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    protected static final String REGISTRATION_DENIED_AUTH = "Authentication Failure";
162767a662ecde33c3979bf02b793d392aca0403162Wink Saville
163767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public ServiceStateTracker() {
164767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
165767a662ecde33c3979bf02b793d392aca0403162Wink Saville
166cf2119a9755d9e2713ce78e84d0826d430a11a62Jaikumar Ganesh    public boolean getDesiredPowerState() {
167cf2119a9755d9e2713ce78e84d0826d430a11a62Jaikumar Ganesh        return mDesiredPowerState;
168cf2119a9755d9e2713ce78e84d0826d430a11a62Jaikumar Ganesh    }
169767a662ecde33c3979bf02b793d392aca0403162Wink Saville
170767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
171767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Registration point for combined roaming on
172767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * combined roaming is true when roaming is true and ONS differs SPN
173767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
174767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param h handler to notify
175767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param what what code of message when delivered
176767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param obj placed in Message.obj
177767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
178767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public  void registerForRoamingOn(Handler h, int what, Object obj) {
179767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Registrant r = new Registrant(h, what, obj);
18088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mRoamingOnRegistrants.add(r);
181767a662ecde33c3979bf02b793d392aca0403162Wink Saville
182767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (ss.getRoaming()) {
183767a662ecde33c3979bf02b793d392aca0403162Wink Saville            r.notifyRegistrant();
184767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
185767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
186767a662ecde33c3979bf02b793d392aca0403162Wink Saville
187767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public  void unregisterForRoamingOn(Handler h) {
18888d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mRoamingOnRegistrants.remove(h);
189767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
190767a662ecde33c3979bf02b793d392aca0403162Wink Saville
191767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
192767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Registration point for combined roaming off
193767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * combined roaming is true when roaming is true and ONS differs SPN
194767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
195767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param h handler to notify
196767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param what what code of message when delivered
197767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param obj placed in Message.obj
198767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
199767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public  void registerForRoamingOff(Handler h, int what, Object obj) {
200767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Registrant r = new Registrant(h, what, obj);
20188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mRoamingOffRegistrants.add(r);
202767a662ecde33c3979bf02b793d392aca0403162Wink Saville
203767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (!ss.getRoaming()) {
204767a662ecde33c3979bf02b793d392aca0403162Wink Saville            r.notifyRegistrant();
205767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
206767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
207767a662ecde33c3979bf02b793d392aca0403162Wink Saville
208767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public  void unregisterForRoamingOff(Handler h) {
20988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mRoamingOffRegistrants.remove(h);
210767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
211767a662ecde33c3979bf02b793d392aca0403162Wink Saville
212767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
213390de220248d05ccb9dc10a197700ad3c1595937Jake Hamby     * Re-register network by toggling preferred network type.
214390de220248d05ccb9dc10a197700ad3c1595937Jake Hamby     * This is a work-around to deregister and register network since there is
215767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * no ril api to set COPS=2 (deregister) only.
216767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
217767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param onComplete is dispatched when this is complete.  it will be
218767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * an AsyncResult, and onComplete.obj.exception will be non-null
219767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * on failure.
220767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
221767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void reRegisterNetwork(Message onComplete) {
222767a662ecde33c3979bf02b793d392aca0403162Wink Saville        cm.getPreferredNetworkType(
223767a662ecde33c3979bf02b793d392aca0403162Wink Saville                obtainMessage(EVENT_GET_PREFERRED_NETWORK_TYPE, onComplete));
224767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
225767a662ecde33c3979bf02b793d392aca0403162Wink Saville
226767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
227767a662ecde33c3979bf02b793d392aca0403162Wink Saville    setRadioPower(boolean power) {
228767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mDesiredPowerState = power;
229767a662ecde33c3979bf02b793d392aca0403162Wink Saville
230767a662ecde33c3979bf02b793d392aca0403162Wink Saville        setPowerStateToDesired();
231767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
232767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2337a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    /**
2347a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink     * These two flags manage the behavior of the cell lock -- the
2357a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink     * lock should be held if either flag is true.  The intention is
236390de220248d05ccb9dc10a197700ad3c1595937Jake Hamby     * to allow temporary acquisition of the lock to get a single
2377a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink     * update.  Such a lock grab and release can thus be made to not
2387a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink     * interfere with more permanent lock holds -- in other words, the
2397a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink     * lock will only be released if both flags are false, and so
2407a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink     * releases by temporary users will only affect the lock state if
2417a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink     * there is no continuous user.
2427a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink     */
2437a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    private boolean mWantContinuousLocationUpdates;
2447a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    private boolean mWantSingleLocationUpdate;
2457a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink
2467a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    public void enableSingleLocationUpdate() {
2477a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        if (mWantSingleLocationUpdate || mWantContinuousLocationUpdates) return;
2487a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        mWantSingleLocationUpdate = true;
2497a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        cm.setLocationUpdates(true, obtainMessage(EVENT_LOCATION_UPDATES_ENABLED));
2507a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    }
2517a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink
252767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void enableLocationUpdates() {
2537a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        if (mWantSingleLocationUpdate || mWantContinuousLocationUpdates) return;
2547a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        mWantContinuousLocationUpdates = true;
255767a662ecde33c3979bf02b793d392aca0403162Wink Saville        cm.setLocationUpdates(true, obtainMessage(EVENT_LOCATION_UPDATES_ENABLED));
256767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
257767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2587a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    protected void disableSingleLocationUpdate() {
2597a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        mWantSingleLocationUpdate = false;
2607a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        if (!mWantSingleLocationUpdate && !mWantContinuousLocationUpdates) {
2617a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink            cm.setLocationUpdates(false, null);
2627a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        }
2637a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    }
2647a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink
265767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void disableLocationUpdates() {
2667a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        mWantContinuousLocationUpdates = false;
2677a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        if (!mWantSingleLocationUpdate && !mWantContinuousLocationUpdates) {
2687a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink            cm.setLocationUpdates(false, null);
2697a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        }
270767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
271767a662ecde33c3979bf02b793d392aca0403162Wink Saville
27295bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    @Override
27395bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    public void handleMessage(Message msg) {
27495bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville        switch (msg.what) {
27595bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville            case EVENT_SET_RADIO_POWER_OFF:
27695bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                synchronized(this) {
27795bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                    if (mPendingRadioPowerOffAfterDataOff &&
27895bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                            (msg.arg1 == mPendingRadioPowerOffAfterDataOffTag)) {
27995bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                        if (DBG) log("EVENT_SET_RADIO_OFF, turn radio off now.");
28095bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                        hangupAndPowerOff();
28195bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                        mPendingRadioPowerOffAfterDataOffTag += 1;
28295bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                        mPendingRadioPowerOffAfterDataOff = false;
28395bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                    } else {
28495bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                        log("EVENT_SET_RADIO_OFF is stale arg1=" + msg.arg1 +
28595bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                                "!= tag=" + mPendingRadioPowerOffAfterDataOffTag);
28695bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                    }
28795bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                }
28895bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                break;
28995bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville
29095bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville            default:
29195bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                log("Unhandled message with number: " + msg.what);
29295bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                break;
29395bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville        }
29495bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    }
295767a662ecde33c3979bf02b793d392aca0403162Wink Saville
296fd2d01302781af91d77557a99874111a4fee8365Wink Saville    protected abstract Phone getPhone();
297767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void handlePollStateResult(int what, AsyncResult ar);
298767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void updateSpnDisplay();
299767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void setPowerStateToDesired();
300fd2d01302781af91d77557a99874111a4fee8365Wink Saville    protected abstract void log(String s);
3015203a5bc28a5ae432eab236780b2f97bdec71dbfWink Saville    protected abstract void loge(String s);
302767a662ecde33c3979bf02b793d392aca0403162Wink Saville
3039d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public abstract int getCurrentDataConnectionState();
3049d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public abstract boolean isConcurrentVoiceAndDataAllowed();
30588d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt
30688d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    /**
30788d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * Registration point for transition into DataConnection attached.
30888d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param h handler to notify
30988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param what what code of message when delivered
31088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param obj placed in Message.obj
31188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     */
3129d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public void registerForDataConnectionAttached(Handler h, int what, Object obj) {
31388d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        Registrant r = new Registrant(h, what, obj);
31488d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mAttachedRegistrants.add(r);
3159d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
31688d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        if (getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) {
31788d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt            r.notifyRegistrant();
31888d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        }
31988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    }
3209d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public void unregisterForDataConnectionAttached(Handler h) {
32188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mAttachedRegistrants.remove(h);
3229d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
3239d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
32488d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    /**
32588d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * Registration point for transition into DataConnection detached.
32688d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param h handler to notify
32788d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param what what code of message when delivered
32888d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param obj placed in Message.obj
32988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     */
3309d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public void registerForDataConnectionDetached(Handler h, int what, Object obj) {
33188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        Registrant r = new Registrant(h, what, obj);
33288d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mDetachedRegistrants.add(r);
3339d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
3349d7d5b44355f0554ed13851ec11ec68a273ba56bWink Saville        if (getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) {
33588d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt            r.notifyRegistrant();
33688d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        }
33788d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    }
3389d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public void unregisterForDataConnectionDetached(Handler h) {
33988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mDetachedRegistrants.remove(h);
3409d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
3419d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
34288d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    /**
34388d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * Registration point for transition into network attached.
34488d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param h handler to notify
34588d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param what what code of message when delivered
34688d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param obj in Message.obj
34788d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     */
34888d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    public void registerForNetworkAttached(Handler h, int what, Object obj) {
34988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        Registrant r = new Registrant(h, what, obj);
35088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt
35188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mNetworkAttachedRegistrants.add(r);
35288d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        if (ss.getState() == ServiceState.STATE_IN_SERVICE) {
35388d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt            r.notifyRegistrant();
35488d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        }
35588d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    }
35688d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    public void unregisterForNetworkAttached(Handler h) {
35788d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mNetworkAttachedRegistrants.remove(h);
35888d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    }
35988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt
36088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    /**
36188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * Registration point for transition into packet service restricted zone.
36288d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param h handler to notify
36388d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param what what code of message when delivered
36488d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param obj placed in Message.obj
36588d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     */
3669d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
36788d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        Registrant r = new Registrant(h, what, obj);
36888d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mPsRestrictEnabledRegistrants.add(r);
36988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt
37088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        if (mRestrictedState.isPsRestricted()) {
37188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt            r.notifyRegistrant();
37288d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        }
3739d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
3749d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
3759d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public void unregisterForPsRestrictedEnabled(Handler h) {
37688d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mPsRestrictEnabledRegistrants.remove(h);
3779d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
3789d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
37988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt    /**
38088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * Registration point for transition out of packet service restricted zone.
38188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param h handler to notify
38288d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param what what code of message when delivered
38388d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     * @param obj placed in Message.obj
38488d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt     */
3859d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
38688d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        Registrant r = new Registrant(h, what, obj);
38788d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mPsRestrictDisabledRegistrants.add(r);
38888d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt
38988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        if (mRestrictedState.isPsRestricted()) {
39088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt            r.notifyRegistrant();
39188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        }
3929d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
3939d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
3949d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public void unregisterForPsRestrictedDisabled(Handler h) {
39588d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mPsRestrictDisabledRegistrants.remove(h);
3969d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
3979d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
3983805c7ca324f232972c959e06253de4242f83607John Wang    /**
3993805c7ca324f232972c959e06253de4242f83607John Wang     * Clean up existing voice and data connection then turn off radio power.
4003805c7ca324f232972c959e06253de4242f83607John Wang     *
4013805c7ca324f232972c959e06253de4242f83607John Wang     * Hang up the existing voice calls to decrease call drop rate.
4023805c7ca324f232972c959e06253de4242f83607John Wang     */
40395bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    public void powerOffRadioSafely(DataConnectionTracker dcTracker) {
40495bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville        synchronized (this) {
40595bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville            if (!mPendingRadioPowerOffAfterDataOff) {
406d986c609074cda0737a6f06f10700e42fb1704e7Wink Saville                // To minimize race conditions we call cleanUpAllConnections on
407d986c609074cda0737a6f06f10700e42fb1704e7Wink Saville                // both if else paths instead of before this isDisconnected test.
408d986c609074cda0737a6f06f10700e42fb1704e7Wink Saville                if (dcTracker.isDisconnected()) {
409d986c609074cda0737a6f06f10700e42fb1704e7Wink Saville                    // To minimize race conditions we do this after isDisconnected
410d986c609074cda0737a6f06f10700e42fb1704e7Wink Saville                    dcTracker.cleanUpAllConnections(Phone.REASON_RADIO_TURNED_OFF);
411d986c609074cda0737a6f06f10700e42fb1704e7Wink Saville                    if (DBG) log("Data disconnected, turn off radio right away.");
412d986c609074cda0737a6f06f10700e42fb1704e7Wink Saville                    hangupAndPowerOff();
413d986c609074cda0737a6f06f10700e42fb1704e7Wink Saville                } else {
414157f9a0449228f8e3fe5d285c9746875aeff1581Ramesh Sudini                    dcTracker.cleanUpAllConnections(Phone.REASON_RADIO_TURNED_OFF);
41595bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                    Message msg = Message.obtain(this);
41695bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                    msg.what = EVENT_SET_RADIO_POWER_OFF;
41795bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                    msg.arg1 = ++mPendingRadioPowerOffAfterDataOffTag;
41895bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                    if (sendMessageDelayed(msg, 30000)) {
41995bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                        if (DBG) log("Wait upto 30s for data to disconnect, then turn off radio.");
42095bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                        mPendingRadioPowerOffAfterDataOff = true;
42195bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                    } else {
42295bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                        log("Cannot send delayed Msg, turn off radio right away.");
42395bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                        hangupAndPowerOff();
42495bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                    }
42595bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                }
42695bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville            }
42795bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville        }
42895bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    }
42995bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville
43095bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    /**
43195bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville     * process the pending request to turn radio off after data is disconnected
43295bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville     *
43395bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville     * return true if there is pending request to process; false otherwise.
43495bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville     */
43595bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    public boolean processPendingRadioPowerOffAfterDataOff() {
43695bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville        synchronized(this) {
43795bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville            if (mPendingRadioPowerOffAfterDataOff) {
43895bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                if (DBG) log("Process pending request to turn radio off.");
43995bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                mPendingRadioPowerOffAfterDataOffTag += 1;
44095bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                hangupAndPowerOff();
44195bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                mPendingRadioPowerOffAfterDataOff = false;
44295bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville                return true;
44395bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville            }
44495bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville            return false;
44595bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville        }
44695bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    }
44795bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville
44895bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    /**
44995bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville     * Hang up all voice call and turn off radio. Implemented by derived class.
45095bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville     */
45195bc2b7564b201d10f2a5e319f69972e18c58261Wink Saville    protected abstract void hangupAndPowerOff();
4523805c7ca324f232972c959e06253de4242f83607John Wang
453767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Cancel a pending (if any) pollState() operation */
454767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected void cancelPollState() {
45500416365dedc03c9ed74d94728025fd2d68f648dTammo Spalink        // This will effectively cancel the rest of the poll requests.
456767a662ecde33c3979bf02b793d392aca0403162Wink Saville        pollingContext = new int[1];
457767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
458767a662ecde33c3979bf02b793d392aca0403162Wink Saville}
459