From e96782a56708623ef586a40678adcb018797b06b Mon Sep 17 00:00:00 2001 From: Aaron Huang Date: Tue, 2 Feb 2021 18:27:39 +0800 Subject: [PATCH] Use NetworkCallback in BatteryStatsService to get connectivity change Currently, battery stats service uses noteConnectivityChanged in connectivity service(CS) to pass connection state and the type of connection for BatteryStats. However, CS is going to be a mainline module which can only access formal API. noteConnectivityChanged is a hidden API and it pass LegacyNetworkType which has been deprecated years ago, so it should avoid to expose this API with a deprecated argument. Thus, register a NetworkCallback in BattyeryStatsService to listen the network capabilities changed to remove the noteConnectivityChanged from connectivity service. Besides, let noteConnectivityChanged take display transport instead of legacy network type. Bug: 171686421 Test: atest FrameworksNetTests atest FrameworksCoreTests:BatteryStatsTests (cherry-picked from ag/13749983) Change-Id: I3dac94ec06f673aa719e124f1ef3d8169f68f9fb Merged-In: I3dac94ec06f673aa719e124f1ef3d8169f68f9fb --- .../android/server/ConnectivityService.java | 7 ------ .../server/am/BatteryStatsService.java | 25 +++++++++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 84de6ec8e0ca2..e05a202ae6574 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2388,13 +2388,6 @@ public class ConnectivityService extends IConnectivityManager.Stub final BroadcastOptions opts = BroadcastOptions.makeBasic(); opts.setMaxManifestReceiverApiLevel(Build.VERSION_CODES.M); options = opts.toBundle(); - final IBatteryStats bs = mDeps.getBatteryStatsService(); - try { - bs.noteConnectivityChanged(intent.getIntExtra( - ConnectivityManager.EXTRA_NETWORK_TYPE, ConnectivityManager.TYPE_NONE), - ni.getState().toString()); - } catch (RemoteException e) { - } intent.addFlags(Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS); } try { diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 9986085224b10..52b50a0f4c3ac 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -16,12 +16,17 @@ package com.android.server.am; +import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED; + +import android.annotation.NonNull; import android.bluetooth.BluetoothActivityEnergyInfo; import android.content.ContentResolver; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.net.ConnectivityManager; import android.net.INetworkManagementEventObserver; +import android.net.Network; import android.net.NetworkCapabilities; import android.os.BatteryStats; import android.os.BatteryStatsInternal; @@ -66,6 +71,7 @@ import com.android.internal.os.RpmStats; import com.android.internal.util.DumpUtils; import com.android.internal.util.FrameworkStatsLog; import com.android.internal.util.ParseUtils; +import com.android.net.module.util.NetworkCapabilitiesUtils; import com.android.server.LocalServices; import com.android.server.net.BaseNetworkObserver; @@ -214,6 +220,23 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } + private ConnectivityManager.NetworkCallback mNetworkCallback = + new ConnectivityManager.NetworkCallback() { + @Override + public void onCapabilitiesChanged(@NonNull Network network, + @NonNull NetworkCapabilities networkCapabilities) { + final String state = networkCapabilities.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + ? "CONNECTED" : "SUSPENDED"; + noteConnectivityChanged(NetworkCapabilitiesUtils.getDisplayTransport( + networkCapabilities.getTransportTypes()), state); + } + + @Override + public void onLost(Network network) { + noteConnectivityChanged(-1, "DISCONNECTED"); + } + }; + BatteryStatsService(Context context, File systemDir, Handler handler) { // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through. mContext = context; @@ -244,8 +267,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void systemServicesReady() { final INetworkManagementService nms = INetworkManagementService.Stub.asInterface( ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)); + final ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class); try { nms.registerObserver(mActivityChangeObserver); + cm.registerDefaultNetworkCallback(mNetworkCallback); } catch (RemoteException e) { Slog.e(TAG, "Could not register INetworkManagement event observer " + e); }