Loading proto/src/telephony.proto +18 −0 Original line number Original line Diff line number Diff line Loading @@ -619,6 +619,24 @@ message RilDataCall { // The network interface name e.g. wlan0, rmnet_data0. // The network interface name e.g. wlan0, rmnet_data0. optional string iframe = 3; optional string iframe = 3; // State of the Data Call connection optional State state = 4; // Bitmask of APN types optional int32 apn_type_bitmask = 5; enum State { // Unknown event UNKNOWN = 0; // Connected event CONNECTED = 1; // Disconnected event DISCONNECTED = 2; } } } message TelephonyEvent { message TelephonyEvent { Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,7 @@ import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.dataconnection.DcTracker.ReleaseNetworkType; import com.android.internal.telephony.dataconnection.DcTracker.ReleaseNetworkType; import com.android.internal.telephony.dataconnection.DcTracker.RequestNetworkType; import com.android.internal.telephony.dataconnection.DcTracker.RequestNetworkType; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.nano.TelephonyProto.RilDataCall; import com.android.internal.util.AsyncChannel; import com.android.internal.util.AsyncChannel; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Protocol; import com.android.internal.util.Protocol; Loading Loading @@ -1901,6 +1902,8 @@ public class DataConnection extends StateMachine { mPhone.mCi.registerForLceInfo( mPhone.mCi.registerForLceInfo( getHandler(), DataConnection.EVENT_LINK_CAPACITY_CHANGED, null); getHandler(), DataConnection.EVENT_LINK_CAPACITY_CHANGED, null); } } TelephonyMetrics.getInstance().writeRilDataCallEvent(mPhone.getPhoneId(), mCid, mApnSetting.getApnTypeBitmask(), RilDataCall.State.CONNECTED); } } @Override @Override Loading Loading @@ -1928,6 +1931,8 @@ public class DataConnection extends StateMachine { mNetworkAgent.sendNetworkInfo(mNetworkInfo); mNetworkAgent.sendNetworkInfo(mNetworkInfo); mNetworkAgent = null; mNetworkAgent = null; } } TelephonyMetrics.getInstance().writeRilDataCallEvent(mPhone.getPhoneId(), mCid, mApnSetting.getApnTypeBitmask(), RilDataCall.State.DISCONNECTED); } } @Override @Override Loading src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java +43 −16 Original line number Original line Diff line number Diff line Loading @@ -199,6 +199,12 @@ public class TelephonyMetrics { */ */ private final SparseArray<CarrierIdMatching> mLastCarrierId = new SparseArray<>(); private final SparseArray<CarrierIdMatching> mLastCarrierId = new SparseArray<>(); /** * Last RilDataCall Events (indexed by cid), indexed by phone id */ private final SparseArray<SparseArray<RilDataCall>> mLastRilDataCallEvents = new SparseArray<>(); /** The start system time of the TelephonyLog in milliseconds*/ /** The start system time of the TelephonyLog in milliseconds*/ private long mStartSystemTimeMs; private long mStartSystemTimeMs; Loading Loading @@ -607,6 +613,16 @@ public class TelephonyMetrics { addTelephonyEvent(event); addTelephonyEvent(event); } } for (int i = 0; i < mLastRilDataCallEvents.size(); i++) { final int key = mLastRilDataCallEvents.keyAt(i); for (int j = 0; j < mLastRilDataCallEvents.get(key).size(); j++) { final int cidKey = mLastRilDataCallEvents.get(key).keyAt(j); RilDataCall[] dataCalls = new RilDataCall[1]; dataCalls[0] = mLastRilDataCallEvents.get(key).get(cidKey); addTelephonyEvent(new TelephonyEventBuilder(mStartElapsedTimeMs, key) .setDataCalls(dataCalls).build()); } } addTelephonyEvent(new TelephonyEventBuilder(mStartElapsedTimeMs, -1 /* phoneId */) addTelephonyEvent(new TelephonyEventBuilder(mStartElapsedTimeMs, -1 /* phoneId */) .setSimStateChange(mLastSimState).build()); .setSimStateChange(mLastSimState).build()); Loading Loading @@ -1343,25 +1359,36 @@ public class TelephonyMetrics { } } /** /** * Write get data call list event * Write data call list event when connected * * @param phoneId Phone id * @param phoneId Phone id * @param dcsList Data call list * @param cid Context Id, uniquely identifies the call */ * @param apnTypeBitmask Bitmask of supported APN types public void writeRilDataCallList(int phoneId, ArrayList<DataCallResponse> dcsList) { * @param state State of the data call event */ RilDataCall[] dataCalls = new RilDataCall[dcsList.size()]; public void writeRilDataCallEvent(int phoneId, int cid, int apnTypeBitmask, int state) { for (int i = 0; i < dcsList.size(); i++) { RilDataCall[] dataCalls = new RilDataCall[1]; dataCalls[i] = new RilDataCall(); dataCalls[0] = new RilDataCall(); dataCalls[i].cid = dcsList.get(i).getCallId(); dataCalls[0].cid = cid; if (!TextUtils.isEmpty(dcsList.get(i).getIfname())) { dataCalls[0].apnTypeBitmask = apnTypeBitmask; dataCalls[i].iframe = dcsList.get(i).getIfname(); dataCalls[0].state = state; SparseArray<RilDataCall> dataCallList; if (mLastRilDataCallEvents.get(phoneId) != null) { // If the Data call event does not change, do not log it. if (mLastRilDataCallEvents.get(phoneId).get(cid) != null && Arrays.equals( RilDataCall.toByteArray(mLastRilDataCallEvents.get(phoneId).get(cid)), RilDataCall.toByteArray(dataCalls[0]))) { return; } } dataCallList = mLastRilDataCallEvents.get(phoneId); dataCalls[i].type = dcsList.get(i).getProtocolType() + 1; } else { dataCallList = new SparseArray<>(); } } dataCallList.put(cid, dataCalls[0]); mLastRilDataCallEvents.put(phoneId, dataCallList); addTelephonyEvent(new TelephonyEventBuilder(phoneId).setDataCalls(dataCalls).build()); addTelephonyEvent(new TelephonyEventBuilder(phoneId).setDataCalls(dataCalls).build()); } } Loading Loading
proto/src/telephony.proto +18 −0 Original line number Original line Diff line number Diff line Loading @@ -619,6 +619,24 @@ message RilDataCall { // The network interface name e.g. wlan0, rmnet_data0. // The network interface name e.g. wlan0, rmnet_data0. optional string iframe = 3; optional string iframe = 3; // State of the Data Call connection optional State state = 4; // Bitmask of APN types optional int32 apn_type_bitmask = 5; enum State { // Unknown event UNKNOWN = 0; // Connected event CONNECTED = 1; // Disconnected event DISCONNECTED = 2; } } } message TelephonyEvent { message TelephonyEvent { Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,7 @@ import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.dataconnection.DcTracker.ReleaseNetworkType; import com.android.internal.telephony.dataconnection.DcTracker.ReleaseNetworkType; import com.android.internal.telephony.dataconnection.DcTracker.RequestNetworkType; import com.android.internal.telephony.dataconnection.DcTracker.RequestNetworkType; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.nano.TelephonyProto.RilDataCall; import com.android.internal.util.AsyncChannel; import com.android.internal.util.AsyncChannel; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Protocol; import com.android.internal.util.Protocol; Loading Loading @@ -1901,6 +1902,8 @@ public class DataConnection extends StateMachine { mPhone.mCi.registerForLceInfo( mPhone.mCi.registerForLceInfo( getHandler(), DataConnection.EVENT_LINK_CAPACITY_CHANGED, null); getHandler(), DataConnection.EVENT_LINK_CAPACITY_CHANGED, null); } } TelephonyMetrics.getInstance().writeRilDataCallEvent(mPhone.getPhoneId(), mCid, mApnSetting.getApnTypeBitmask(), RilDataCall.State.CONNECTED); } } @Override @Override Loading Loading @@ -1928,6 +1931,8 @@ public class DataConnection extends StateMachine { mNetworkAgent.sendNetworkInfo(mNetworkInfo); mNetworkAgent.sendNetworkInfo(mNetworkInfo); mNetworkAgent = null; mNetworkAgent = null; } } TelephonyMetrics.getInstance().writeRilDataCallEvent(mPhone.getPhoneId(), mCid, mApnSetting.getApnTypeBitmask(), RilDataCall.State.DISCONNECTED); } } @Override @Override Loading
src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java +43 −16 Original line number Original line Diff line number Diff line Loading @@ -199,6 +199,12 @@ public class TelephonyMetrics { */ */ private final SparseArray<CarrierIdMatching> mLastCarrierId = new SparseArray<>(); private final SparseArray<CarrierIdMatching> mLastCarrierId = new SparseArray<>(); /** * Last RilDataCall Events (indexed by cid), indexed by phone id */ private final SparseArray<SparseArray<RilDataCall>> mLastRilDataCallEvents = new SparseArray<>(); /** The start system time of the TelephonyLog in milliseconds*/ /** The start system time of the TelephonyLog in milliseconds*/ private long mStartSystemTimeMs; private long mStartSystemTimeMs; Loading Loading @@ -607,6 +613,16 @@ public class TelephonyMetrics { addTelephonyEvent(event); addTelephonyEvent(event); } } for (int i = 0; i < mLastRilDataCallEvents.size(); i++) { final int key = mLastRilDataCallEvents.keyAt(i); for (int j = 0; j < mLastRilDataCallEvents.get(key).size(); j++) { final int cidKey = mLastRilDataCallEvents.get(key).keyAt(j); RilDataCall[] dataCalls = new RilDataCall[1]; dataCalls[0] = mLastRilDataCallEvents.get(key).get(cidKey); addTelephonyEvent(new TelephonyEventBuilder(mStartElapsedTimeMs, key) .setDataCalls(dataCalls).build()); } } addTelephonyEvent(new TelephonyEventBuilder(mStartElapsedTimeMs, -1 /* phoneId */) addTelephonyEvent(new TelephonyEventBuilder(mStartElapsedTimeMs, -1 /* phoneId */) .setSimStateChange(mLastSimState).build()); .setSimStateChange(mLastSimState).build()); Loading Loading @@ -1343,25 +1359,36 @@ public class TelephonyMetrics { } } /** /** * Write get data call list event * Write data call list event when connected * * @param phoneId Phone id * @param phoneId Phone id * @param dcsList Data call list * @param cid Context Id, uniquely identifies the call */ * @param apnTypeBitmask Bitmask of supported APN types public void writeRilDataCallList(int phoneId, ArrayList<DataCallResponse> dcsList) { * @param state State of the data call event */ RilDataCall[] dataCalls = new RilDataCall[dcsList.size()]; public void writeRilDataCallEvent(int phoneId, int cid, int apnTypeBitmask, int state) { for (int i = 0; i < dcsList.size(); i++) { RilDataCall[] dataCalls = new RilDataCall[1]; dataCalls[i] = new RilDataCall(); dataCalls[0] = new RilDataCall(); dataCalls[i].cid = dcsList.get(i).getCallId(); dataCalls[0].cid = cid; if (!TextUtils.isEmpty(dcsList.get(i).getIfname())) { dataCalls[0].apnTypeBitmask = apnTypeBitmask; dataCalls[i].iframe = dcsList.get(i).getIfname(); dataCalls[0].state = state; SparseArray<RilDataCall> dataCallList; if (mLastRilDataCallEvents.get(phoneId) != null) { // If the Data call event does not change, do not log it. if (mLastRilDataCallEvents.get(phoneId).get(cid) != null && Arrays.equals( RilDataCall.toByteArray(mLastRilDataCallEvents.get(phoneId).get(cid)), RilDataCall.toByteArray(dataCalls[0]))) { return; } } dataCallList = mLastRilDataCallEvents.get(phoneId); dataCalls[i].type = dcsList.get(i).getProtocolType() + 1; } else { dataCallList = new SparseArray<>(); } } dataCallList.put(cid, dataCalls[0]); mLastRilDataCallEvents.put(phoneId, dataCallList); addTelephonyEvent(new TelephonyEventBuilder(phoneId).setDataCalls(dataCalls).build()); addTelephonyEvent(new TelephonyEventBuilder(phoneId).setDataCalls(dataCalls).build()); } } Loading