ApnContext.java revision ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6a
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;
2099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
224918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.DctConstants;
234918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.Phone;
244918296afe1c667e9523cdfc799f558f7ebc2bfbWink Saville
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicBoolean;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicInteger;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Maintain the Apn context
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class ApnContext {
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String LOG_TAG;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
38ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final boolean DBG = false;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final String mApnType;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DctConstants.State mState;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private ArrayList<ApnSetting> mWaitingApns = null;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** A zero indicates that all waiting APNs had a permanent error */
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private AtomicInteger mWaitingApnsPermanentFailureCountDown;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private ApnSetting mApnSetting;
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    DataConnectionAc mDataConnectionAc;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    String mReason;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
55ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    PendingIntent mReconnectAlarmIntent;
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * user/app requested connection on this APN
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    AtomicBoolean mDataEnabled;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * carrier requirements met
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    AtomicBoolean mDependencyMet;
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ApnContext(String apnType, String logTag) {
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApnType = apnType;
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mState = DctConstants.State.IDLE;
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setReason(Phone.REASON_DATA_ENABLED);
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataEnabled = new AtomicBoolean(false);
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDependencyMet = new AtomicBoolean(true);
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApnsPermanentFailureCountDown = new AtomicInteger(0);
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        LOG_TAG = logTag;
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getApnType() {
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mApnType;
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
81ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public synchronized DataConnectionAc getDcAc() {
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnectionAc;
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setDataConnectionAc(DataConnectionAc dcac) {
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
872563e7e1ec513121b980045571a245aa5390f1c5Wink Saville            log("setDataConnectionAc: old dcac=" + mDataConnectionAc + " new dcac=" + dcac
882563e7e1ec513121b980045571a245aa5390f1c5Wink Saville                    + " this=" + this);
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if ((dcac == null) && (mDataConnectionAc != null)) {
912563e7e1ec513121b980045571a245aa5390f1c5Wink Saville            // TODO: This tearDown should be done by caller, but for now we'll do it
922563e7e1ec513121b980045571a245aa5390f1c5Wink Saville            if (DBG) log("setDataConnection: call tearDown");
93ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mDataConnectionAc.tearDown(this, "", null);
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataConnectionAc = dcac;
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
98ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public synchronized PendingIntent getReconnectIntent() {
99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return mReconnectAlarmIntent;
100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public synchronized void setReconnectIntent(PendingIntent intent) {
103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mReconnectAlarmIntent = intent;
104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized ApnSetting getApnSetting() {
107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        log("getApnSetting: apnSetting=" + mApnSetting);
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mApnSetting;
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setApnSetting(ApnSetting apnSetting) {
112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        log("setApnSetting: apnSetting=" + apnSetting);
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApnSetting = apnSetting;
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApns = waitingApns;
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApnsPermanentFailureCountDown.set(mWaitingApns.size());
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getWaitingApnsPermFailCount() {
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWaitingApnsPermanentFailureCountDown.get();
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void decWaitingApnsPermFailCount() {
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWaitingApnsPermanentFailureCountDown.decrementAndGet();
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized ApnSetting getNextWaitingApn() {
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ArrayList<ApnSetting> list = mWaitingApns;
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ApnSetting apn = null;
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (list != null) {
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (!list.isEmpty()) {
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                apn = list.get(0);
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return apn;
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void removeWaitingApn(ApnSetting apn) {
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mWaitingApns != null) {
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mWaitingApns.remove(apn);
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized ArrayList<ApnSetting> getWaitingApns() {
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWaitingApns;
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setState(DctConstants.State s) {
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("setState: " + s + ", previous state:" + mState);
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mState = s;
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mState == DctConstants.State.FAILED) {
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (mWaitingApns != null) {
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mWaitingApns.clear(); // when teardown the connection and set to IDLE
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized DctConstants.State getState() {
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mState;
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDisconnected() {
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DctConstants.State currentState = getState();
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ((currentState == DctConstants.State.IDLE) ||
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    currentState == DctConstants.State.FAILED);
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized void setReason(String reason) {
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("set reason as " + reason + ",current state " + mState);
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mReason = reason;
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public synchronized String getReason() {
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mReason;
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isReady() {
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataEnabled.get() && mDependencyMet.get();
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public boolean isConnectable() {
191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return isReady() && ((mState == DctConstants.State.IDLE)
192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                || (mState == DctConstants.State.SCANNING)
193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                || (mState == DctConstants.State.RETRYING)
194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                                || (mState == DctConstants.State.FAILED));
195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setEnabled(boolean enabled) {
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("set enabled as " + enabled + ", current state is " + mDataEnabled.get());
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataEnabled.set(enabled);
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isEnabled() {
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataEnabled.get();
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setDependencyMet(boolean met) {
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("set mDependencyMet as " + met + " current state is " + mDependencyMet.get());
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDependencyMet.set(met);
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getDependencyMet() {
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville       return mDependencyMet.get();
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String toString() {
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // We don't print mDataConnection because its recursive.
222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={" + mWaitingApns +
223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                "} mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown +
224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                " mApnSetting={" + mApnSetting + "} mReason=" + mReason +
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " mDataEnabled=" + mDataEnabled + " mDependencyMet=" + mDependencyMet + "}";
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void log(String s) {
22999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.d(LOG_TAG, "[ApnContext:" + mApnType + "] " + s);
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("ApnContext: " + this.toString());
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
236