10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 174918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savillepackage com.android.internal.telephony.dataconnection; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 19ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.app.PendingIntent; 2043c93591d6261be6dad375979e98b0f6ad2771fdWink Savilleimport android.content.Context; 213fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwaltimport android.net.NetworkConfig; 2299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2443c93591d6261be6dad375979e98b0f6ad2771fdWink Savilleimport com.android.internal.R; 254918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.DctConstants; 264918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.Phone; 274918296afe1c667e9523cdfc799f558f7ebc2bfbWink Saville 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor; 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicBoolean; 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicInteger; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Maintain the Apn context 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 37608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwaltpublic class ApnContext { 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String LOG_TAG; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 41608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt protected static final boolean DBG = false; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4343c93591d6261be6dad375979e98b0f6ad2771fdWink Saville private final Context mContext; 4443c93591d6261be6dad375979e98b0f6ad2771fdWink Saville 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final String mApnType; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private DctConstants.State mState; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ArrayList<ApnSetting> mWaitingApns = null; 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 51c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt /** 52c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt * Used to check if conditions (new RAT) are resulting in a new list which warrants a retry. 53c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt * Set in the last trySetupData call. 54c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt */ 55c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt private ArrayList<ApnSetting> mOriginalWaitingApns = null; 56c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt 573fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt public final int priority; 583fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** A zero indicates that all waiting APNs had a permanent error */ 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private AtomicInteger mWaitingApnsPermanentFailureCountDown; 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ApnSetting mApnSetting; 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 64454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcAsyncChannel mDcAc; 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 66608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt String mReason; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 68ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PendingIntent mReconnectAlarmIntent; 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * user/app requested connection on this APN 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AtomicBoolean mDataEnabled; 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 75071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt private final Object mRefCountLock = new Object(); 76071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt private int mRefCount = 0; 77071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * carrier requirements met 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AtomicBoolean mDependencyMet; 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 83071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt private final DcTrackerBase mDcTracker; 84071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt 85c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt /** 86c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt * Remember this as a change in this value to a more permissive state 87c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt * should cause us to retry even permanent failures 88c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt */ 89c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt private boolean mConcurrentVoiceAndDataAllowed; 90c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt 91071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt public ApnContext(Context context, String apnType, String logTag, NetworkConfig config, 92071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt DcTrackerBase tracker) { 9343c93591d6261be6dad375979e98b0f6ad2771fdWink Saville mContext = context; 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mApnType = apnType; 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mState = DctConstants.State.IDLE; 96608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt setReason(Phone.REASON_DATA_ENABLED); 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDataEnabled = new AtomicBoolean(false); 983fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt mDependencyMet = new AtomicBoolean(config.dependencyMet); 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWaitingApnsPermanentFailureCountDown = new AtomicInteger(0); 1003fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt priority = config.priority; 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville LOG_TAG = logTag; 102071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt mDcTracker = tracker; 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getApnType() { 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mApnType; 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 109454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville public synchronized DcAsyncChannel getDcAc() { 110454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville return mDcAc; 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 113454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville public synchronized void setDataConnectionAc(DcAsyncChannel dcac) { 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 115454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville log("setDataConnectionAc: old dcac=" + mDcAc + " new dcac=" + dcac 1162563e7e1ec513121b980045571a245aa5390f1c5Wink Saville + " this=" + this); 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 118454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mDcAc = dcac; 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public synchronized PendingIntent getReconnectIntent() { 122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mReconnectAlarmIntent; 123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public synchronized void setReconnectIntent(PendingIntent intent) { 126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectAlarmIntent = intent; 127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized ApnSetting getApnSetting() { 130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("getApnSetting: apnSetting=" + mApnSetting); 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mApnSetting; 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized void setApnSetting(ApnSetting apnSetting) { 135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("setApnSetting: apnSetting=" + apnSetting); 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mApnSetting = apnSetting; 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized void setWaitingApns(ArrayList<ApnSetting> waitingApns) { 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWaitingApns = waitingApns; 141c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt mOriginalWaitingApns = new ArrayList<ApnSetting>(waitingApns); 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWaitingApnsPermanentFailureCountDown.set(mWaitingApns.size()); 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int getWaitingApnsPermFailCount() { 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mWaitingApnsPermanentFailureCountDown.get(); 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void decWaitingApnsPermFailCount() { 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWaitingApnsPermanentFailureCountDown.decrementAndGet(); 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized ApnSetting getNextWaitingApn() { 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ArrayList<ApnSetting> list = mWaitingApns; 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ApnSetting apn = null; 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (list != null) { 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!list.isEmpty()) { 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville apn = list.get(0); 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return apn; 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized void removeWaitingApn(ApnSetting apn) { 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mWaitingApns != null) { 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWaitingApns.remove(apn); 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 171c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt public synchronized ArrayList<ApnSetting> getOriginalWaitingApns() { 172c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt return mOriginalWaitingApns; 173c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } 174c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized ArrayList<ApnSetting> getWaitingApns() { 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mWaitingApns; 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 179c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt public synchronized void setConcurrentVoiceAndDataAllowed(boolean allowed) { 180c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt mConcurrentVoiceAndDataAllowed = allowed; 181c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } 182c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt 183c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt public synchronized boolean isConcurrentVoiceAndDataAllowed() { 184c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt return mConcurrentVoiceAndDataAllowed; 185c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } 186c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized void setState(DctConstants.State s) { 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("setState: " + s + ", previous state:" + mState); 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mState = s; 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mState == DctConstants.State.FAILED) { 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mWaitingApns != null) { 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWaitingApns.clear(); // when teardown the connection and set to IDLE 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized DctConstants.State getState() { 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mState; 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isDisconnected() { 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DctConstants.State currentState = getState(); 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ((currentState == DctConstants.State.IDLE) || 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville currentState == DctConstants.State.FAILED); 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized void setReason(String reason) { 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("set reason as " + reason + ",current state " + mState); 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 215608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt mReason = reason; 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public synchronized String getReason() { 219608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt return mReason; 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isReady() { 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mDataEnabled.get() && mDependencyMet.get(); 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean isConnectable() { 227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return isReady() && ((mState == DctConstants.State.IDLE) 228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || (mState == DctConstants.State.SCANNING) 229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || (mState == DctConstants.State.RETRYING) 230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || (mState == DctConstants.State.FAILED)); 231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 233e9063f6973039d66e12d0d930af03906d377969eWink Saville public boolean isConnectedOrConnecting() { 234e9063f6973039d66e12d0d930af03906d377969eWink Saville return isReady() && ((mState == DctConstants.State.CONNECTED) 235e9063f6973039d66e12d0d930af03906d377969eWink Saville || (mState == DctConstants.State.CONNECTING) 236e9063f6973039d66e12d0d930af03906d377969eWink Saville || (mState == DctConstants.State.SCANNING) 237e9063f6973039d66e12d0d930af03906d377969eWink Saville || (mState == DctConstants.State.RETRYING)); 238e9063f6973039d66e12d0d930af03906d377969eWink Saville } 239e9063f6973039d66e12d0d930af03906d377969eWink Saville 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setEnabled(boolean enabled) { 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("set enabled as " + enabled + ", current state is " + mDataEnabled.get()); 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDataEnabled.set(enabled); 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isEnabled() { 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mDataEnabled.get(); 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setDependencyMet(boolean met) { 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("set mDependencyMet as " + met + " current state is " + mDependencyMet.get()); 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDependencyMet.set(met); 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean getDependencyMet() { 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mDependencyMet.get(); 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 26243c93591d6261be6dad375979e98b0f6ad2771fdWink Saville public boolean isProvisioningApn() { 263608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt String provisioningApn = mContext.getResources() 264608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt .getString(R.string.mobile_provisioning_apn); 265608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt if ((mApnSetting != null) && (mApnSetting.apn != null)) { 266608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt return (mApnSetting.apn.equals(provisioningApn)); 267608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt } else { 268608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt return false; 26943c93591d6261be6dad375979e98b0f6ad2771fdWink Saville } 27043c93591d6261be6dad375979e98b0f6ad2771fdWink Saville } 27143c93591d6261be6dad375979e98b0f6ad2771fdWink Saville 272071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt public void incRefCount() { 273071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt synchronized (mRefCountLock) { 274071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt if (mRefCount++ == 0) { 275071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), true); 276071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt } 277071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt } 278071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt } 279071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt 280071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt public void decRefCount() { 281071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt synchronized (mRefCountLock) { 282071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt if (mRefCount-- == 1) { 283071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), false); 284071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt } 285071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt } 286071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt } 287071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2890f94d3aebcf0daf154bf0876164844d09067f904Wink Saville public synchronized String toString() { 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // We don't print mDataConnection because its recursive. 291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={" + mWaitingApns + 292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "} mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown + 293608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt " mApnSetting={" + mApnSetting + "} mReason=" + mReason + 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville " mDataEnabled=" + mDataEnabled + " mDependencyMet=" + mDependencyMet + "}"; 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void log(String s) { 29899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.d(LOG_TAG, "[ApnContext:" + mApnType + "] " + s); 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println("ApnContext: " + this.toString()); 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 305