diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 21e7203ffa886..53d967363765c 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -147,6 +147,7 @@ message Atom { PhoneStateChanged phone_state_changed = 95; UserRestrictionChanged user_restriction_changed = 96; SettingsUIChanged settings_ui_changed = 97; + ConnectivityStateChanged connectivity_state_changed = 98; } // Pulled events will start at field 10000. @@ -2129,6 +2130,22 @@ message Notification { optional int64 visible_millis = 16; } +/* + * Logs when a connection becomes available and lost. + * Logged in StatsCompanionService.java + */ +message ConnectivityStateChanged { + // Id of the network. + optional int32 net_id = 1; + + enum State { + UNKNOWN = 0; + CONNECTED = 1; + DISCONNECTED = 2; + } + // Connected state of a network. + optional State state = 2; +} ////////////////////////////////////////////////////////////////////// // Pulled atoms below this line // diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index cef484f07972a..01d02d61cc839 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -41,6 +41,9 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.hardware.fingerprint.FingerprintManager; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkRequest; import android.net.NetworkStats; import android.net.wifi.IWifiManager; import android.net.wifi.WifiActivityEnergyInfo; @@ -271,6 +274,12 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { Slog.e(TAG, "cannot find thermalservice, no throttling push notifications"); } + // Default NetworkRequest should cover all transport types. + final NetworkRequest request = new NetworkRequest.Builder().build(); + final ConnectivityManager connectivityManager = + (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + connectivityManager.registerNetworkCallback(request, new ConnectivityStatsCallback()); + HandlerThread handlerThread = new HandlerThread(TAG); handlerThread.start(); mHandler = new CompanionHandler(handlerThread.getLooper()); @@ -1875,4 +1884,19 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { temp.getValue()); } } + + private static final class ConnectivityStatsCallback extends + ConnectivityManager.NetworkCallback { + @Override + public void onAvailable(Network network) { + StatsLog.write(StatsLog.CONNECTIVITY_STATE_CHANGED, network.netId, + StatsLog.CONNECTIVITY_STATE_CHANGED__STATE__CONNECTED); + } + + @Override + public void onLost(Network network) { + StatsLog.write(StatsLog.CONNECTIVITY_STATE_CHANGED, network.netId, + StatsLog.CONNECTIVITY_STATE_CHANGED__STATE__DISCONNECTED); + } + } }