1ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville/* 2ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Copyright (C) 2013 The Android Open Source Project 3ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 4ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * you may not use this file except in compliance with the License. 6ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * You may obtain a copy of the License at 7ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 8ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 10ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Unless required by applicable law or agreed to in writing, software 11ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * See the License for the specific language governing permissions and 14ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * limitations under the License. 15ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 16ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 17ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepackage com.android.internal.telephony.dataconnection; 18ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 19ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.LinkAddress; 20ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.NetworkUtils; 21ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.LinkProperties.CompareResult; 22ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.AsyncResult; 232cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Savilleimport android.os.Build; 24ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.Handler; 25ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.Message; 268758315661d65c14d0e10d354a14f80ec1f65db7Wink Savilleimport android.os.SystemClock; 278758315661d65c14d0e10d354a14f80ec1f65db7Wink Savilleimport android.telephony.DataConnectionRealTimeInfo; 28ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.Rlog; 298758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville 30b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singhimport com.android.internal.telephony.DctConstants; 31ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.PhoneBase; 32ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.PhoneConstants; 33ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.dataconnection.DataConnection.UpdateLinkPropertyResult; 34ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.State; 35ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.StateMachine; 36ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 37ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.io.FileDescriptor; 38ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.io.PrintWriter; 39ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.ArrayList; 40ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.HashMap; 41ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 42ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville/** 43ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Data Connection Controller which is a package visible class and controls 44ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * multiple data connections. For instance listening for unsolicited messages 45ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * and then demultiplexing them to the appropriate DC. 46ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 47ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleclass DcController extends StateMachine { 48ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean DBG = true; 49ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean VDBG = false; 50ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 51ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private PhoneBase mPhone; 52454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcTrackerBase mDct; 53ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcTesterDeactivateAll mDcTesterDeactivateAll; 54ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 55ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // package as its used by Testing code 56ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ArrayList<DataConnection> mDcListAll = new ArrayList<DataConnection>(); 57ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private HashMap<Integer, DataConnection> mDcListActiveByCid = 58ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new HashMap<Integer, DataConnection>(); 59ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 60ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 61ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Constants for the data connection activity: 62ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * physical link down/up 63ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 64ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * TODO: Move to RILConstants.java 65ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 66ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int DATA_CONNECTION_ACTIVE_PH_LINK_INACTIVE = 0; 67ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT = 1; 68ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int DATA_CONNECTION_ACTIVE_PH_LINK_UP = 2; 698758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville static final int DATA_CONNECTION_ACTIVE_UNKNOWN = Integer.MAX_VALUE; 708758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville 718758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville // One of the DATA_CONNECTION_ACTIVE_XXX values 728758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville int mOverallDataConnectionActiveState = DATA_CONNECTION_ACTIVE_UNKNOWN; 73ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 74ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DccDefaultState mDccDefaultState = new DccDefaultState(); 75ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 76ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 77ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Constructor. 78ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 79ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param name to be used for the Controller 80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param phone the phone associated with Dcc and Dct 81ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dct the DataConnectionTracker associated with Dcc 82ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param handler defines the thread/looper to be used with Dcc 83ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 84454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcController(String name, PhoneBase phone, DcTrackerBase dct, 85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Handler handler) { 86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super(name, handler); 87ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogRecSize(300); 88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("E ctor"); 89ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = phone; 90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = dct; 91ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDccDefaultState); 92ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setInitialState(mDccDefaultState); 93ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("X ctor"); 94ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 95ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 96454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville static DcController makeDcc(PhoneBase phone, DcTrackerBase dct, Handler handler) { 97ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc = new DcController("Dcc", phone, dct, handler); 98ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dcc.start(); 99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dcc; 100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void dispose() { 103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("dispose: call quiteNow()"); 104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quitNow(); 105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void addDc(DataConnection dc) { 108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcListAll.add(dc); 109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void removeDc(DataConnection dc) { 112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcListActiveByCid.remove(dc.mCid); 113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcListAll.remove(dc); 114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void addActiveDcByCid(DataConnection dc) { 117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG && dc.mCid < 0) { 118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("addActiveDcByCid dc.mCid < 0 dc=" + dc); 119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcListActiveByCid.put(dc.mCid, dc); 121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void removeActiveDcByCid(DataConnection dc) { 124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection removedDc = mDcListActiveByCid.remove(dc.mCid); 125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG && removedDc == null) { 126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("removeActiveDcByCid removedDc=null dc=" + dc); 127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DccDefaultState extends State { 131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.registerForRilConnected(getHandler(), 134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection.EVENT_RIL_CONNECTED, null); 135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.registerForDataNetworkStateChanged(getHandler(), 136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection.EVENT_DATA_STATE_CHANGED, null); 1372cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Saville if (Build.IS_DEBUGGABLE) { 138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterDeactivateAll = 139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcTesterDeactivateAll(mPhone, DcController.this, getHandler()); 140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mPhone != null) { 146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.unregisterForRilConnected(getHandler()); 147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.unregisterForDataNetworkStateChanged(getHandler()); 148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDcTesterDeactivateAll != null) { 150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterDeactivateAll.dispose(); 151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case DataConnection.EVENT_RIL_CONNECTED: 160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult)msg.obj; 161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DccDefaultState: msg.what=EVENT_RIL_CONNECTED mRilVersion=" + 164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar.result); 165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DccDefaultState: Unexpected exception on EVENT_RIL_CONNECTED"); 168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case DataConnection.EVENT_DATA_STATE_CHANGED: 172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult)msg.obj; 173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville onDataStateChanged((ArrayList<DataCallResponse>)ar.result); 175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DccDefaultState: EVENT_DATA_STATE_CHANGED:" + 177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " exception; likely radio not available, ignore"); 178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return HANDLED; 182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Process the new list of "known" Data Calls 186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dcsList as sent by RIL_UNSOL_DATA_CALL_LIST_CHANGED 187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void onDataStateChanged(ArrayList<DataCallResponse> dcsList) { 189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville lr("onDataStateChanged: dcsList=" + dcsList 191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mDcListActiveByCid=" + mDcListActiveByCid); 192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onDataStateChanged: mDcListAll=" + mDcListAll); 195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Create hashmap of cid to DataCallResponse 198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville HashMap<Integer, DataCallResponse> dataCallResponseListByCid = 199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new HashMap<Integer, DataCallResponse>(); 200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (DataCallResponse dcs : dcsList) { 201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dataCallResponseListByCid.put(dcs.cid, dcs); 202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add a DC that is active but not in the 205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // dcsList to the list of DC's to retry 206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ArrayList<DataConnection> dcsToRetry = new ArrayList<DataConnection>(); 207ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (DataConnection dc : mDcListActiveByCid.values()) { 208ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dataCallResponseListByCid.get(dc.mCid) == null) { 209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onDataStateChanged: add to retry dc=" + dc); 210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dcsToRetry.add(dc); 211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 213ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onDataStateChanged: dcsToRetry=" + dcsToRetry); 214ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 215ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Find which connections have changed state and send a notification or cleanup 216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // and any that are in active need to be retried. 217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ArrayList<ApnContext> apnsToCleanup = new ArrayList<ApnContext>(); 218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 219b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh boolean isAnyDataCallDormant = false; 220b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh boolean isAnyDataCallActive = false; 221b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh 222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (DataCallResponse newState : dcsList) { 223b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh 224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection dc = mDcListActiveByCid.get(newState.cid); 225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dc == null) { 226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // UNSOL_DATA_CALL_LIST_CHANGED arrived before SETUP_DATA_CALL completed. 227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("onDataStateChanged: no associated DC yet, ignore"); 228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville continue; 229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dc.mApnContexts.size() == 0) { 232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) loge("onDataStateChanged: no connected apns, ignore"); 233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Determine if the connection/apnContext should be cleaned up 235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // or just a notification should be sent out. 236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onDataStateChanged: Found ConnId=" + newState.cid 237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " newState=" + newState.toString()); 238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_INACTIVE) { 239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mDct.mIsCleanupRequired) { 240979786625e7ceacf4a545a25704ef8a15338a854Wink Saville apnsToCleanup.addAll(dc.mApnContexts); 241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDct.mIsCleanupRequired = false; 242979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else { 243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville DcFailCause failCause = DcFailCause.fromInt(newState.status); 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) log("onDataStateChanged: inactive failCause=" + failCause); 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (failCause.isRestartRadioFail()) { 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) log("onDataStateChanged: X restart radio"); 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDct.sendRestartRadio(); 248796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan } else if (mDct.isPermanentFail(failCause)) { 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) log("onDataStateChanged: inactive, add to cleanup list"); 250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville apnsToCleanup.addAll(dc.mApnContexts); 251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) log("onDataStateChanged: inactive, add to retry list"); 253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville dcsToRetry.add(dc); 254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 255979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } 256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Its active so update the DataConnections link properties 258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult result = dc.updateLinkProperty(newState); 259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result.oldLp.equals(result.newLp)) { 260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onDataStateChanged: no change"); 261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result.oldLp.isIdenticalInterfaceName(result.newLp)) { 263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (! result.oldLp.isIdenticalDnses(result.newLp) || 264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ! result.oldLp.isIdenticalRoutes(result.newLp) || 265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ! result.oldLp.isIdenticalHttpProxy(result.newLp) || 266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ! result.oldLp.isIdenticalAddresses(result.newLp)) { 267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the same address type was removed and 268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // added we need to cleanup 269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville CompareResult<LinkAddress> car = 270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.oldLp.compareAddresses(result.newLp); 271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onDataStateChanged: oldLp=" + result.oldLp + 273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " newLp=" + result.newLp + " car=" + car); 274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean needToClean = false; 276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (LinkAddress added : car.added) { 277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (LinkAddress removed : car.removed) { 278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (NetworkUtils.addressTypeMatches( 279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville removed.getAddress(), 280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville added.getAddress())) { 281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville needToClean = true; 282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (needToClean) { 287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onDataStateChanged: addr change," + 289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " cleanup apns=" + dc.mApnContexts + 290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " oldLp=" + result.oldLp + 291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " newLp=" + result.newLp); 292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnsToCleanup.addAll(dc.mApnContexts); 294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onDataStateChanged: simple change"); 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (ApnContext apnContext : dc.mApnContexts) { 298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.notifyDataConnection( 299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PhoneConstants.REASON_LINK_PROPERTIES_CHANGED, 300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.getApnType()); 301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onDataStateChanged: no changes"); 306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnsToCleanup.addAll(dc.mApnContexts); 310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onDataStateChanged: interface change, cleanup apns=" 312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + dc.mApnContexts); 313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 318b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh 319b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_UP) { 320b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh isAnyDataCallActive = true; 321b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh } 322b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT) { 323b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh isAnyDataCallDormant = true; 324b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh } 325b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh } 326b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh 3278758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville int newOverallDataConnectionActiveState = mOverallDataConnectionActiveState; 3288758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville 329b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh if (isAnyDataCallDormant && !isAnyDataCallActive) { 330b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh // There is no way to indicate link activity per APN right now. So 331b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh // Link Activity will be considered dormant only when all data calls 332b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh // are dormant. 333b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh // If a single data call is in dormant state and none of the data 334b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh // calls are active broadcast overall link state as dormant. 335b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh if (DBG) { 336b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh log("onDataStateChanged: Data Activity updated to DORMANT. stopNetStatePoll"); 337b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh } 338b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh mDct.sendStopNetStatPoll(DctConstants.Activity.DORMANT); 3398758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville newOverallDataConnectionActiveState = DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT; 340b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh } else { 341b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh if (DBG) { 342b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh log("onDataStateChanged: Data Activity updated to NONE. " + 343b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh "isAnyDataCallActive = " + isAnyDataCallActive + 344b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh " isAnyDataCallDormant = " + isAnyDataCallDormant); 345b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh } 346b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh if (isAnyDataCallActive) { 3478758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville newOverallDataConnectionActiveState = DATA_CONNECTION_ACTIVE_PH_LINK_UP; 348b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh mDct.sendStartNetStatPoll(DctConstants.Activity.NONE); 3498758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville } else { 3508758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville newOverallDataConnectionActiveState = DATA_CONNECTION_ACTIVE_PH_LINK_INACTIVE; 3518758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville } 3528758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville } 3538758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville 3548758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville // Temporary notification until RIL implementation is complete. 3558758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville if (mOverallDataConnectionActiveState != newOverallDataConnectionActiveState) { 3568758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville mOverallDataConnectionActiveState = newOverallDataConnectionActiveState; 3578758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville long time = SystemClock.elapsedRealtimeNanos(); 3588758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville int dcPowerState; 3598758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville switch (mOverallDataConnectionActiveState) { 3608758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville case DATA_CONNECTION_ACTIVE_PH_LINK_INACTIVE: 3618758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville case DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT: 3628758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville dcPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW; 3638758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville break; 3648758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville case DATA_CONNECTION_ACTIVE_PH_LINK_UP: 3658758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville dcPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH; 3668758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville break; 3678758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville default: 3688758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville dcPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_UNKNOWN; 3698758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville break; 370b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh } 3718758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville DataConnectionRealTimeInfo dcRtInfo = 3728758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville new DataConnectionRealTimeInfo(time , dcPowerState); 3738758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville log("onDataStateChanged: notify DcRtInfo changed dcRtInfo=" + dcRtInfo); 3748758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville mPhone.notifyDataConnectionRealTimeInfo(dcRtInfo); 375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 376ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville lr("onDataStateChanged: dcsToRetry=" + dcsToRetry 379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " apnsToCleanup=" + apnsToCleanup); 380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Cleanup connections that have changed 383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (ApnContext apnContext : apnsToCleanup) { 384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct.sendCleanUpConnection(true, apnContext); 385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 387ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Retry connections that have disappeared 388ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (DataConnection dc : dcsToRetry) { 389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onDataStateChanged: send EVENT_LOST_CONNECTION dc.mTag=" + dc.mTag); 390ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dc.sendMessage(DataConnection.EVENT_LOST_CONNECTION, dc.mTag); 391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onDataStateChanged: X"); 394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * lr is short name for logAndAddLogRec 399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s 400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void lr(String s) { 402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void log(String s) { 407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String info = null; 421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville info = DataConnection.cmdToString(what); 422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (info == null) { 423454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville info = DcAsyncChannel.cmdToString(what); 424ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return info; 426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "mDcListAll=" + mDcListAll + " mDcListActiveByCid=" + mDcListActiveByCid; 431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super.dump(fd, pw, args); 436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcListAll=" + mDcListAll); 438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcListActiveByCid=" + mDcListActiveByCid); 439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 440b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh} 441