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

Commit 83de6311 authored by YK Hung's avatar YK Hung Committed by Android (Google) Code Review
Browse files

Merge "Update battery health state intent (2/3)" into udc-dev

parents b71dd78a cf1190c7
Loading
Loading
Loading
Loading
+19 −12
Original line number Original line Diff line number Diff line
@@ -34,24 +34,20 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.RetentionPolicy;


/**
/**
 * Use this broadcastReceiver to listen to the battery change, and it will invoke
 * Use this broadcastReceiver to listen to the battery change and it will invoke
 * {@link OnBatteryChangedListener} if any of the following has been changed:
 * {@link OnBatteryChangedListener}
 *
 * 1. Battery level(e.g. 100%->99%)
 * 2. Battery status(e.g. plugged->unplugged)
 * 3. Battery saver(e.g. off->on)
 * 4. Battery health(e.g. good->overheat)
 */
 */
public class BatteryBroadcastReceiver extends BroadcastReceiver {
public class BatteryBroadcastReceiver extends BroadcastReceiver {


    private static final String TAG = "BatteryBroadcastRcvr";
    private static final String TAG = "BatteryBroadcastRcvr";
    /**
    /**
     * Callback when the following has been changed:
     * Callback if any of the monitored fields has been changed:
     *
     *
     * Battery level(e.g. 100%->99%)
     * Battery level(e.g. 100%->99%)
     * Battery status(e.g. plugged->unplugged)
     * Battery status(e.g. plugged->unplugged)
     * Battery saver(e.g. off->on)
     * Battery saver(e.g. off->on)
     * Battery health(e.g. good->overheat)
     * Battery health(e.g. good->overheat)
     * Battery charging status(e.g. default->long life)
     */
     */
    public interface OnBatteryChangedListener {
    public interface OnBatteryChangedListener {
        void onBatteryChanged(@BatteryUpdateType int type);
        void onBatteryChanged(@BatteryUpdateType int type);
@@ -63,6 +59,7 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver {
            BatteryUpdateType.BATTERY_SAVER,
            BatteryUpdateType.BATTERY_SAVER,
            BatteryUpdateType.BATTERY_STATUS,
            BatteryUpdateType.BATTERY_STATUS,
            BatteryUpdateType.BATTERY_HEALTH,
            BatteryUpdateType.BATTERY_HEALTH,
            BatteryUpdateType.CHARGING_STATUS,
            BatteryUpdateType.BATTERY_NOT_PRESENT})
            BatteryUpdateType.BATTERY_NOT_PRESENT})
    public @interface BatteryUpdateType {
    public @interface BatteryUpdateType {
        int MANUAL = 0;
        int MANUAL = 0;
@@ -70,7 +67,8 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver {
        int BATTERY_SAVER = 2;
        int BATTERY_SAVER = 2;
        int BATTERY_STATUS = 3;
        int BATTERY_STATUS = 3;
        int BATTERY_HEALTH = 4;
        int BATTERY_HEALTH = 4;
        int BATTERY_NOT_PRESENT = 5;
        int CHARGING_STATUS = 5;
        int BATTERY_NOT_PRESENT = 6;
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -78,6 +76,8 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver {
    @VisibleForTesting
    @VisibleForTesting
    String mBatteryStatus;
    String mBatteryStatus;
    @VisibleForTesting
    @VisibleForTesting
    int mChargingStatus;
    @VisibleForTesting
    int mBatteryHealth;
    int mBatteryHealth;
    private OnBatteryChangedListener mBatteryListener;
    private OnBatteryChangedListener mBatteryListener;
    private Context mContext;
    private Context mContext;
@@ -121,21 +121,27 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver {
            final String batteryLevel = Utils.getBatteryPercentage(intent);
            final String batteryLevel = Utils.getBatteryPercentage(intent);
            final String batteryStatus =
            final String batteryStatus =
                    Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false);
                    Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false);
            final int chargingStatus = intent.getIntExtra(
                    BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT);
            final int batteryHealth = intent.getIntExtra(
            final int batteryHealth = intent.getIntExtra(
                    BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN);
                    BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN);
            Log.d(
            Log.d(
                    TAG,
                    TAG,
                    "Battery changed: level="
                    "Battery changed: level: "
                            + batteryLevel
                            + batteryLevel
                            + ", status="
                            + "| status: "
                            + batteryStatus
                            + batteryStatus
                            + ", health="
                            + "| chargingStatus: "
                            + chargingStatus
                            + "| health: "
                            + batteryHealth);
                            + batteryHealth);
            if (!Utils.isBatteryPresent(intent)) {
            if (!Utils.isBatteryPresent(intent)) {
                Log.w(TAG, "Problem reading the battery meter.");
                Log.w(TAG, "Problem reading the battery meter.");
                mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_NOT_PRESENT);
                mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_NOT_PRESENT);
            } else if (forceUpdate) {
            } else if (forceUpdate) {
                mBatteryListener.onBatteryChanged(BatteryUpdateType.MANUAL);
                mBatteryListener.onBatteryChanged(BatteryUpdateType.MANUAL);
            } else if (chargingStatus != mChargingStatus) {
                mBatteryListener.onBatteryChanged(BatteryUpdateType.CHARGING_STATUS);
            } else if (batteryHealth != mBatteryHealth) {
            } else if (batteryHealth != mBatteryHealth) {
                mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_HEALTH);
                mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_HEALTH);
            } else if(!batteryLevel.equals(mBatteryLevel)) {
            } else if(!batteryLevel.equals(mBatteryLevel)) {
@@ -145,6 +151,7 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver {
            }
            }
            mBatteryLevel = batteryLevel;
            mBatteryLevel = batteryLevel;
            mBatteryStatus = batteryStatus;
            mBatteryStatus = batteryStatus;
            mChargingStatus = chargingStatus;
            mBatteryHealth = batteryHealth;
            mBatteryHealth = batteryHealth;
        } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
        } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
            mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_SAVER);
            mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_SAVER);
