Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fbc01fcb authored by Mike Ma's avatar Mike Ma
Browse files

Register broadcast receiver at runtime instead

Cannot find class when registering Usb connection broadcast receiver
in AndroidManifest, causing system process to crash. Switch to
register receiver at runtime when boot complete.

Fixes: 77274266
Test: Manually plug & unplug usb cable, and reboot device
Test: Verify usb_data appears in batterystats dump
Test: Verify there is no crash log
Change-Id: If4a9e85aa81173ad6d8cb6ce28cc030814c520a5
parent 7219f8ba
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -93,7 +93,6 @@ interface IBatteryStats {
    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);
+32 −3
Original line number Diff line number Diff line
@@ -21,10 +21,13 @@ import android.annotation.Nullable;
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 @@ public class BatteryStatsImpl extends BatteryStats {
    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 class BatteryStatsImpl extends BatteryStats {
        }
    }
    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 class BatteryStatsImpl extends BatteryStats {
    public void systemServicesReady(Context context) {
        mConstants.startObserving(context.getContentResolver());
        registerUsbStateReceiver(context);
    }
    @VisibleForTesting
+0 −10
Original line number Diff line number Diff line
@@ -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" />
+4 −46
Original line number Diff line number Diff line
@@ -19,16 +19,10 @@ package com.android.server.am;
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.IBinder;
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.ModemActivityInfo;
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.PowerProfile;
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 final class BatteryStatsService extends IBatteryStats.Stub
        }
    }

    public void noteUsbConnectionState(boolean connected) {
        enforceCallingPermission();
        synchronized (mStats) {
            mStats.noteUsbConnectionStateLocked(connected);
        }
    }

    public void notePhoneSignalStrength(SignalStrength signalStrength) {
        enforceCallingPermission();
        synchronized (mStats) {
@@ -1164,35 +1151,6 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                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;