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
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicBoolean;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicInteger;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Maintain the Apn context
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class ApnContext {
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String LOG_TAG;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final boolean DBG = true;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final String mApnType;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DctConstants.State mState;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private ArrayList<ApnSetting> mWaitingApns = null;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** A zero indicates that all waiting APNs had a permanent error */
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private AtomicInteger mWaitingApnsPermanentFailureCountDown;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private ApnSetting mApnSetting;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    DataConnection mDataConnection;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    DataConnectionAc mDataConnectionAc;
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    String mReason;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int mRetryCount;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * user/app requested connection on this APN
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    AtomicBoolean mDataEnabled;
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * carrier requirements met
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    AtomicBoolean mDependencyMet;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ApnContext(String apnType, String logTag) {
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApnType = apnType;
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mState = DctConstants.State.IDLE;
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setReason(Phone.REASON_DATA_ENABLED);
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setRetryCount(0);
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataEnabled = new AtomicBoolean(false);
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDependencyMet = new AtomicBoolean(true);
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApnsPermanentFailureCountDown = new AtomicInteger(0);
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        LOG_TAG = logTag;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getApnType() {
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mApnType;
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized DataConnection getDataConnection() {
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnection;
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setDataConnection(DataConnection dc) {
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("setDataConnection: old dc=" + mDataConnection + " new dc=" + dc + " this=" + this);
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataConnection = dc;
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized DataConnectionAc getDataConnectionAc() {
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnectionAc;
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setDataConnectionAc(DataConnectionAc dcac) {
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("setDataConnectionAc: old dcac=" + mDataConnectionAc + " new dcac=" + dcac);
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dcac != null) {
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            dcac.addApnContextSync(this);
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (mDataConnectionAc != null) {
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mDataConnectionAc.removeApnContextSync(this);
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataConnectionAc = dcac;
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized ApnSetting getApnSetting() {
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mApnSetting;
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setApnSetting(ApnSetting apnSetting) {
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApnSetting = apnSetting;
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApns = waitingApns;
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApnsPermanentFailureCountDown.set(mWaitingApns.size());
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getWaitingApnsPermFailCount() {
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWaitingApnsPermanentFailureCountDown.get();
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void decWaitingApnsPermFailCount() {
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApnsPermanentFailureCountDown.decrementAndGet();
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized ApnSetting getNextWaitingApn() {
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ArrayList<ApnSetting> list = mWaitingApns;
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ApnSetting apn = null;
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (list != null) {
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (!list.isEmpty()) {
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                apn = list.get(0);
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return apn;
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void removeWaitingApn(ApnSetting apn) {
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mWaitingApns != null) {
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mWaitingApns.remove(apn);
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized ArrayList<ApnSetting> getWaitingApns() {
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWaitingApns;
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setState(DctConstants.State s) {
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("setState: " + s + ", previous state:" + mState);
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mState = s;
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mState == DctConstants.State.FAILED) {
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (mWaitingApns != null) {
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mWaitingApns.clear(); // when teardown the connection and set to IDLE
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized DctConstants.State getState() {
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mState;
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDisconnected() {
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DctConstants.State currentState = getState();
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ((currentState == DctConstants.State.IDLE) ||
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    currentState == DctConstants.State.FAILED);
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setReason(String reason) {
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("set reason as " + reason + ",current state " + mState);
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mReason = reason;
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized String getReason() {
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mReason;
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setRetryCount(int retryCount) {
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("setRetryCount: " + retryCount);
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRetryCount = retryCount;
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DataConnection dc = mDataConnection;
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dc != null) {
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            dc.setRetryCount(retryCount);
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized int getRetryCount() {
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mRetryCount;
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isReady() {
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataEnabled.get() && mDependencyMet.get();
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setEnabled(boolean enabled) {
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("set enabled as " + enabled + ", current state is " + mDataEnabled.get());
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataEnabled.set(enabled);
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isEnabled() {
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataEnabled.get();
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setDependencyMet(boolean met) {
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("set mDependencyMet as " + met + " current state is " + mDependencyMet.get());
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDependencyMet.set(met);
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getDependencyMet() {
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville       return mDependencyMet.get();
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String toString() {
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // We don't print mDataConnection because its recursive.
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns=" + mWaitingApns +
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown +
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " mApnSetting=" + mApnSetting + " mDataConnectionAc=" + mDataConnectionAc +
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " mReason=" + mReason + " mRetryCount=" + mRetryCount +
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " mDataEnabled=" + mDataEnabled + " mDependencyMet=" + mDependencyMet + "}";
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void log(String s) {
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.d(LOG_TAG, "[ApnContext:" + mApnType + "] " + s);
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("ApnContext: " + this.toString());
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
247