From c41f1690938b37197a55e7d526ec73497115c751 Mon Sep 17 00:00:00 2001 From: Vachounet <vachounet@live.fr> Date: Wed, 8 May 2019 14:16:54 +0200 Subject: [PATCH] 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 Author: Michael Bestas <mkbestas@lineageos.org> AuthorDate: 2023-07-11 00:38:16 +0200 fixup! BatteryService: Add support for battery Moto Mods Change-Id: If1171bd9ec8972a489db0540889690ae4f9a5d3b Change-Id: Ic4017dd7946ffcf4ab874131240136c07f3f063b (cherry picked from commit 619042ec7eda1d8c8392246b91398b790c8b1b56) --- core/java/android/os/BatteryManager.java | 53 ++++++++++- services/core/Android.bp | 1 + .../com/android/server/BatteryService.java | 94 ++++++++++++++++++- 3 files changed, 144 insertions(+), 4 deletions(-) diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java index 6bc0f6ea947c..054f8d6c0a03 100644 --- a/core/java/android/os/BatteryManager.java +++ b/core/java/android/os/BatteryManager.java @@ -175,6 +175,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; @@ -234,7 +285,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 diff --git a/services/core/Android.bp b/services/core/Android.bp index 028a35856a5c..7a784f6b0cac 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -181,6 +181,7 @@ java_library_static { "cbor-java", "icu4j_calendar_astronomer", "netd-client", + "motorola.hardware.health-V1.0-java", "overlayable_policy_aidl-java", "SurfaceFlingerProperties", "com.android.sysprop.watchdog", diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index 6406450fdc22..3e2b19462475 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -71,6 +71,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 com.libremobileos.notification.LedValues; import com.libremobileos.notification.LineageBatteryLights;; @@ -218,6 +221,16 @@ public final class BatteryService extends SystemService { private LineageBatteryLights mLineageBatteryLights; + 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); @@ -259,6 +272,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 @@ -382,6 +408,10 @@ public final class BatteryService extends SystemService { && mHealthInfo.chargerDockOnline) { return true; } + if ((plugTypeSet & BatteryManager.BATTERY_PLUGGED_MOD) != 0 + && supplementalOrEmergencyModOnline() && isModBatteryActive()) { + return true; + } return false; } @@ -475,6 +505,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 @@ -485,7 +525,7 @@ public final class BatteryService extends SystemService { traceEnd(); } - private static int plugType(HealthInfo healthInfo) { + private int plugType(HealthInfo healthInfo) { if (healthInfo.chargerAcOnline) { return BatteryManager.BATTERY_PLUGGED_AC; } else if (healthInfo.chargerUsbOnline) { @@ -494,6 +534,8 @@ public final class BatteryService extends SystemService { return BatteryManager.BATTERY_PLUGGED_WIRELESS; } else if (healthInfo.chargerDockOnline) { return BatteryManager.BATTERY_PLUGGED_DOCK; + } else if (supplementalOrEmergencyModOnline()) { + return BatteryManager.BATTERY_PLUGGED_MOD; } else { return BATTERY_PLUGGED_NONE; } @@ -520,7 +562,7 @@ public final class BatteryService extends SystemService { mBatteryStats.setBatteryState( mHealthInfo.batteryStatus, mHealthInfo.batteryHealth, - mPlugType, + maybeTranslatePlugType(mPlugType), mHealthInfo.batteryLevel, mHealthInfo.batteryTemperatureTenthsCelsius, mHealthInfo.batteryVoltageMillivolts, @@ -547,6 +589,11 @@ public final class BatteryService extends SystemService { || mHealthInfo.batteryChargeCounterUah != mLastChargeCounter || mInvalidCharger != mLastInvalidCharger || mHealthInfo.batteryCycleCount != mLastBatteryCycleCount + || mBatteryModProps.modLevel != mLastModLevel + || mBatteryModProps.modStatus != mLastModStatus + || mBatteryModProps.modFlag != mLastModFlag + || mBatteryModProps.modType != mLastModType + || mBatteryModProps.modPowerSource != mLastModPowerSource || mHealthInfo.chargingState != mLastCharingState)) { if (mPlugType != mLastPlugType) { @@ -731,6 +778,11 @@ public final class BatteryService extends SystemService { mLastInvalidCharger = mInvalidCharger; mLastBatteryCycleCount = mHealthInfo.batteryCycleCount; mLastCharingState = mHealthInfo.chargingState; + mLastModLevel = mBatteryModProps.modLevel; + mLastModStatus = mBatteryModProps.modStatus; + mLastModFlag = mBatteryModProps.modFlag; + mLastModType = mBatteryModProps.modType; + mLastModPowerSource = mBatteryModProps.modPowerSource; } } @@ -750,7 +802,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); @@ -764,6 +816,12 @@ public final class BatteryService extends SystemService { intent.putExtra(BatteryManager.EXTRA_CHARGE_COUNTER, mHealthInfo.batteryChargeCounterUah); intent.putExtra(BatteryManager.EXTRA_CYCLE_COUNT, mHealthInfo.batteryCycleCount); intent.putExtra(BatteryManager.EXTRA_CHARGING_STATUS, mHealthInfo.chargingState); + 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()); @@ -918,6 +976,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) { -- GitLab