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

Unverified Commit c4c66d95 authored by Vachounet's avatar Vachounet Committed by Michael Bestas
Browse files

BatteryService: Add support for battery Moto Mods

Squash of:

Author: Vachounet <vachounet@live.fr>
Date:   Thu May 8 14:16:54 2019 +0200
    BatteryService: Add support for battery Moto Mods

    * This relies on the prebuilt Moto Health service being
      included device side.

    Reference: I48803eeb72499fe8459805f6ef80ef5f868f431e
    Change-Id: I41a4d5fdeb5e1f2ad7838851ad0815cef7d72980

Author: LuK1337 <priv.luk@gmail.com>
Date:   Tue Mar 2 12:47:51 2021 +0100
    BatteryManager: Mark battery moto mods constants as hidden

    Change-Id: I095a646d78c718df14cd8cd4fcde848ae3ba01df

Author: Ali B <abittin@gmail.com>
Date:   Tues Mar 2 17:40:53 2021 +0300
BatteryService: Mod: Check against all conditions

    * Change logical operators from `||` to ~&&` to achieve this.
    * Additionally, change to using supplementalOrEmergencyModOnline()
      to avoid duplicating logic.

    * This fixes battery power saver mode on some devices that were
      effected by the initial Battery mod commit.

    Change-Id: I9b2bfa26ab0c204f7a42ba6010f1f569fa7b0fd8

Change-Id: Ic4017dd7946ffcf4ab874131240136c07f3f063b
(cherry picked from commit 619042ec)
parent 13e2df9f
Loading
Loading
Loading
Loading
+52 −1
Original line number Diff line number Diff line
@@ -163,6 +163,57 @@ public class BatteryManager {
    @SystemApi
    public static final String EXTRA_EVENT_TIMESTAMP = "android.os.extra.EVENT_TIMESTAMP";

    /**
     * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
     * Contains a value that forces Moto Mod battery level `mod_level`
     * to overwrite the interal battery level and act as the device's
     * sole battery. This isn't used by any Mods we have come across.
     * {@hide}
     */
    public static final String EXTRA_MOD_FLAG = "mod_flag";

    /**
     * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
     * Contains battery percentage value for Moto Mod devices.
     * {@hide}
     */
    public static final String EXTRA_MOD_LEVEL = "mod_level";

    /**
     * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
     * Contains Moto Mod power source type value.
     * {@hide}
     */
    public static final String EXTRA_MOD_POWER_SOURCE = "mod_psrc";

    /**
     * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
     * Contains Moto Mod status (ready, charging, etc.) value.
     * {@hide}
     */
    public static final String EXTRA_MOD_STATUS = "mod_status";

    /**
     * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
     * Contains Moto Mod type information (battery, audio, input).
     * {@hide}
     */
    public static final String EXTRA_MOD_TYPE = "mod_type";

    /**
     * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
     * Contains Moto Mod connection indicator.
     * {@hide}
     */
    public static final String EXTRA_PLUGGED_RAW = "plugged_raw";

    /** @hide */
    public static final int BATTERY_PROPERTY_MOD_CHARGE_FULL = 100;
    /** @hide */
    public static final int BATTERY_PROPERTY_CHARGE_FULL = 101;
    /** @hide */
    public static final int BATTERY_PLUGGED_MOD = 8;

    // values for "status" field in the ACTION_BATTERY_CHANGED Intent
    public static final int BATTERY_STATUS_UNKNOWN = Constants.BATTERY_STATUS_UNKNOWN;
    public static final int BATTERY_STATUS_CHARGING = Constants.BATTERY_STATUS_CHARGING;
@@ -193,7 +244,7 @@ public class BatteryManager {
    /** @hide */
    public static final int BATTERY_PLUGGED_ANY =
            BATTERY_PLUGGED_AC | BATTERY_PLUGGED_USB | BATTERY_PLUGGED_WIRELESS
                    | BATTERY_PLUGGED_DOCK;
                    | BATTERY_PLUGGED_DOCK | BATTERY_PLUGGED_MOD;

    /**
     * Sent when the device's battery has started charging (or has reached full charge
+1 −0
Original line number Diff line number Diff line
@@ -171,6 +171,7 @@ java_library_static {
        "capture_state_listener-aidl-java",
        "icu4j_calendar_astronomer",
        "netd-client",
        "motorola.hardware.health-V1.0-java",
        "overlayable_policy_aidl-java",
        "SurfaceFlingerProperties",
        "com.android.sysprop.watchdog",
+100 −2
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import android.os.ServiceManager;
import android.os.ShellCallback;
import android.os.ShellCommand;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UEventObserver;
import android.os.UserHandle;
@@ -67,6 +68,9 @@ import com.android.server.health.HealthServiceWrapper;
import com.android.server.lights.LightsManager;
import com.android.server.lights.LogicalLight;

import motorola.hardware.health.V1_0.BatteryProperties;
import motorola.hardware.health.V1_0.IMotHealth;

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
@@ -187,6 +191,16 @@ public final class BatteryService extends SystemService {

    private MetricsLogger mMetricsLogger;

    private static final int MOD_TYPE_SUPPLEMENTAL = 2;
    private static final int MOD_TYPE_EMERGENCY = 3;
    private BatteryProperties mBatteryModProps;
    private IMotHealth mMotHealthService = null;
    private int mLastModFlag;
    private int mLastModLevel;
    private int mLastModPowerSource;
    private int mLastModStatus;
    private int mLastModType;

    public BatteryService(Context context) {
        super(context);

@@ -226,6 +240,19 @@ public final class BatteryService extends SystemService {
        }

        mBatteryInputSuspended = PowerProperties.battery_input_suspended().orElse(false);
        mBatteryModProps = new BatteryProperties();
        mBatteryModProps.modLevel = -1;
        mBatteryModProps.modStatus = 1;
        mBatteryModProps.modFlag = 0;
        mBatteryModProps.modType = 0;
        mBatteryModProps.modPowerSource = 0;
        try {
            mMotHealthService = IMotHealth.getService();
        } catch (RemoteException e) {
            Slog.e(TAG, "health: cannot get service. (RemoteException)");
        } catch (NoSuchElementException e2) {
            Slog.e(TAG, "mothealth: cannot get service. (no supported health HAL service)");
        }
    }

    @Override
@@ -339,6 +366,10 @@ public final class BatteryService extends SystemService {
                && mHealthInfo.chargerDockOnline) {
            return true;
        }
        if ((plugTypeSet & BatteryManager.BATTERY_PLUGGED_MOD) != 0
                && supplementalOrEmergencyModOnline() && isModBatteryActive()) {
            return true;
        }
        return false;
    }

@@ -432,6 +463,16 @@ public final class BatteryService extends SystemService {
        synchronized (mLock) {
            if (!mUpdatesStopped) {
                mHealthInfo = info;
                if (mMotHealthService != null) {
                    try {
                        mBatteryModProps = mMotHealthService.getModBatteryProperties();
                        if (mBatteryModProps.modFlag > 0) {
                            mHealthInfo.batteryLevel = mBatteryModProps.batteryLevel;
                        }
                    } catch (RemoteException e) {
                        Slog.e(TAG, "getModBatteryProperties fail!");
                    }
                }
                // Process the new values.
                processValuesLocked(false);
                mLock.notifyAll(); // for any waiters on new info
@@ -464,6 +505,17 @@ public final class BatteryService extends SystemService {
            mHealthInfo.batteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
            && mHealthInfo.batteryLevel <= mCriticalBatteryLevel;
        mPlugType = plugType(mHealthInfo);
        if (mHealthInfo.chargerAcOnline) {
            mPlugType = BatteryManager.BATTERY_PLUGGED_AC;
        } else if (mHealthInfo.chargerUsbOnline) {
            mPlugType = BatteryManager.BATTERY_PLUGGED_USB;
        } else if (mHealthInfo.chargerWirelessOnline) {
            mPlugType = BatteryManager.BATTERY_PLUGGED_WIRELESS;
        } else if (supplementalOrEmergencyModOnline()) {
            mPlugType = BatteryManager.BATTERY_PLUGGED_MOD;
        } else {
            mPlugType = BATTERY_PLUGGED_NONE;
        }

        if (DEBUG) {
            Slog.d(TAG, "Processing new values: "
@@ -477,7 +529,7 @@ public final class BatteryService extends SystemService {
            mBatteryStats.setBatteryState(
                    mHealthInfo.batteryStatus,
                    mHealthInfo.batteryHealth,
                    mPlugType,
                    maybeTranslatePlugType(mPlugType),
                    mHealthInfo.batteryLevel,
                    mHealthInfo.batteryTemperatureTenthsCelsius,
                    mHealthInfo.batteryVoltageMillivolts,
@@ -502,6 +554,11 @@ public final class BatteryService extends SystemService {
                        || mHealthInfo.maxChargingCurrentMicroamps != mLastMaxChargingCurrent
                        || mHealthInfo.maxChargingVoltageMicrovolts != mLastMaxChargingVoltage
                        || mHealthInfo.batteryChargeCounterUah != mLastChargeCounter
                        || mBatteryModProps.modLevel != mLastModLevel
                        || mBatteryModProps.modStatus != mLastModStatus
                        || mBatteryModProps.modFlag != mLastModFlag
                        || mBatteryModProps.modType != mLastModType
                        || mBatteryModProps.modPowerSource != mLastModPowerSource
                        || mInvalidCharger != mLastInvalidCharger)) {

            if (mPlugType != mLastPlugType) {
@@ -676,6 +733,11 @@ public final class BatteryService extends SystemService {
            mLastChargeCounter = mHealthInfo.batteryChargeCounterUah;
            mLastBatteryLevelCritical = mBatteryLevelCritical;
            mLastInvalidCharger = mInvalidCharger;
            mLastModLevel = mBatteryModProps.modLevel;
            mLastModStatus = mBatteryModProps.modStatus;
            mLastModFlag = mBatteryModProps.modFlag;
            mLastModType = mBatteryModProps.modType;
            mLastModPowerSource = mBatteryModProps.modPowerSource;
        }
    }

@@ -695,7 +757,7 @@ public final class BatteryService extends SystemService {
        intent.putExtra(BatteryManager.EXTRA_BATTERY_LOW, mSentLowBatteryBroadcast);
        intent.putExtra(BatteryManager.EXTRA_SCALE, BATTERY_SCALE);
        intent.putExtra(BatteryManager.EXTRA_ICON_SMALL, icon);
        intent.putExtra(BatteryManager.EXTRA_PLUGGED, mPlugType);
        intent.putExtra(BatteryManager.EXTRA_PLUGGED, maybeTranslatePlugType(mPlugType));
        intent.putExtra(BatteryManager.EXTRA_VOLTAGE, mHealthInfo.batteryVoltageMillivolts);
        intent.putExtra(
                BatteryManager.EXTRA_TEMPERATURE, mHealthInfo.batteryTemperatureTenthsCelsius);
@@ -707,6 +769,12 @@ public final class BatteryService extends SystemService {
                BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE,
                mHealthInfo.maxChargingVoltageMicrovolts);
        intent.putExtra(BatteryManager.EXTRA_CHARGE_COUNTER, mHealthInfo.batteryChargeCounterUah);
        intent.putExtra(BatteryManager.EXTRA_MOD_LEVEL, mBatteryModProps.modLevel);
        intent.putExtra(BatteryManager.EXTRA_MOD_STATUS, mBatteryModProps.modStatus);
        intent.putExtra(BatteryManager.EXTRA_MOD_FLAG, mBatteryModProps.modFlag);
        intent.putExtra(BatteryManager.EXTRA_PLUGGED_RAW, mPlugType);
        intent.putExtra(BatteryManager.EXTRA_MOD_TYPE, mBatteryModProps.modType);
        intent.putExtra(BatteryManager.EXTRA_MOD_POWER_SOURCE, mBatteryModProps.modPowerSource);
        if (DEBUG) {
            Slog.d(TAG, "Sending ACTION_BATTERY_CHANGED. scale:" + BATTERY_SCALE
                    + ", info:" + mHealthInfo.toString());
@@ -845,6 +913,36 @@ public final class BatteryService extends SystemService {
        }
    }

    private int maybeTranslatePlugType(int plugType) {
        if (plugType != BatteryManager.BATTERY_PLUGGED_MOD) {
            return plugType;
        }
        if (this.mHealthInfo.batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING) {
            return BatteryManager.BATTERY_PLUGGED_AC;
        }
        return BATTERY_PLUGGED_NONE;
    }

    private boolean supplementalOrEmergencyModOnline() {
        return mBatteryModProps.modLevel > 0 &&
        (mBatteryModProps.modType == MOD_TYPE_SUPPLEMENTAL ||
        mBatteryModProps.modType == MOD_TYPE_EMERGENCY);
    }

    private boolean isModBatteryActive() {
        if (mBatteryModProps.modLevel <= 0 || mBatteryModProps.modType != MOD_TYPE_SUPPLEMENTAL) {
            return false;
        }
        String batteryMode = SystemProperties.get("sys.mod.batterymode");
        if ("0".equals(batteryMode)) {
            return true;
        }
        if (!"2".equals(batteryMode) && mHealthInfo.batteryLevel <= 80) {
            return true;
        }
        return false;
    }

    class Shell extends ShellCommand {
        @Override
        public int onCommand(String cmd) {