From 4004535bbdf53dd6909f99d85a78de25d2239017 Mon Sep 17 00:00:00 2001 From: David Su Date: Fri, 29 Nov 2019 00:24:33 -0800 Subject: [PATCH] Statsd: Formalize WifiManager#requestActivityInfo Rename WifiManager#requestActivityInfo to getWifiActivityEnergyInfoAsync and convert ResultReceiver to a formal listener interface. Bug: 145244073 Test: m -j statsd_test && adb root && adb sync data && adb shell data/nativetest64/statsd_test/statsd_test Test: atest CtsStatsdHostTestCases Change-Id: I3e5b6f18f18b487683863934c3d0cba7be07a778 --- .../server/stats/StatsCompanionService.java | 66 +++++++++++-------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index f11d4f8782d0d..8420631bf9d6e 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -64,8 +64,8 @@ import android.net.INetworkStatsService; import android.net.Network; import android.net.NetworkRequest; import android.net.NetworkStats; -import android.net.wifi.IWifiManager; import android.net.wifi.WifiActivityEnergyInfo; +import android.net.wifi.WifiManager; import android.os.BatteryStats; import android.os.BatteryStatsInternal; import android.os.Binder; @@ -170,6 +170,7 @@ import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -342,7 +343,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private final KernelWakelockReader mKernelWakelockReader = new KernelWakelockReader(); private final KernelWakelockStats mTmpWakelockStats = new KernelWakelockStats(); - private IWifiManager mWifiManager = null; + private WifiManager mWifiManager = null; private TelephonyManager mTelephony = null; @GuardedBy("sStatsdLock") private final HashSet mDeathTimeMillis = new HashSet<>(); @@ -1148,35 +1149,48 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private void pullWifiActivityInfo( int tagId, long elapsedNanos, long wallClockNanos, List pulledData) { - long token = Binder.clearCallingIdentity(); + WifiManager wifiManager; synchronized (this) { if (mWifiManager == null) { - mWifiManager = - IWifiManager.Stub.asInterface( - ServiceManager.getService(Context.WIFI_SERVICE)); + mWifiManager = mContext.getSystemService(WifiManager.class); } + wifiManager = mWifiManager; } - if (mWifiManager != null) { - try { - SynchronousResultReceiver wifiReceiver = new SynchronousResultReceiver("wifi"); - mWifiManager.requestActivityInfo(wifiReceiver); - final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver); - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, - wallClockNanos); - e.writeLong(wifiInfo.getTimeSinceBootMillis()); - e.writeInt(wifiInfo.getStackState()); - e.writeLong(wifiInfo.getControllerTxDurationMillis()); - e.writeLong(wifiInfo.getControllerRxDurationMillis()); - e.writeLong(wifiInfo.getControllerIdleDurationMillis()); - e.writeLong(wifiInfo.getControllerEnergyUsedMicroJoules()); - pulledData.add(e); - } catch (RemoteException e) { - Slog.e(TAG, - "Pulling wifiManager for wifi controller activity energy info has error", - e); - } finally { - Binder.restoreCallingIdentity(token); + if (wifiManager == null) { + return; + } + long token = Binder.clearCallingIdentity(); + try { + SynchronousResultReceiver wifiReceiver = new SynchronousResultReceiver("wifi"); + wifiManager.getWifiActivityEnergyInfoAsync( + new Executor() { + @Override + public void execute(Runnable runnable) { + // run the listener on the binder thread, if it was run on the main + // thread it would deadlock since we would be waiting on ourselves + runnable.run(); + } + }, + info -> { + Bundle bundle = new Bundle(); + bundle.putParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY, info); + wifiReceiver.send(0, bundle); + } + ); + final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver); + if (wifiInfo == null) { + return; } + StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); + e.writeLong(wifiInfo.getTimeSinceBootMillis()); + e.writeInt(wifiInfo.getStackState()); + e.writeLong(wifiInfo.getControllerTxDurationMillis()); + e.writeLong(wifiInfo.getControllerRxDurationMillis()); + e.writeLong(wifiInfo.getControllerIdleDurationMillis()); + e.writeLong(wifiInfo.getControllerEnergyUsedMicroJoules()); + pulledData.add(e); + } finally { + Binder.restoreCallingIdentity(token); } }