Loading proto/src/telephony.proto +11 −0 Original line number Diff line number Diff line Loading @@ -795,6 +795,9 @@ message TelephonyEvent { // Emergency Number update event (Device HAL >= 1.4). EMERGENCY_NUMBER_REPORT = 21; // Network capabilities change event. NETWORK_CAPABILITIES_CHANGED = 22; } enum ApnType { Loading Loading @@ -1697,6 +1700,11 @@ message TelephonyEvent { optional string preferApn = 12; } message NetworkCapabilitiesInfo { // Is network unmetered optional bool is_network_unmetered = 1; } // Time when event happened on device, in milliseconds since epoch optional int64 timestamp_millis = 1; Loading Loading @@ -1769,6 +1777,9 @@ message TelephonyEvent { // Updated Emergency Call info. optional EmergencyNumberInfo updated_emergency_number = 25; // NetworkCapabilities changed info. optional NetworkCapabilitiesInfo network_capabilities = 26; } message ActiveSubscriptionInfo { Loading src/java/com/android/internal/telephony/dataconnection/DcNetworkAgent.java +9 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.util.SparseArray; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.Phone; import com.android.internal.telephony.RILConstants; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.util.IndentingPrintWriter; import java.io.FileDescriptor; Loading Loading @@ -216,6 +217,14 @@ public class DcNetworkAgent extends NetworkAgent { + ", dc=" + mDataConnection.getName(); logd(logStr); mNetCapsLocalLog.log(logStr); if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { // only log metrics for DataConnection with NET_CAPABILITY_INTERNET if (mNetworkCapabilities == null || networkCapabilities.isMetered() != mNetworkCapabilities.isMetered()) { TelephonyMetrics.getInstance().writeNetworkCapabilitiesChangedEvent( mPhone.getPhoneId(), networkCapabilities); } } mNetworkCapabilities = networkCapabilities; } sendNetworkCapabilities(networkCapabilities); Loading src/java/com/android/internal/telephony/metrics/TelephonyEventBuilder.java +9 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.CarrierIdMatching; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.CarrierKeyChange; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.ModemRestart; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.NetworkCapabilitiesInfo; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilDeactivateDataCall; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilSetupDataCall; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilSetupDataCallResponse; Loading Loading @@ -209,4 +210,12 @@ public class TelephonyEventBuilder { mEvent.onDemandDataSwitch = onDemandDataSwitch; return this; } /** Set and build network capabilities changed event. */ public TelephonyEventBuilder setNetworkCapabilities( NetworkCapabilitiesInfo networkCapabilities) { mEvent.type = TelephonyEvent.Type.NETWORK_CAPABILITIES_CHANGED; mEvent.networkCapabilities = networkCapabilities; return this; } } src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java +35 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import static com.android.internal.telephony.nano.TelephonyProto.PdpType.PDP_TYP import static com.android.internal.telephony.nano.TelephonyProto.PdpType.PDP_TYPE_UNSTRUCTURED; import static com.android.internal.telephony.nano.TelephonyProto.PdpType.PDP_UNKNOWN; import android.net.NetworkCapabilities; import android.os.Build; import android.os.SystemClock; import android.os.SystemProperties; Loading Loading @@ -93,6 +94,7 @@ import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.Carrier import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.CarrierKeyChange; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.DataSwitch; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.ModemRestart; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.NetworkCapabilitiesInfo; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.OnDemandDataSwitch; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilDeactivateDataCall; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilDeactivateDataCall.DeactivateReason; Loading Loading @@ -206,6 +208,12 @@ public class TelephonyMetrics { */ private final SparseArray<CarrierIdMatching> mLastCarrierId = new SparseArray<>(); /** * Last NetworkCapabilitiesInfo, indexed by phone id. */ private final SparseArray<NetworkCapabilitiesInfo> mLastNetworkCapabilitiesInfos = new SparseArray<>(); /** * Last RilDataCall Events (indexed by cid), indexed by phone id */ Loading Loading @@ -314,6 +322,8 @@ public class TelephonyMetrics { return "NITZ_TIME"; case TelephonyEvent.Type.EMERGENCY_NUMBER_REPORT: return "EMERGENCY_NUMBER_REPORT"; case TelephonyEvent.Type.NETWORK_CAPABILITIES_CHANGED: return "NETWORK_CAPABILITIES_CHANGED"; default: return Integer.toString(event); } Loading Loading @@ -652,6 +662,13 @@ public class TelephonyMetrics { addTelephonyEvent(event); } for (int i = 0; i < mLastNetworkCapabilitiesInfos.size(); i++) { final int key = mLastNetworkCapabilitiesInfos.keyAt(i); TelephonyEvent event = new TelephonyEventBuilder(mStartElapsedTimeMs, key) .setNetworkCapabilities(mLastNetworkCapabilitiesInfos.get(key)).build(); 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++) { Loading Loading @@ -2515,6 +2532,24 @@ public class TelephonyMetrics { addTelephonyEvent(event); } /** * Write network capabilities changed event * * @param phoneId Phone id * @param networkCapabilities Network capabilities */ public void writeNetworkCapabilitiesChangedEvent(int phoneId, NetworkCapabilities networkCapabilities) { final NetworkCapabilitiesInfo caps = new NetworkCapabilitiesInfo(); caps.isNetworkUnmetered = networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_METERED); TelephonyEvent event = new TelephonyEventBuilder(phoneId) .setNetworkCapabilities(caps).build(); mLastNetworkCapabilitiesInfos.put(phoneId, caps); addTelephonyEvent(event); } /** * Convert SMS format */ Loading tests/telephonytests/src/com/android/internal/telephony/metrics/TelephonyMetricsTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import android.net.LinkAddress; import android.net.NetworkCapabilities; import android.net.NetworkUtils; import android.telephony.ServiceState; import android.telephony.TelephonyManager; Loading Loading @@ -306,6 +307,32 @@ public class TelephonyMetricsTest extends TelephonyTest { log.events[0].updatedEmergencyNumber.routing); } // Test write Network Capabilities changed event @Test @SmallTest public void testWriteNetworkCapabilitiesChangedEvent() throws Exception { NetworkCapabilities caps = new NetworkCapabilities(); caps.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); mMetrics.writeNetworkCapabilitiesChangedEvent(mPhone.getPhoneId(), caps); caps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); mMetrics.writeNetworkCapabilitiesChangedEvent(mPhone.getPhoneId(), caps); TelephonyLog log = buildProto(); assertEquals(2, log.events.length); assertEquals(0, log.callSessions.length); assertEquals(0, log.smsSessions.length); assertEquals(mPhone.getPhoneId(), log.events[0].phoneId); assertEquals(TelephonyEvent.Type.NETWORK_CAPABILITIES_CHANGED, log.events[0].type); assertTrue(log.events[0].networkCapabilities.isNetworkUnmetered); assertEquals(mPhone.getPhoneId(), log.events[1].phoneId); assertEquals(TelephonyEvent.Type.NETWORK_CAPABILITIES_CHANGED, log.events[1].type); assertFalse(log.events[1].networkCapabilities.isNetworkUnmetered); } // Test write on IMS call start @Test @SmallTest Loading Loading
proto/src/telephony.proto +11 −0 Original line number Diff line number Diff line Loading @@ -795,6 +795,9 @@ message TelephonyEvent { // Emergency Number update event (Device HAL >= 1.4). EMERGENCY_NUMBER_REPORT = 21; // Network capabilities change event. NETWORK_CAPABILITIES_CHANGED = 22; } enum ApnType { Loading Loading @@ -1697,6 +1700,11 @@ message TelephonyEvent { optional string preferApn = 12; } message NetworkCapabilitiesInfo { // Is network unmetered optional bool is_network_unmetered = 1; } // Time when event happened on device, in milliseconds since epoch optional int64 timestamp_millis = 1; Loading Loading @@ -1769,6 +1777,9 @@ message TelephonyEvent { // Updated Emergency Call info. optional EmergencyNumberInfo updated_emergency_number = 25; // NetworkCapabilities changed info. optional NetworkCapabilitiesInfo network_capabilities = 26; } message ActiveSubscriptionInfo { Loading
src/java/com/android/internal/telephony/dataconnection/DcNetworkAgent.java +9 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.util.SparseArray; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.Phone; import com.android.internal.telephony.RILConstants; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.util.IndentingPrintWriter; import java.io.FileDescriptor; Loading Loading @@ -216,6 +217,14 @@ public class DcNetworkAgent extends NetworkAgent { + ", dc=" + mDataConnection.getName(); logd(logStr); mNetCapsLocalLog.log(logStr); if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { // only log metrics for DataConnection with NET_CAPABILITY_INTERNET if (mNetworkCapabilities == null || networkCapabilities.isMetered() != mNetworkCapabilities.isMetered()) { TelephonyMetrics.getInstance().writeNetworkCapabilitiesChangedEvent( mPhone.getPhoneId(), networkCapabilities); } } mNetworkCapabilities = networkCapabilities; } sendNetworkCapabilities(networkCapabilities); Loading
src/java/com/android/internal/telephony/metrics/TelephonyEventBuilder.java +9 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.CarrierIdMatching; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.CarrierKeyChange; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.ModemRestart; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.NetworkCapabilitiesInfo; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilDeactivateDataCall; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilSetupDataCall; import static com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilSetupDataCallResponse; Loading Loading @@ -209,4 +210,12 @@ public class TelephonyEventBuilder { mEvent.onDemandDataSwitch = onDemandDataSwitch; return this; } /** Set and build network capabilities changed event. */ public TelephonyEventBuilder setNetworkCapabilities( NetworkCapabilitiesInfo networkCapabilities) { mEvent.type = TelephonyEvent.Type.NETWORK_CAPABILITIES_CHANGED; mEvent.networkCapabilities = networkCapabilities; return this; } }
src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java +35 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import static com.android.internal.telephony.nano.TelephonyProto.PdpType.PDP_TYP import static com.android.internal.telephony.nano.TelephonyProto.PdpType.PDP_TYPE_UNSTRUCTURED; import static com.android.internal.telephony.nano.TelephonyProto.PdpType.PDP_UNKNOWN; import android.net.NetworkCapabilities; import android.os.Build; import android.os.SystemClock; import android.os.SystemProperties; Loading Loading @@ -93,6 +94,7 @@ import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.Carrier import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.CarrierKeyChange; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.DataSwitch; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.ModemRestart; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.NetworkCapabilitiesInfo; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.OnDemandDataSwitch; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilDeactivateDataCall; import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilDeactivateDataCall.DeactivateReason; Loading Loading @@ -206,6 +208,12 @@ public class TelephonyMetrics { */ private final SparseArray<CarrierIdMatching> mLastCarrierId = new SparseArray<>(); /** * Last NetworkCapabilitiesInfo, indexed by phone id. */ private final SparseArray<NetworkCapabilitiesInfo> mLastNetworkCapabilitiesInfos = new SparseArray<>(); /** * Last RilDataCall Events (indexed by cid), indexed by phone id */ Loading Loading @@ -314,6 +322,8 @@ public class TelephonyMetrics { return "NITZ_TIME"; case TelephonyEvent.Type.EMERGENCY_NUMBER_REPORT: return "EMERGENCY_NUMBER_REPORT"; case TelephonyEvent.Type.NETWORK_CAPABILITIES_CHANGED: return "NETWORK_CAPABILITIES_CHANGED"; default: return Integer.toString(event); } Loading Loading @@ -652,6 +662,13 @@ public class TelephonyMetrics { addTelephonyEvent(event); } for (int i = 0; i < mLastNetworkCapabilitiesInfos.size(); i++) { final int key = mLastNetworkCapabilitiesInfos.keyAt(i); TelephonyEvent event = new TelephonyEventBuilder(mStartElapsedTimeMs, key) .setNetworkCapabilities(mLastNetworkCapabilitiesInfos.get(key)).build(); 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++) { Loading Loading @@ -2515,6 +2532,24 @@ public class TelephonyMetrics { addTelephonyEvent(event); } /** * Write network capabilities changed event * * @param phoneId Phone id * @param networkCapabilities Network capabilities */ public void writeNetworkCapabilitiesChangedEvent(int phoneId, NetworkCapabilities networkCapabilities) { final NetworkCapabilitiesInfo caps = new NetworkCapabilitiesInfo(); caps.isNetworkUnmetered = networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_METERED); TelephonyEvent event = new TelephonyEventBuilder(phoneId) .setNetworkCapabilities(caps).build(); mLastNetworkCapabilitiesInfos.put(phoneId, caps); addTelephonyEvent(event); } /** * Convert SMS format */ Loading
tests/telephonytests/src/com/android/internal/telephony/metrics/TelephonyMetricsTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import android.net.LinkAddress; import android.net.NetworkCapabilities; import android.net.NetworkUtils; import android.telephony.ServiceState; import android.telephony.TelephonyManager; Loading Loading @@ -306,6 +307,32 @@ public class TelephonyMetricsTest extends TelephonyTest { log.events[0].updatedEmergencyNumber.routing); } // Test write Network Capabilities changed event @Test @SmallTest public void testWriteNetworkCapabilitiesChangedEvent() throws Exception { NetworkCapabilities caps = new NetworkCapabilities(); caps.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); mMetrics.writeNetworkCapabilitiesChangedEvent(mPhone.getPhoneId(), caps); caps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); mMetrics.writeNetworkCapabilitiesChangedEvent(mPhone.getPhoneId(), caps); TelephonyLog log = buildProto(); assertEquals(2, log.events.length); assertEquals(0, log.callSessions.length); assertEquals(0, log.smsSessions.length); assertEquals(mPhone.getPhoneId(), log.events[0].phoneId); assertEquals(TelephonyEvent.Type.NETWORK_CAPABILITIES_CHANGED, log.events[0].type); assertTrue(log.events[0].networkCapabilities.isNetworkUnmetered); assertEquals(mPhone.getPhoneId(), log.events[1].phoneId); assertEquals(TelephonyEvent.Type.NETWORK_CAPABILITIES_CHANGED, log.events[1].type); assertFalse(log.events[1].networkCapabilities.isNetworkUnmetered); } // Test write on IMS call start @Test @SmallTest Loading