+5 −5
Original line number Original line Diff line number Diff line
@@ -51,7 +51,7 @@ public class BatteryInfo {
    public int batteryStatus;
    public int batteryStatus;
    public int pluggedStatus;
    public int pluggedStatus;
    public boolean discharging = true;
    public boolean discharging = true;
    public boolean isOverheated;
    public boolean isBatteryDefender;
    public long remainingTimeUs = 0;
    public long remainingTimeUs = 0;
    public long averageTimeToDischarge = EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN;
    public long averageTimeToDischarge = EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN;
    public String batteryPercentString;
    public String batteryPercentString;
@@ -257,9 +257,9 @@ public class BatteryInfo {
        info.pluggedStatus = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
        info.pluggedStatus = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
        info.mCharging = info.pluggedStatus != 0;
        info.mCharging = info.pluggedStatus != 0;
        info.averageTimeToDischarge = estimate.getAverageDischargeTime();
        info.averageTimeToDischarge = estimate.getAverageDischargeTime();
        info.isOverheated = batteryBroadcast.getIntExtra(
        info.isBatteryDefender = batteryBroadcast.getIntExtra(
                BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN)
                BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT)
                == BatteryManager.BATTERY_HEALTH_OVERHEAT;
                == BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE;


        info.statusLabel = Utils.getBatteryStatus(context, batteryBroadcast, isCompactStatus);
        info.statusLabel = Utils.getBatteryStatus(context, batteryBroadcast, isCompactStatus);
        info.batteryStatus = batteryBroadcast.getIntExtra(
        info.batteryStatus = batteryBroadcast.getIntExtra(
@@ -283,7 +283,7 @@ public class BatteryInfo {
        info.discharging = false;
        info.discharging = false;
        info.suggestionLabel = null;
        info.suggestionLabel = null;
        int dockDefenderMode = BatteryUtils.getCurrentDockDefenderMode(context, info);
        int dockDefenderMode = BatteryUtils.getCurrentDockDefenderMode(context, info);
        if ((info.isOverheated && status != BatteryManager.BATTERY_STATUS_FULL
        if ((info.isBatteryDefender && status != BatteryManager.BATTERY_STATUS_FULL
                && dockDefenderMode == BatteryUtils.DockDefenderMode.DISABLED)
                && dockDefenderMode == BatteryUtils.DockDefenderMode.DISABLED)
                || dockDefenderMode == BatteryUtils.DockDefenderMode.ACTIVE) {
                || dockDefenderMode == BatteryUtils.DockDefenderMode.ACTIVE) {
            // Battery defender active, battery charging paused
            // Battery defender active, battery charging paused
+4 −5
Original line number Original line Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.settings.fuelgauge;
import android.app.AppOpsManager;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.InstallSourceInfo;
import android.content.pm.InstallSourceInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInfo;
@@ -322,10 +321,10 @@ public class BatteryUtils {
    }
    }


    /**
    /**
     * Return {@code true} if battery is overheated and charging.
     * Return {@code true} if battery defender is on and charging.
     */
     */
    public static boolean isBatteryDefenderOn(BatteryInfo batteryInfo) {
    public static boolean isBatteryDefenderOn(BatteryInfo batteryInfo) {
        return batteryInfo.isOverheated && !batteryInfo.discharging;
        return batteryInfo.isBatteryDefender && !batteryInfo.discharging;
    }
    }


    /**
    /**
@@ -627,11 +626,11 @@ public class BatteryUtils {
            if (Settings.Global.getInt(context.getContentResolver(),
            if (Settings.Global.getInt(context.getContentResolver(),
                    SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 0) == 1) {
                    SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 0) == 1) {
                return DockDefenderMode.TEMPORARILY_BYPASSED;
                return DockDefenderMode.TEMPORARILY_BYPASSED;
            } else if (batteryInfo.isOverheated && FeatureFactory.getFactory(context)
            } else if (batteryInfo.isBatteryDefender && FeatureFactory.getFactory(context)
                    .getPowerUsageFeatureProvider(context)
                    .getPowerUsageFeatureProvider(context)
                    .isExtraDefend()) {
                    .isExtraDefend()) {
                return DockDefenderMode.ACTIVE;
                return DockDefenderMode.ACTIVE;
            } else if (!batteryInfo.isOverheated) {
            } else if (!batteryInfo.isBatteryDefender) {
                return DockDefenderMode.FUTURE_BYPASS;
                return DockDefenderMode.FUTURE_BYPASS;
            }
            }
        }
        }
+7 −8
Original line number Original line Diff line number Diff line
@@ -37,9 +37,8 @@ public class BatteryDefenderDetector implements BatteryTipDetector {


    @Override
    @Override
    public BatteryTip detect() {
    public BatteryTip detect() {
      final boolean isBasicBatteryDefend = mBatteryInfo.isOverheated
        final boolean isBasicBatteryDefend = mBatteryInfo.isBatteryDefender
              && !FeatureFactory.getFactory(mContext)
                && !FeatureFactory.getFactory(mContext).getPowerUsageFeatureProvider(mContext)
                          .getPowerUsageFeatureProvider(mContext)
                .isExtraDefend();
                .isExtraDefend();
        final int state = isBasicBatteryDefend
        final int state = isBasicBatteryDefend
                ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE;
                ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE;
+18 −2
Original line number Original line Diff line number Diff line
@@ -69,6 +69,7 @@ public class BatteryBroadcastReceiverTest {
        mBatteryBroadcastReceiver.mBatteryLevel = BATTERY_INIT_LEVEL;
        mBatteryBroadcastReceiver.mBatteryLevel = BATTERY_INIT_LEVEL;
        mBatteryBroadcastReceiver.mBatteryStatus = BATTERY_INIT_STATUS;
        mBatteryBroadcastReceiver.mBatteryStatus = BATTERY_INIT_STATUS;
        mBatteryBroadcastReceiver.mBatteryHealth = BatteryManager.BATTERY_HEALTH_UNKNOWN;
        mBatteryBroadcastReceiver.mBatteryHealth = BatteryManager.BATTERY_HEALTH_UNKNOWN;
        mBatteryBroadcastReceiver.mChargingStatus = BatteryManager.CHARGING_POLICY_DEFAULT;
        mBatteryBroadcastReceiver.setBatteryChangedListener(mBatteryListener);
        mBatteryBroadcastReceiver.setBatteryChangedListener(mBatteryListener);


        mChargingIntent = new Intent(Intent.ACTION_BATTERY_CHANGED);
        mChargingIntent = new Intent(Intent.ACTION_BATTERY_CHANGED);
@@ -91,8 +92,8 @@ public class BatteryBroadcastReceiverTest {


    @Test
    @Test
    public void onReceive_batteryHealthChanged_dataUpdated() {
    public void onReceive_batteryHealthChanged_dataUpdated() {
        mChargingIntent
        mChargingIntent.putExtra(
                .putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT);
                BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT);
        mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);
        mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);


        assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
        assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
@@ -100,6 +101,17 @@ public class BatteryBroadcastReceiverTest {
        verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_HEALTH);
        verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_HEALTH);
    }
    }


    @Test
    public void onReceive_chargingStatusChanged_dataUpdated() {
        mChargingIntent.putExtra(BatteryManager.EXTRA_CHARGING_STATUS,
                BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE);
        mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);

        assertThat(mBatteryBroadcastReceiver.mChargingStatus)
                .isEqualTo(BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE);
        verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.CHARGING_STATUS);
    }

    @Test
    @Test
    public void onReceive_batteryNotPresent_shouldShowHelpMessage() {
    public void onReceive_batteryNotPresent_shouldShowHelpMessage() {
        mChargingIntent.putExtra(BatteryManager.EXTRA_PRESENT, false);
        mChargingIntent.putExtra(BatteryManager.EXTRA_PRESENT, false);
@@ -131,6 +143,8 @@ public class BatteryBroadcastReceiverTest {
        assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus);
        assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus);
        assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
        assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
                .isEqualTo(BatteryManager.BATTERY_HEALTH_UNKNOWN);
                .isEqualTo(BatteryManager.BATTERY_HEALTH_UNKNOWN);
        assertThat(mBatteryBroadcastReceiver.mChargingStatus)
                .isEqualTo(BatteryManager.CHARGING_POLICY_DEFAULT);
        verify(mBatteryListener, never()).onBatteryChanged(anyInt());
        verify(mBatteryListener, never()).onBatteryChanged(anyInt());
    }
    }


@@ -163,6 +177,8 @@ public class BatteryBroadcastReceiverTest {
                Utils.getBatteryStatus(mContext, mChargingIntent, /* compactStatus= */ false));
                Utils.getBatteryStatus(mContext, mChargingIntent, /* compactStatus= */ false));
        assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
        assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
                .isEqualTo(BatteryManager.BATTERY_HEALTH_UNKNOWN);
                .isEqualTo(BatteryManager.BATTERY_HEALTH_UNKNOWN);
        assertThat(mBatteryBroadcastReceiver.mChargingStatus)
                .isEqualTo(BatteryManager.CHARGING_POLICY_DEFAULT);
        // 2 times because register will force update the battery
        // 2 times because register will force update the battery
        verify(mBatteryListener, times(2)).onBatteryChanged(BatteryUpdateType.MANUAL);
        verify(mBatteryListener, times(2)).onBatteryChanged(BatteryUpdateType.MANUAL);
    }
    }
Loading