Merge "Register broadcast receiver at runtime instead" into pi-dev
am: 806be6b602
Change-Id: I3375ae095ef08830ea1892c3652832d17308340d
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 03dd77f..514ff76 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -93,7 +93,6 @@
void noteVibratorOff(int uid);
void noteGpsChanged(in WorkSource oldSource, in WorkSource newSource);
void noteGpsSignalQuality(int signalLevel);
- void noteUsbConnectionState(boolean connected);
void noteScreenState(int state);
void noteScreenBrightness(int brightness);
void noteUserActivity(int uid, int event);
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 89f6156..5da3874 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -21,10 +21,13 @@
import android.app.ActivityManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.UidTraffic;
+import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.database.ContentObserver;
+import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager;
import android.net.NetworkStats;
import android.net.Uri;
@@ -766,7 +769,10 @@
int mCameraOnNesting;
StopwatchTimer mCameraOnTimer;
- int mUsbDataState; // 0: unknown, 1: disconnected, 2: connected
+ private static final int USB_DATA_UNKNOWN = 0;
+ private static final int USB_DATA_DISCONNECTED = 1;
+ private static final int USB_DATA_CONNECTED = 2;
+ int mUsbDataState = USB_DATA_UNKNOWN;
int mGpsSignalQualityBin = -1;
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
@@ -5241,8 +5247,30 @@
}
}
- public void noteUsbConnectionStateLocked(boolean connected) {
- int newState = connected ? 2 : 1;
+ private void registerUsbStateReceiver(Context context) {
+ final IntentFilter usbStateFilter = new IntentFilter();
+ usbStateFilter.addAction(UsbManager.ACTION_USB_STATE);
+ context.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final boolean state = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
+ synchronized (BatteryStatsImpl.this) {
+ noteUsbConnectionStateLocked(state);
+ }
+ }
+ }, usbStateFilter);
+ synchronized (this) {
+ if (mUsbDataState == USB_DATA_UNKNOWN) {
+ final Intent usbState = context.registerReceiver(null, usbStateFilter);
+ final boolean initState = usbState != null && usbState.getBooleanExtra(
+ UsbManager.USB_CONNECTED, false);
+ noteUsbConnectionStateLocked(initState);
+ }
+ }
+ }
+
+ private void noteUsbConnectionStateLocked(boolean connected) {
+ int newState = connected ? USB_DATA_CONNECTED : USB_DATA_DISCONNECTED;
if (mUsbDataState != newState) {
mUsbDataState = newState;
if (connected) {
@@ -13218,6 +13246,7 @@
public void systemServicesReady(Context context) {
mConstants.startObserving(context.getContentResolver());
+ registerUsbStateReceiver(context);
}
@VisibleForTesting
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 04c4130..b7b5f23 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -4253,16 +4253,6 @@
android:exported="false">
</receiver>
- <receiver android:name="com.android.server.am.BatteryStatsService$UsbConnectionReceiver"
- android:exported="false">
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.hardware.usb.action.USB_STATE" />
- </intent-filter>
- </receiver>
-
<service android:name="android.hardware.location.GeofenceHardwareService"
android:permission="android.permission.LOCATION_HARDWARE"
android:exported="false" />
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 8ecd93e..9c2b1a5 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -19,16 +19,10 @@
import android.app.ActivityManager;
import android.app.job.JobProtoEnums;
import android.bluetooth.BluetoothActivityEnergyInfo;
-import android.content.BroadcastReceiver;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.hardware.usb.UsbManager;
import android.net.wifi.WifiActivityEnergyInfo;
-import android.os.PowerManager.ServiceType;
-import android.os.PowerSaveState;
import android.os.BatteryStats;
import android.os.BatteryStatsInternal;
import android.os.Binder;
@@ -37,18 +31,18 @@
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFormatException;
+import android.os.PowerManager.ServiceType;
import android.os.PowerManagerInternal;
+import android.os.PowerSaveState;
import android.os.Process;
-import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManagerInternal;
import android.os.WorkSource;
-import android.os.WorkSource.WorkChain;
import android.os.connectivity.CellularBatteryStats;
-import android.os.connectivity.WifiBatteryStats;
import android.os.connectivity.GpsBatteryStats;
+import android.os.connectivity.WifiBatteryStats;
import android.os.health.HealthStatsParceler;
import android.os.health.HealthStatsWriter;
import android.os.health.UidHealthStats;
@@ -57,6 +51,7 @@
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.util.Slog;
+import android.util.StatsLog;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BatteryStatsHelper;
@@ -65,7 +60,6 @@
import com.android.internal.os.RpmStats;
import com.android.internal.util.DumpUtils;
import com.android.server.LocalServices;
-import android.util.StatsLog;
import java.io.File;
import java.io.FileDescriptor;
@@ -701,13 +695,6 @@
}
}
- public void noteUsbConnectionState(boolean connected) {
- enforceCallingPermission();
- synchronized (mStats) {
- mStats.noteUsbConnectionStateLocked(connected);
- }
- }
-
public void notePhoneSignalStrength(SignalStrength signalStrength) {
enforceCallingPermission();
synchronized (mStats) {
@@ -1164,35 +1151,6 @@
Binder.getCallingPid(), Binder.getCallingUid(), null);
}
- public final static class UsbConnectionReceiver extends BroadcastReceiver {
- private static final String TAG = UsbConnectionReceiver.class.getSimpleName();
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
- final Intent usbState = context.registerReceiver(null, new IntentFilter(UsbManager.ACTION_USB_STATE));
- if (usbState != null) {
- handleUsbState(usbState);
- }
- } else if (UsbManager.ACTION_USB_STATE.equals(action)) {
- handleUsbState(intent);
- }
- }
- private void handleUsbState(Intent intent) {
- IBatteryStats bs = getService();
- if (bs == null) {
- Slog.w(TAG, "Could not access batterystats");
- return;
- }
- boolean connected = intent.getExtras().getBoolean(UsbManager.USB_CONNECTED);
- try {
- bs.noteUsbConnectionState(connected);
- } catch (RemoteException e) {
- Slog.w(TAG, "Could not access batterystats: ", e);
- }
- }
- }
-
final class WakeupReasonThread extends Thread {
private static final int MAX_REASON_SIZE = 512;
private CharsetDecoder mDecoder;