19d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville/*
29d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * Copyright (C) 2006 The Android Open Source Project
39d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville *
49d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
59d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * you may not use this file except in compliance with the License.
69d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * You may obtain a copy of the License at
79d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville *
89d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
99d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville *
109d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * Unless required by applicable law or agreed to in writing, software
119d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
129d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * See the License for the specific language governing permissions and
149d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * limitations under the License.
159d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville */
169d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
179d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Savillepackage com.android.internal.telephony;
189d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
199d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Savilleimport android.util.Log;
2030ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville
2130ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Savilleimport java.io.FileDescriptor;
2230ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Savilleimport java.io.PrintWriter;
239d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Savilleimport java.util.ArrayList;
247a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwaltimport java.util.concurrent.atomic.AtomicBoolean;
257a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwaltimport java.util.concurrent.atomic.AtomicInteger;
269d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
279d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville/**
289d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville * Maintain the Apn context
299d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville */
309d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Savillepublic class ApnContext {
319d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
329d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public final String LOG_TAG;
339d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
349d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    protected static final boolean DBG = true;
359d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
367a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    private final String mApnType;
379d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
387a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    private DataConnectionTracker.State mState;
399d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
407a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    private ArrayList<ApnSetting> mWaitingApns = null;
419d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
4244ff718f62ccaffb3ea7fbeb6c2e2c74f3d9b063Wink Saville    /** A zero indicates that all waiting APNs had a permanent error */
437a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    private AtomicInteger mWaitingApnsPermanentFailureCountDown;
449d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
457a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    private ApnSetting mApnSetting;
469d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
47d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    DataConnection mDataConnection;
489d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
490b80114a2d80c359a1b462c388247995ef653c00Wink Saville    DataConnectionAc mDataConnectionAc;
500b80114a2d80c359a1b462c388247995ef653c00Wink Saville
519d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    String mReason;
529d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
53d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    /**
54d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt     * user/app requested connection on this APN
55d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt     */
567a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    AtomicBoolean mDataEnabled;
57d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt
58d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    /**
59d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt     * carrier requirements met
60d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt     */
617a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    AtomicBoolean mDependencyMet;
62d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt
639d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public ApnContext(String apnType, String logTag) {
649d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        mApnType = apnType;
659d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        mState = DataConnectionTracker.State.IDLE;
669d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        setReason(Phone.REASON_DATA_ENABLED);
677a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        mDataEnabled = new AtomicBoolean(false);
687a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        mDependencyMet = new AtomicBoolean(true);
697a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        mWaitingApnsPermanentFailureCountDown = new AtomicInteger(0);
709d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        LOG_TAG = logTag;
719d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
729d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
739d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public String getApnType() {
749d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mApnType;
759d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
769d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
777a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized DataConnection getDataConnection() {
789d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mDataConnection;
799d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
809d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
81f19540a2d7958f60f88428f964733e50d462c65bWink Saville    public synchronized void setDataConnection(DataConnection dc) {
82f19540a2d7958f60f88428f964733e50d462c65bWink Saville        if (DBG) {
83f19540a2d7958f60f88428f964733e50d462c65bWink Saville            log("setDataConnection: old dc=" + mDataConnection + " new dc=" + dc + " this=" + this);
84f19540a2d7958f60f88428f964733e50d462c65bWink Saville        }
85f19540a2d7958f60f88428f964733e50d462c65bWink Saville        mDataConnection = dc;
869d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
879d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
880b80114a2d80c359a1b462c388247995ef653c00Wink Saville
890b80114a2d80c359a1b462c388247995ef653c00Wink Saville    public synchronized DataConnectionAc getDataConnectionAc() {
900b80114a2d80c359a1b462c388247995ef653c00Wink Saville        return mDataConnectionAc;
910b80114a2d80c359a1b462c388247995ef653c00Wink Saville    }
920b80114a2d80c359a1b462c388247995ef653c00Wink Saville
930b80114a2d80c359a1b462c388247995ef653c00Wink Saville    public synchronized void setDataConnectionAc(DataConnectionAc dcac) {
94f19540a2d7958f60f88428f964733e50d462c65bWink Saville        if (DBG) {
95f19540a2d7958f60f88428f964733e50d462c65bWink Saville            log("setDataConnectionAc: old dcac=" + mDataConnectionAc + " new dcac=" + dcac);
96f19540a2d7958f60f88428f964733e50d462c65bWink Saville        }
97e303d7b31800f1382982cd0117b44ecfbdec08c4Kazuhiro Ondo        if (dcac != null) {
981e5c72c7041e0c8299cb5a5d028c022eb01036c6Kazuhiro Ondo            dcac.addApnContextSync(this);
99e303d7b31800f1382982cd0117b44ecfbdec08c4Kazuhiro Ondo        } else {
100f19540a2d7958f60f88428f964733e50d462c65bWink Saville            if (mDataConnectionAc != null) {
101f19540a2d7958f60f88428f964733e50d462c65bWink Saville                mDataConnectionAc.removeApnContextSync(this);
102f19540a2d7958f60f88428f964733e50d462c65bWink Saville            }
103e303d7b31800f1382982cd0117b44ecfbdec08c4Kazuhiro Ondo        }
1040b80114a2d80c359a1b462c388247995ef653c00Wink Saville        mDataConnectionAc = dcac;
1050b80114a2d80c359a1b462c388247995ef653c00Wink Saville    }
1060b80114a2d80c359a1b462c388247995ef653c00Wink Saville
1077a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized ApnSetting getApnSetting() {
1089d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mApnSetting;
1099d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1109d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1117a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized void setApnSetting(ApnSetting apnSetting) {
1129d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        mApnSetting = apnSetting;
1139d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1149d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1157a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
1169d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        mWaitingApns = waitingApns;
1177a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        mWaitingApnsPermanentFailureCountDown.set(mWaitingApns.size());
11844ff718f62ccaffb3ea7fbeb6c2e2c74f3d9b063Wink Saville    }
11944ff718f62ccaffb3ea7fbeb6c2e2c74f3d9b063Wink Saville
12044ff718f62ccaffb3ea7fbeb6c2e2c74f3d9b063Wink Saville    public int getWaitingApnsPermFailCount() {
1217a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        return mWaitingApnsPermanentFailureCountDown.get();
12244ff718f62ccaffb3ea7fbeb6c2e2c74f3d9b063Wink Saville    }
12344ff718f62ccaffb3ea7fbeb6c2e2c74f3d9b063Wink Saville
12444ff718f62ccaffb3ea7fbeb6c2e2c74f3d9b063Wink Saville    public void decWaitingApnsPermFailCount() {
1257a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        mWaitingApnsPermanentFailureCountDown.decrementAndGet();
1269d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1279d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1287a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized ApnSetting getNextWaitingApn() {
1299d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        ArrayList<ApnSetting> list = mWaitingApns;
1309d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        ApnSetting apn = null;
1319d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1329d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        if (list != null) {
1339d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville            if (!list.isEmpty()) {
1349d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville                apn = list.get(0);
1359d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville            }
1369d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        }
1379d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return apn;
1389d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1399d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
14026ee989576ffeffa787f240a4ef6962b87644b40Robert Greenwalt    public synchronized void removeWaitingApn(ApnSetting apn) {
14126ee989576ffeffa787f240a4ef6962b87644b40Robert Greenwalt        if (mWaitingApns != null) {
14226ee989576ffeffa787f240a4ef6962b87644b40Robert Greenwalt            mWaitingApns.remove(apn);
1439d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        }
1449d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1459d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1467a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized ArrayList<ApnSetting> getWaitingApns() {
1479d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mWaitingApns;
1489d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1499d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1507a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized void setState(DataConnectionTracker.State s) {
1517a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        if (DBG) {
152f19540a2d7958f60f88428f964733e50d462c65bWink Saville            log("setState: " + s + ", previous state:" + mState);
1537a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        }
1549d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1559d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        mState = s;
1569d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1579d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        if (mState == DataConnectionTracker.State.FAILED) {
1587a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt            if (mWaitingApns != null) {
1599d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville                mWaitingApns.clear(); // when teardown the connection and set to IDLE
1607a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt            }
1619d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        }
1629d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1639d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1647a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized DataConnectionTracker.State getState() {
1659d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mState;
1669d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1679d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
168ea0d54b44e6e2a1319097fa8002ff841e603e652Wink Saville    public boolean isDisconnected() {
169ea0d54b44e6e2a1319097fa8002ff841e603e652Wink Saville        DataConnectionTracker.State currentState = getState();
170ea0d54b44e6e2a1319097fa8002ff841e603e652Wink Saville        return ((currentState == DataConnectionTracker.State.IDLE) ||
171ea0d54b44e6e2a1319097fa8002ff841e603e652Wink Saville                    currentState == DataConnectionTracker.State.FAILED);
172ea0d54b44e6e2a1319097fa8002ff841e603e652Wink Saville    }
173ea0d54b44e6e2a1319097fa8002ff841e603e652Wink Saville
1747a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized void setReason(String reason) {
1757a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        if (DBG) {
176f19540a2d7958f60f88428f964733e50d462c65bWink Saville            log("set reason as " + reason + ",current state " + mState);
1777a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        }
1789d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        mReason = reason;
1799d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1809d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
1817a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt    public synchronized String getReason() {
1829d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mReason;
1839d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
1849d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
185d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    public boolean isReady() {
1867a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        return mDataEnabled.get() && mDependencyMet.get();
187d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    }
188d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt
189d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    public void setEnabled(boolean enabled) {
190d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt        if (DBG) {
191f19540a2d7958f60f88428f964733e50d462c65bWink Saville            log("set enabled as " + enabled + ", current state is " + mDataEnabled.get());
192d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt        }
1937a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        mDataEnabled.set(enabled);
194d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    }
195d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt
196d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    public boolean isEnabled() {
1977a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        return mDataEnabled.get();
198d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    }
199d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt
200d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    public void setDependencyMet(boolean met) {
201d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt        if (DBG) {
202f19540a2d7958f60f88428f964733e50d462c65bWink Saville            log("set mDependencyMet as " + met + " current state is " + mDependencyMet.get());
203d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt        }
2047a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt        mDependencyMet.set(met);
205d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    }
206d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt
207d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    public boolean getDependencyMet() {
2087a093b2c35d020fa46d2d2e20ddc6b3ff2c2bc30Robert Greenwalt       return mDependencyMet.get();
209d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    }
210d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt
2110b80114a2d80c359a1b462c388247995ef653c00Wink Saville    @Override
2120b80114a2d80c359a1b462c388247995ef653c00Wink Saville    public String toString() {
213f19540a2d7958f60f88428f964733e50d462c65bWink Saville        // We don't print mDataConnection because its recursive.
214f19540a2d7958f60f88428f964733e50d462c65bWink Saville        return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns=" + mWaitingApns +
215f19540a2d7958f60f88428f964733e50d462c65bWink Saville                " mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown +
216f19540a2d7958f60f88428f964733e50d462c65bWink Saville                " mApnSetting=" + mApnSetting + " mDataConnectionAc=" + mDataConnectionAc +
217f19540a2d7958f60f88428f964733e50d462c65bWink Saville                " mReason=" + mReason + " mDataEnabled=" + mDataEnabled +
218f19540a2d7958f60f88428f964733e50d462c65bWink Saville                " mDependencyMet=" + mDependencyMet + "}";
2190b80114a2d80c359a1b462c388247995ef653c00Wink Saville    }
2200b80114a2d80c359a1b462c388247995ef653c00Wink Saville
2219d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    protected void log(String s) {
222f19540a2d7958f60f88428f964733e50d462c65bWink Saville        Log.d(LOG_TAG, "[ApnContext:" + mApnType + "] " + s);
2239d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
22430ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville
22530ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
226f19540a2d7958f60f88428f964733e50d462c65bWink Saville        pw.println("ApnContext: " + this.toString());
22730ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    }
2289d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville}
229