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