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