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 */
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class ApnContext {
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String LOG_TAG;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
41ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    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
513fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt    public final int priority;
523fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** A zero indicates that all waiting APNs had a permanent error */
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private AtomicInteger mWaitingApnsPermanentFailureCountDown;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private ApnSetting mApnSetting;
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
58454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville    DcAsyncChannel mDcAc;
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    String mReason;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
62ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    PendingIntent mReconnectAlarmIntent;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * user/app requested connection on this APN
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    AtomicBoolean mDataEnabled;
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * carrier requirements met
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    AtomicBoolean mDependencyMet;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
743fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt    public ApnContext(Context context, String apnType, String logTag, NetworkConfig config) {
7543c93591d6261be6dad375979e98b0f6ad2771fdWink Saville        mContext = context;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApnType = apnType;
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mState = DctConstants.State.IDLE;
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setReason(Phone.REASON_DATA_ENABLED);
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataEnabled = new AtomicBoolean(false);
803fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt        mDependencyMet = new AtomicBoolean(config.dependencyMet);
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApnsPermanentFailureCountDown = new AtomicInteger(0);
823fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt        priority = config.priority;
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        LOG_TAG = logTag;
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getApnType() {
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mApnType;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
90454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville    public synchronized DcAsyncChannel getDcAc() {
91454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        return mDcAc;
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
94454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville    public synchronized void setDataConnectionAc(DcAsyncChannel dcac) {
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
96454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            log("setDataConnectionAc: old dcac=" + mDcAc + " new dcac=" + dcac
972563e7e1ec513121b980045571a245aa5390f1c5Wink Saville                    + " this=" + this);
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
99454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        mDcAc = dcac;
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public synchronized PendingIntent getReconnectIntent() {
103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return mReconnectAlarmIntent;
104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public synchronized void setReconnectIntent(PendingIntent intent) {
107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mReconnectAlarmIntent = intent;
108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized ApnSetting getApnSetting() {
111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        log("getApnSetting: apnSetting=" + mApnSetting);
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mApnSetting;
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setApnSetting(ApnSetting apnSetting) {
116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        log("setApnSetting: apnSetting=" + apnSetting);
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApnSetting = apnSetting;
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApns = waitingApns;
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApnsPermanentFailureCountDown.set(mWaitingApns.size());
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getWaitingApnsPermFailCount() {
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWaitingApnsPermanentFailureCountDown.get();
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void decWaitingApnsPermFailCount() {
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApnsPermanentFailureCountDown.decrementAndGet();
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized ApnSetting getNextWaitingApn() {
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ArrayList<ApnSetting> list = mWaitingApns;
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ApnSetting apn = null;
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (list != null) {
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (!list.isEmpty()) {
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                apn = list.get(0);
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return apn;
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void removeWaitingApn(ApnSetting apn) {
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mWaitingApns != null) {
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mWaitingApns.remove(apn);
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized ArrayList<ApnSetting> getWaitingApns() {
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWaitingApns;
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setState(DctConstants.State s) {
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("setState: " + s + ", previous state:" + mState);
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mState = s;
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mState == DctConstants.State.FAILED) {
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (mWaitingApns != null) {
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mWaitingApns.clear(); // when teardown the connection and set to IDLE
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized DctConstants.State getState() {
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mState;
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDisconnected() {
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DctConstants.State currentState = getState();
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ((currentState == DctConstants.State.IDLE) ||
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    currentState == DctConstants.State.FAILED);
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setReason(String reason) {
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("set reason as " + reason + ",current state " + mState);
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mReason = reason;
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized String getReason() {
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mReason;
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isReady() {
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataEnabled.get() && mDependencyMet.get();
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public boolean isConnectable() {
195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return isReady() && ((mState == DctConstants.State.IDLE)
196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                || (mState == DctConstants.State.SCANNING)
197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                || (mState == DctConstants.State.RETRYING)
198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                || (mState == DctConstants.State.FAILED));
199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
201e9063f6973039d66e12d0d930af03906d377969eWink Saville    public boolean isConnectedOrConnecting() {
202e9063f6973039d66e12d0d930af03906d377969eWink Saville        return isReady() && ((mState == DctConstants.State.CONNECTED)
203e9063f6973039d66e12d0d930af03906d377969eWink Saville                                || (mState == DctConstants.State.CONNECTING)
204e9063f6973039d66e12d0d930af03906d377969eWink Saville                                || (mState == DctConstants.State.SCANNING)
205e9063f6973039d66e12d0d930af03906d377969eWink Saville                                || (mState == DctConstants.State.RETRYING));
206e9063f6973039d66e12d0d930af03906d377969eWink Saville    }
207e9063f6973039d66e12d0d930af03906d377969eWink Saville
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setEnabled(boolean enabled) {
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("set enabled as " + enabled + ", current state is " + mDataEnabled.get());
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataEnabled.set(enabled);
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isEnabled() {
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataEnabled.get();
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setDependencyMet(boolean met) {
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("set mDependencyMet as " + met + " current state is " + mDependencyMet.get());
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDependencyMet.set(met);
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getDependencyMet() {
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville       return mDependencyMet.get();
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23043c93591d6261be6dad375979e98b0f6ad2771fdWink Saville    public boolean isProvisioningApn() {
23143c93591d6261be6dad375979e98b0f6ad2771fdWink Saville        String provisioningApn = mContext.getResources()
23243c93591d6261be6dad375979e98b0f6ad2771fdWink Saville                .getString(R.string.mobile_provisioning_apn);
2339f332c9a4f464b36bac30555c5cfa6431e7211f8Wink Saville        if ((mApnSetting != null) && (mApnSetting.apn != null)) {
23443c93591d6261be6dad375979e98b0f6ad2771fdWink Saville            return (mApnSetting.apn.equals(provisioningApn));
23543c93591d6261be6dad375979e98b0f6ad2771fdWink Saville        } else {
23643c93591d6261be6dad375979e98b0f6ad2771fdWink Saville            return false;
23743c93591d6261be6dad375979e98b0f6ad2771fdWink Saville        }
23843c93591d6261be6dad375979e98b0f6ad2771fdWink Saville    }
23943c93591d6261be6dad375979e98b0f6ad2771fdWink Saville
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2410f94d3aebcf0daf154bf0876164844d09067f904Wink Saville    public synchronized String toString() {
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // We don't print mDataConnection because its recursive.
243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={" + mWaitingApns +
244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                "} mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown +
245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                " mApnSetting={" + mApnSetting + "} mReason=" + mReason +
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " mDataEnabled=" + mDataEnabled + " mDependencyMet=" + mDependencyMet + "}";
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void log(String s) {
25099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.d(LOG_TAG, "[ApnContext:" + mApnType + "] " + s);
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("ApnContext: " + this.toString());
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
257