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