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

Commit 619042ec authored by Vachounet's avatar Vachounet Committed by Jan Altensen
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
parent 21986c0b
Loading
Loading
Loading
Loading
+53 −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;
@@ -190,7 +241,8 @@ public class BatteryManager {

    /** @hide */
    public static final int BATTERY_PLUGGED_ANY =
            BATTERY_PLUGGED_AC | BATTERY_PLUGGED_USB | BATTERY_PLUGGED_WIRELESS;
            BATTERY_PLUGGED_AC | BATTERY_PLUGGED_USB | BATTERY_PLUGGED_WIRELESS |
            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
@@ -160,6 +160,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",
+104 −3
Original line number Diff line number Diff line
@@ -55,6 +55,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;
@@ -77,9 +78,11 @@ import com.android.server.lights.LogicalLight;
import org.lineageos.internal.notification.LedValues;
import org.lineageos.internal.notification.LineageBatteryLights;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayDeque;
@@ -90,6 +93,9 @@ import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;

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

/**
 * <p>BatteryService monitors the charging status, and charge level of the device
 * battery.  When these values change this service broadcasts the new values
@@ -205,6 +211,16 @@ public final class BatteryService extends SystemService {

    private LineageBatteryLights mLineageBatteryLights;

    private static final int MOD_TYPE_EMERGENCY = 3;
    private static final int MOD_TYPE_SUPPLEMENTAL = 2;
    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);

@@ -244,6 +260,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
@@ -364,6 +393,10 @@ public final class BatteryService extends SystemService {
        if ((plugTypeSet & BatteryManager.BATTERY_PLUGGED_WIRELESS) != 0 && mHealthInfo.chargerWirelessOnline) {
            return true;
        }
        if ((plugTypeSet & BatteryManager.BATTERY_PLUGGED_MOD) != 0 &&
                  supplementalOrEmergencyModOnline() && isModBatteryActive()) {
            return true;
        }
        return false;
    }

@@ -461,6 +494,16 @@ public final class BatteryService extends SystemService {
            if (!mUpdatesStopped) {
                mHealthInfo = info.legacy.legacy;
                mHealthInfo2p1 = 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
@@ -510,6 +553,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: "
@@ -521,7 +575,7 @@ public final class BatteryService extends SystemService {
        // Let the battery stats keep track of the current level.
        try {
            mBatteryStats.setBatteryState(mHealthInfo.batteryStatus, mHealthInfo.batteryHealth,
                    mPlugType, mHealthInfo.batteryLevel, mHealthInfo.batteryTemperature,
                    maybeTranslatePlugType(mPlugType), mHealthInfo.batteryLevel, mHealthInfo.batteryTemperature,
                    mHealthInfo.batteryVoltage, mHealthInfo.batteryChargeCounter,
                    mHealthInfo.batteryFullCharge,
                    mHealthInfo2p1.batteryChargeTimeToFullNowSeconds);
@@ -542,7 +596,12 @@ public final class BatteryService extends SystemService {
                mHealthInfo.maxChargingCurrent != mLastMaxChargingCurrent ||
                mHealthInfo.maxChargingVoltage != mLastMaxChargingVoltage ||
                mHealthInfo.batteryChargeCounter != mLastChargeCounter ||
                mInvalidCharger != mLastInvalidCharger)) {
                mInvalidCharger != mLastInvalidCharger ||
                mBatteryModProps.modLevel != mLastModLevel ||
                mBatteryModProps.modStatus != mLastModStatus ||
                mBatteryModProps.modFlag != mLastModFlag ||
                mBatteryModProps.modType != mLastModType ||
                mBatteryModProps.modPowerSource != mLastModPowerSource)) {

            if (mPlugType != mLastPlugType) {
                if (mLastPlugType == BATTERY_PLUGGED_NONE) {
@@ -713,6 +772,12 @@ public final class BatteryService extends SystemService {
            mLastChargeCounter = mHealthInfo.batteryChargeCounter;
            mLastBatteryLevelCritical = mBatteryLevelCritical;
            mLastInvalidCharger = mInvalidCharger;
            mLastModLevel = mBatteryModProps.modLevel;
            mLastModStatus = mBatteryModProps.modStatus;
            mLastModFlag = mBatteryModProps.modFlag;
            mLastModType = mBatteryModProps.modType;
            mLastModPowerSource = mBatteryModProps.modPowerSource;

        }
    }

@@ -732,7 +797,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.batteryVoltage);
        intent.putExtra(BatteryManager.EXTRA_TEMPERATURE, mHealthInfo.batteryTemperature);
        intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mHealthInfo.batteryTechnology);
@@ -740,6 +805,12 @@ public final class BatteryService extends SystemService {
        intent.putExtra(BatteryManager.EXTRA_MAX_CHARGING_CURRENT, mHealthInfo.maxChargingCurrent);
        intent.putExtra(BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE, mHealthInfo.maxChargingVoltage);
        intent.putExtra(BatteryManager.EXTRA_CHARGE_COUNTER, mHealthInfo.batteryChargeCounter);
        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());
@@ -878,6 +949,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 1;
        }
        return 0;
    }

    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) {