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