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.app.PendingIntent;
20767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.AsyncResult;
21767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Handler;
22767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Message;
23767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.RemoteException;
24767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.provider.Settings;
25767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.provider.Settings.SettingNotFoundException;
2625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwaltimport android.text.TextUtils;
27767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log;
28767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwaltimport java.util.ArrayList;
3025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
31767a662ecde33c3979bf02b793d392aca0403162Wink Saville/**
32767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide}
33767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
34767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
35767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic abstract class DataConnectionTracker extends Handler {
36cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn    protected static final boolean DBG = false;
3725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected final String LOG_TAG = "DataConnectionTracker";
38767a662ecde33c3979bf02b793d392aca0403162Wink Saville
39767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
40767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * IDLE: ready to start data connection setup, default state
41767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * INITING: state of issued setupDefaultPDP() but not finish yet
42767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * CONNECTING: state of issued startPppd() but not finish yet
43767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * SCANNING: data connection fails with one apn but other apns are available
44767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *           ready to start data connection on other apns (before INITING)
45767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * CONNECTED: IP connection is setup
46767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * DISCONNECTING: Connection.disconnect() has been called, but PDP
47767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *                context is not yet deactivated
48767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * FAILED: data connection fail for all apns settings
49767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
50767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * getDataConnectionState() maps State to DataState
51767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *      FAILED or IDLE : DISCONNECTED
52767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *      INITING or CONNECTING or SCANNING: CONNECTING
53767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *      CONNECTED : CONNECTED or DISCONNECTING
54767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
55767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public enum State {
56767a662ecde33c3979bf02b793d392aca0403162Wink Saville        IDLE,
57767a662ecde33c3979bf02b793d392aca0403162Wink Saville        INITING,
58767a662ecde33c3979bf02b793d392aca0403162Wink Saville        CONNECTING,
59767a662ecde33c3979bf02b793d392aca0403162Wink Saville        SCANNING,
60767a662ecde33c3979bf02b793d392aca0403162Wink Saville        CONNECTED,
61767a662ecde33c3979bf02b793d392aca0403162Wink Saville        DISCONNECTING,
62767a662ecde33c3979bf02b793d392aca0403162Wink Saville        FAILED
63767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
64767a662ecde33c3979bf02b793d392aca0403162Wink Saville
65767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public enum Activity {
66767a662ecde33c3979bf02b793d392aca0403162Wink Saville        NONE,
67767a662ecde33c3979bf02b793d392aca0403162Wink Saville        DATAIN,
68767a662ecde33c3979bf02b793d392aca0403162Wink Saville        DATAOUT,
69e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        DATAINANDOUT,
70e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        DORMANT
71767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
72767a662ecde33c3979bf02b793d392aca0403162Wink Saville
73868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt    /***** Event Codes *****/
74767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_DATA_SETUP_COMPLETE = 1;
75767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RADIO_AVAILABLE = 3;
76767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RECORDS_LOADED = 4;
77767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_TRY_SETUP_DATA = 5;
78767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_DATA_STATE_CHANGED = 6;
79767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_POLL_PDP = 7;
80767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_GET_PDP_LIST_COMPLETE = 11;
81767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 12;
82767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_VOICE_CALL_STARTED = 14;
83767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_VOICE_CALL_ENDED = 15;
84767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_GPRS_DETACHED = 19;
85767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_LINK_STATE_CHANGED = 20;
86767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_ROAMING_ON = 21;
87767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_ROAMING_OFF = 22;
88767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_ENABLE_NEW_APN = 23;
89767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_RESTORE_DEFAULT_APN = 24;
90767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_DISCONNECT_DONE = 25;
91767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_GPRS_ATTACHED = 26;
92767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_START_NETSTAT_POLL = 27;
93767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_START_RECOVERY = 28;
94767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_APN_CHANGED = 29;
95767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_CDMA_DATA_DETACHED = 30;
96767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_NV_READY = 31;
97767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_PS_RESTRICT_ENABLED = 32;
98767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int EVENT_PS_RESTRICT_DISABLED = 33;
999c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh    public static final int EVENT_CLEAN_UP_CONNECTION = 34;
100ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville    protected static final int EVENT_CDMA_OTA_PROVISION = 35;
10125254db31a7c4190cc453d38cd50d65a17885305Yong Zhang    protected static final int EVENT_RESTART_RADIO = 36;
102984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt    protected static final int EVENT_SET_MASTER_DATA_ENABLE = 37;
10316dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville    protected static final int EVENT_RESET_DONE = 38;
104767a662ecde33c3979bf02b793d392aca0403162Wink Saville
105868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt    /***** Constants *****/
106767a662ecde33c3979bf02b793d392aca0403162Wink Saville
10725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected static final int APN_INVALID_ID = -1;
10825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected static final int APN_DEFAULT_ID = 0;
10925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected static final int APN_MMS_ID = 1;
11025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected static final int APN_SUPL_ID = 2;
11125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected static final int APN_DUN_ID = 3;
11225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected static final int APN_HIPRI_ID = 4;
11325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected static final int APN_NUM_TYPES = 5;
11425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
115984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt    protected static final int DISABLED = 0;
116984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt    protected static final int ENABLED = 1;
117984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt
118984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt    // responds to the setDataEnabled call - used independently from the APN requests
119984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt    protected boolean mMasterDataEnabled = true;
120868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt
12125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected boolean[] dataEnabled = new boolean[APN_NUM_TYPES];
12225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected int enabledCount = 0;
12325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
12425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    /* Currently requested APN type */
12525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected String mRequestedApnType = Phone.APN_TYPE_DEFAULT;
12625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
1273918e13b24d4e7ad410089eb615721ca026bec01Wink Saville    /** Retry configuration: A doubling of retry times from 5secs to 30minutes */
1283918e13b24d4e7ad410089eb615721ca026bec01Wink Saville    protected static final String DEFAULT_DATA_RETRY_CONFIG = "default_randomization=2000,"
1293918e13b24d4e7ad410089eb615721ca026bec01Wink Saville        + "5000,10000,20000,40000,80000:5000,160000:5000,"
1303918e13b24d4e7ad410089eb615721ca026bec01Wink Saville        + "320000:5000,640000:5000,1280000:5000,1800000:5000";
131767a662ecde33c3979bf02b793d392aca0403162Wink Saville
13289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    /** Retry configuration for secondary networks: 4 tries in 20 sec */
13389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    protected static final String SECONDARY_DATA_RETRY_CONFIG =
134aad261730c566332e7b4ab29e800cca3cee9a15cRobert Greenwalt            "max_retries=3, 5000, 5000, 5000";
13589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt
136767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Slow poll when attempting connection recovery. */
137767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int POLL_NETSTAT_SLOW_MILLIS = 5000;
138767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Default ping deadline, in seconds. */
139faf4413dffdc9079683b951736088ff2a01073a4jsh    protected static final int DEFAULT_PING_DEADLINE = 5;
140767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Default max failure count before attempting to network re-registration. */
141faf4413dffdc9079683b951736088ff2a01073a4jsh    protected static final int DEFAULT_MAX_PDP_RESET_FAIL = 3;
142767a662ecde33c3979bf02b793d392aca0403162Wink Saville
143767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
144767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * After detecting a potential connection problem, this is the max number
145767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * of subsequent polls before attempting a radio reset.  At this point,
146767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * poll interval is 5 seconds (POLL_NETSTAT_SLOW_MILLIS), so set this to
147767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * poll for about 2 more minutes.
148767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
149767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int NO_RECV_POLL_LIMIT = 24;
150767a662ecde33c3979bf02b793d392aca0403162Wink Saville
151767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // 1 sec. default polling interval when screen is on.
152767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int POLL_NETSTAT_MILLIS = 1000;
153767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // 10 min. default polling interval when screen is off.
154767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int POLL_NETSTAT_SCREEN_OFF_MILLIS = 1000*60*10;
155767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // 2 min for round trip time
156767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int POLL_LONGEST_RTT = 120 * 1000;
157767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // 10 for packets without ack
158767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int NUMBER_SENT_PACKETS_OF_HANG = 10;
159767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // how long to wait before switching back to default APN
160767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final int RESTORE_DEFAULT_APN_DELAY = 1 * 60 * 1000;
161767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // system property that can override the above value
162767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final String APN_RESTORE_DELAY_PROP_NAME = "android.telephony.apn-restore";
163767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // represents an invalid IP address
164767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected static final String NULL_IP = "0.0.0.0";
165767a662ecde33c3979bf02b793d392aca0403162Wink Saville
166767a662ecde33c3979bf02b793d392aca0403162Wink Saville
167767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // member variables
168767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected PhoneBase phone;
169767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected Activity activity = Activity.NONE;
170767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected State state = State.IDLE;
171767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected Handler mDataConnectionTracker = null;
172767a662ecde33c3979bf02b793d392aca0403162Wink Saville
173767a662ecde33c3979bf02b793d392aca0403162Wink Saville
174767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected long txPkts, rxPkts, sentSinceLastRecv;
175767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected int netStatPollPeriod;
176767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected int mNoRecvPollCount = 0;
177767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected boolean netStatPollEnabled = false;
178767a662ecde33c3979bf02b793d392aca0403162Wink Saville
179ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville    /** Manage the behavior of data retry after failure */
18089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    protected RetryManager mRetryMgr = new RetryManager();
181ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville
182767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // wifi connection status will be updated by sticky intent
183767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected boolean mIsWifiConnected = false;
184767a662ecde33c3979bf02b793d392aca0403162Wink Saville
185767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** Intent sent when the reconnect alarm fires. */
186767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected PendingIntent mReconnectIntent = null;
1879c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh
188767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /** CID of active data connection */
189767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected int cidActive;
190767a662ecde33c3979bf02b793d392aca0403162Wink Saville
191767a662ecde33c3979bf02b793d392aca0403162Wink Saville   /**
192767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Default constructor
193767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
194767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected DataConnectionTracker(PhoneBase phone) {
195767a662ecde33c3979bf02b793d392aca0403162Wink Saville        super();
196767a662ecde33c3979bf02b793d392aca0403162Wink Saville        this.phone = phone;
197767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
198767a662ecde33c3979bf02b793d392aca0403162Wink Saville
19925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    public abstract void dispose();
20025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
201767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public Activity getActivity() {
202767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return activity;
203767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
204767a662ecde33c3979bf02b793d392aca0403162Wink Saville
205767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public State getState() {
206767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return state;
207767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
208767a662ecde33c3979bf02b793d392aca0403162Wink Saville
209767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getStateInString() {
210767a662ecde33c3979bf02b793d392aca0403162Wink Saville        switch (state) {
211767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case IDLE:          return "IDLE";
212767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case INITING:       return "INIT";
213767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case CONNECTING:    return "CING";
214767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case SCANNING:      return "SCAN";
215767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case CONNECTED:     return "CNTD";
216767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case DISCONNECTING: return "DING";
217767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case FAILED:        return "FAIL";
218767a662ecde33c3979bf02b793d392aca0403162Wink Saville            default:            return "ERRO";
219767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
220767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
221767a662ecde33c3979bf02b793d392aca0403162Wink Saville
222767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
223767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * The data connection is expected to be setup while device
224767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *  1. has Icc card
225767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *  2. registered for data service
226767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *  3. user doesn't explicitly disable data service
227767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *  4. wifi is not on
228767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
229767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @return false while no data connection if all above requirements are met.
230767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
231767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public abstract boolean isDataConnectionAsDesired();
232767a662ecde33c3979bf02b793d392aca0403162Wink Saville
233767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //The data roaming setting is now located in the shared preferences.
234767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //  See if the requested preference value is the same as that stored in
235767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //  the shared values.  If it is not, then update it.
236767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setDataOnRoamingEnabled(boolean enabled) {
237767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (getDataOnRoamingEnabled() != enabled) {
238767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Settings.Secure.putInt(phone.getContext().getContentResolver(),
239767a662ecde33c3979bf02b793d392aca0403162Wink Saville                Settings.Secure.DATA_ROAMING, enabled ? 1 : 0);
240ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville            if (phone.getServiceState().getRoaming()) {
241ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville                if (enabled) {
242ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville                    mRetryMgr.resetRetryCount();
243ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville                }
244ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville                sendMessage(obtainMessage(EVENT_ROAMING_ON));
245ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville            }
246767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
247767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
248767a662ecde33c3979bf02b793d392aca0403162Wink Saville
249767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //Retrieve the data roaming setting from the shared preferences.
250767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getDataOnRoamingEnabled() {
251767a662ecde33c3979bf02b793d392aca0403162Wink Saville        try {
252767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return Settings.Secure.getInt(phone.getContext().getContentResolver(),
253767a662ecde33c3979bf02b793d392aca0403162Wink Saville                Settings.Secure.DATA_ROAMING) > 0;
254767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } catch (SettingNotFoundException snfe) {
255767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return false;
256767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
257767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
258767a662ecde33c3979bf02b793d392aca0403162Wink Saville
259767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // abstract handler methods
260868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt    protected abstract boolean onTrySetupData(String reason);
261767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void onRoamingOff();
262767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void onRoamingOn();
263767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void onRadioAvailable();
264767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void onRadioOffOrNotAvailable();
265767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void onDataSetupComplete(AsyncResult ar);
266767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void onDisconnectDone(AsyncResult ar);
26716dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville    protected abstract void onResetDone(AsyncResult ar);
268767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void onVoiceCallStarted();
269767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected abstract void onVoiceCallEnded();
2709c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh    protected abstract void onCleanUpConnection(boolean tearDown, String reason);
271767a662ecde33c3979bf02b793d392aca0403162Wink Saville
272868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt    @Override
273767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void handleMessage (Message msg) {
274767a662ecde33c3979bf02b793d392aca0403162Wink Saville        switch (msg.what) {
275767a662ecde33c3979bf02b793d392aca0403162Wink Saville
27689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            case EVENT_ENABLE_NEW_APN:
27789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                onEnableApn(msg.arg1, msg.arg2);
278868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt                break;
279868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt
280767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_TRY_SETUP_DATA:
281faf4413dffdc9079683b951736088ff2a01073a4jsh                String reason = null;
282faf4413dffdc9079683b951736088ff2a01073a4jsh                if (msg.obj instanceof String) {
283faf4413dffdc9079683b951736088ff2a01073a4jsh                    reason = (String)msg.obj;
284faf4413dffdc9079683b951736088ff2a01073a4jsh                }
285faf4413dffdc9079683b951736088ff2a01073a4jsh                onTrySetupData(reason);
286767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
287767a662ecde33c3979bf02b793d392aca0403162Wink Saville
288767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_ROAMING_OFF:
289ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville                if (getDataOnRoamingEnabled() == false) {
290ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville                    mRetryMgr.resetRetryCount();
291ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville                }
292767a662ecde33c3979bf02b793d392aca0403162Wink Saville                onRoamingOff();
293767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
294767a662ecde33c3979bf02b793d392aca0403162Wink Saville
295767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_ROAMING_ON:
296767a662ecde33c3979bf02b793d392aca0403162Wink Saville                onRoamingOn();
297767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
298767a662ecde33c3979bf02b793d392aca0403162Wink Saville
299767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_RADIO_AVAILABLE:
300767a662ecde33c3979bf02b793d392aca0403162Wink Saville                onRadioAvailable();
301767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
302767a662ecde33c3979bf02b793d392aca0403162Wink Saville
303767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_RADIO_OFF_OR_NOT_AVAILABLE:
304767a662ecde33c3979bf02b793d392aca0403162Wink Saville                onRadioOffOrNotAvailable();
305767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
306767a662ecde33c3979bf02b793d392aca0403162Wink Saville
307767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_DATA_SETUP_COMPLETE:
308767a662ecde33c3979bf02b793d392aca0403162Wink Saville                cidActive = msg.arg1;
309767a662ecde33c3979bf02b793d392aca0403162Wink Saville                onDataSetupComplete((AsyncResult) msg.obj);
310767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
311767a662ecde33c3979bf02b793d392aca0403162Wink Saville
312767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_DISCONNECT_DONE:
313767a662ecde33c3979bf02b793d392aca0403162Wink Saville                onDisconnectDone((AsyncResult) msg.obj);
314767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
315767a662ecde33c3979bf02b793d392aca0403162Wink Saville
316767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_VOICE_CALL_STARTED:
317767a662ecde33c3979bf02b793d392aca0403162Wink Saville                onVoiceCallStarted();
318767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
319767a662ecde33c3979bf02b793d392aca0403162Wink Saville
320767a662ecde33c3979bf02b793d392aca0403162Wink Saville            case EVENT_VOICE_CALL_ENDED:
321767a662ecde33c3979bf02b793d392aca0403162Wink Saville                onVoiceCallEnded();
322767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
323767a662ecde33c3979bf02b793d392aca0403162Wink Saville
3249c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh            case EVENT_CLEAN_UP_CONNECTION:
3259c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh                boolean tearDown = (msg.arg1 == 0) ? false : true;
3269c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh                onCleanUpConnection(tearDown, (String)msg.obj);
3279c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh                break;
3289c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh
329984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt            case EVENT_SET_MASTER_DATA_ENABLE:
330984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt                boolean enabled = (msg.arg1 == ENABLED) ? true : false;
331984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt                onSetDataEnabled(enabled);
332984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt                break;
333984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt
33416dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville            case EVENT_RESET_DONE:
33516dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville                onResetDone((AsyncResult) msg.obj);
33616dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville                break;
33716dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville
338767a662ecde33c3979bf02b793d392aca0403162Wink Saville            default:
339767a662ecde33c3979bf02b793d392aca0403162Wink Saville                Log.e("DATA", "Unidentified event = " + msg.what);
340767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
341767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
342767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
343767a662ecde33c3979bf02b793d392aca0403162Wink Saville
344767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
345767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Report the current state of data connectivity (enabled or disabled)
346767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @return {@code false} if data connectivity has been explicitly disabled,
347767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * {@code true} otherwise.
348767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
349868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt    public synchronized boolean getDataEnabled() {
35025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        return dataEnabled[APN_DEFAULT_ID];
35125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    }
352767a662ecde33c3979bf02b793d392aca0403162Wink Saville
353767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
354767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Report on whether data connectivity is enabled
355767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @return {@code false} if data connectivity has been explicitly disabled,
356767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * {@code true} otherwise.
357767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
35825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    public boolean getAnyDataEnabled() {
35925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        return (enabledCount != 0);
36025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    }
36125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
36225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract void startNetStatPoll();
36325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
36425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract void stopNetStatPoll();
36525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
36625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract void restartRadio();
36725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
36825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract void log(String s);
36925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
37025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected int apnTypeToId(String type) {
37125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        if (TextUtils.equals(type, Phone.APN_TYPE_DEFAULT)) {
37225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return APN_DEFAULT_ID;
37325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        } else if (TextUtils.equals(type, Phone.APN_TYPE_MMS)) {
37425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return APN_MMS_ID;
37525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        } else if (TextUtils.equals(type, Phone.APN_TYPE_SUPL)) {
37625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return APN_SUPL_ID;
37725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        } else if (TextUtils.equals(type, Phone.APN_TYPE_DUN)) {
37825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return APN_DUN_ID;
37925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        } else if (TextUtils.equals(type, Phone.APN_TYPE_HIPRI)) {
38025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return APN_HIPRI_ID;
38125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        } else {
38225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return APN_INVALID_ID;
38325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        }
38425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    }
38525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
38689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    protected String apnIdToType(int id) {
38789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        switch (id) {
38889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        case APN_DEFAULT_ID:
38989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            return Phone.APN_TYPE_DEFAULT;
39089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        case APN_MMS_ID:
39189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            return Phone.APN_TYPE_MMS;
39289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        case APN_SUPL_ID:
39389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            return Phone.APN_TYPE_SUPL;
39489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        case APN_DUN_ID:
39589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            return Phone.APN_TYPE_DUN;
39689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        case APN_HIPRI_ID:
39789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            return Phone.APN_TYPE_HIPRI;
39889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        default:
39989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            Log.e(LOG_TAG, "Unknown id (" + id + ") in apnIdToType");
40089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            return Phone.APN_TYPE_DEFAULT;
40189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        }
40289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    }
40389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt
40425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract boolean isApnTypeActive(String type);
40525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
40625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract boolean isApnTypeAvailable(String type);
40725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
40825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract String[] getActiveApnTypes();
40925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
41025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract String getActiveApnString();
41125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
41225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    public abstract ArrayList<DataConnection> getAllDataConnections();
41325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
41425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract String getInterfaceName(String apnType);
41525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
41625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract String getIpAddress(String apnType);
41725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
41825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract String getGateway(String apnType);
41925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
42025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract String[] getDnsServers(String apnType);
42125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
42225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    protected abstract void setState(State s);
42325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
424868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt    protected synchronized boolean isEnabled(int id) {
42525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        if (id != APN_INVALID_ID) {
42625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return dataEnabled[id];
42725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        }
42825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        return false;
42925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    }
43025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
43125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    /**
43225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * Ensure that we are connected to an APN of the specified type.
43325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * @param type the APN type (currently the only valid values
43425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * are {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL})
43525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * @return the result of the operation. Success is indicated by
43625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * a return value of either {@code Phone.APN_ALREADY_ACTIVE} or
43725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * {@code Phone.APN_REQUEST_STARTED}. In the latter case, a broadcast
43825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * will be sent by the ConnectivityManager when a connection to
43925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * the APN has been established.
44025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     */
441d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt    public synchronized int enableApnType(String type) {
44225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        int id = apnTypeToId(type);
44325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        if (id == APN_INVALID_ID) {
44425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return Phone.APN_REQUEST_FAILED;
44525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        }
44625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
44765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt        if (DBG) Log.d(LOG_TAG, "enableApnType("+type+"), isApnTypeActive = "
44825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt                + isApnTypeActive(type) + " and state = " + state);
44925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
45025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        if (!isApnTypeAvailable(type)) {
45165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt            if (DBG) Log.d(LOG_TAG, "type not available");
45225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return Phone.APN_TYPE_NOT_AVAILABLE;
45325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        }
45425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
455d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt        // just because it's active doesn't mean we had it explicitly requested before
456d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt        // (a broad default may handle many types).  make sure we mark it enabled
457d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt        // so if the default is disabled we keep the connection for others
45825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        setEnabled(id, true);
459d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt
460d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt        if (isApnTypeActive(type)) {
461d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt            if (state == State.INITING) return Phone.APN_REQUEST_STARTED;
462d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt            else if (state == State.CONNECTED) return Phone.APN_ALREADY_ACTIVE;
463d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt        }
46425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        return Phone.APN_REQUEST_STARTED;
46525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    }
46625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
46725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    /**
46825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * The APN of the specified type is no longer needed. Ensure that if
46925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * use of the default APN has not been explicitly disabled, we are connected
47025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * to the default APN.
47125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * @param type the APN type. The only valid values are currently
47225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}.
47325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * @return
47425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     */
475868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt    public synchronized int disableApnType(String type) {
47625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        if (DBG) Log.d(LOG_TAG, "disableApnType("+type+")");
47725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        int id = apnTypeToId(type);
47825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        if (id == APN_INVALID_ID) {
47925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return Phone.APN_REQUEST_FAILED;
48025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        }
48125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        if (isEnabled(id)) {
48225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            setEnabled(id, false);
48325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            if (isApnTypeActive(Phone.APN_TYPE_DEFAULT)) {
48425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt                if (dataEnabled[APN_DEFAULT_ID]) {
48525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt                    return Phone.APN_ALREADY_ACTIVE;
48625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt                } else {
48725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt                    return Phone.APN_REQUEST_STARTED;
48825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt                }
48925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            } else {
49025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt                return Phone.APN_REQUEST_STARTED;
49125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            }
49225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        } else {
49325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt            return Phone.APN_REQUEST_FAILED;
49425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        }
49525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    }
49625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt
49789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    private void setEnabled(int id, boolean enable) {
4980badd0b700ed618dac421cb6cde4654b51acb3a4Robert Greenwalt        if (DBG) Log.d(LOG_TAG, "setEnabled(" + id + ", " + enable + ") with old state = " +
4990badd0b700ed618dac421cb6cde4654b51acb3a4Robert Greenwalt                dataEnabled[id] + " and enabledCount = " + enabledCount);
500868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt
50189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        Message msg = obtainMessage(EVENT_ENABLE_NEW_APN);
502868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt        msg.arg1 = id;
503984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt        msg.arg2 = (enable ? ENABLED : DISABLED);
504868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt        sendMessage(msg);
50525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    }
506767a662ecde33c3979bf02b793d392aca0403162Wink Saville
50789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    protected synchronized void onEnableApn(int apnId, int enabled) {
50889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        if (DBG) {
509d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt            Log.d(LOG_TAG, "EVENT_APN_ENABLE_REQUEST " + apnId + ", " + enabled);
510d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt            Log.d(LOG_TAG, " dataEnabled = " + dataEnabled[apnId] +
511d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt                    ", enabledCount = " + enabledCount +
512d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt                    ", isApnTypeActive = " + isApnTypeActive(apnIdToType(apnId)));
51389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        }
514984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt        if (enabled == ENABLED) {
51589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            if (!dataEnabled[apnId]) {
51689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                dataEnabled[apnId] = true;
51789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                enabledCount++;
51889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            }
519d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt            String type = apnIdToType(apnId);
520d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt            if (!isApnTypeActive(type)) {
521d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt                mRequestedApnType = type;
522d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt                onEnableNewApn();
523d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt            }
52489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        } else {
52589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            // disable
52689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            if (dataEnabled[apnId]) {
52789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                dataEnabled[apnId] = false;
52889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                enabledCount--;
52989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                if (enabledCount == 0) {
53089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                    onCleanUpConnection(true, Phone.REASON_DATA_DISABLED);
531d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt                } else if (dataEnabled[APN_DEFAULT_ID] == true &&
532d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt                        !isApnTypeActive(Phone.APN_TYPE_DEFAULT)) {
53389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                    mRequestedApnType = Phone.APN_TYPE_DEFAULT;
53489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                    onEnableNewApn();
53589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt                }
53689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt            }
53789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt        }
53889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    }
53989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt
54089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    /**
54189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt     * Called when we switch APNs.
54289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt     *
54389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt     * mRequestedApnType is set prior to call
54489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt     * To be overridden.
54589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt     */
54689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    protected void onEnableNewApn() {
54789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt    }
54889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt
549767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
550767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Prevent mobile data connections from being established,
551767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * or once again allow mobile data connections. If the state
552767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * toggles, then either tear down or set up data, as
553767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * appropriate to match the new state.
55425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * <p>This operation only affects the default APN, and if the same APN is
55525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * currently being used for MMS traffic, the teardown will not happen
55625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt     * even when {@code enable} is {@code false}.</p>
557767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param enable indicates whether to enable ({@code true}) or disable ({@code false}) data
558767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @return {@code true} if the operation succeeded
559767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
56025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    public boolean setDataEnabled(boolean enable) {
561868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt        if (DBG) Log.d(LOG_TAG, "setDataEnabled(" + enable + ")");
562984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt
563984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt        Message msg = obtainMessage(EVENT_SET_MASTER_DATA_ENABLE);
564984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt        msg.arg1 = (enable ? ENABLED : DISABLED);
565984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt        sendMessage(msg);
56625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt        return true;
56725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt    }
568767a662ecde33c3979bf02b793d392aca0403162Wink Saville
569984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt    protected void onSetDataEnabled(boolean enable) {
570984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt        if (mMasterDataEnabled != enable) {
571984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt            mMasterDataEnabled = enable;
572984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt            if (enable) {
573984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt                mRetryMgr.resetRetryCount();
574984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt                onTrySetupData(Phone.REASON_DATA_ENABLED);
575984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt            } else {
576984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt                onCleanUpConnection(true, Phone.REASON_DATA_DISABLED);
577984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt           }
578984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt        }
579984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt    }
580984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt
581984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt
582767a662ecde33c3979bf02b793d392aca0403162Wink Saville}
583