Skip to content

Commit

Permalink
Merge "BatteryService: add support for Moto Mods battery" into androi…
Browse files Browse the repository at this point in the history
…d-9.0
  • Loading branch information
maxwen authored and Gerrit Code Review committed May 19, 2019
2 parents 33a6ad2 + 4b1b7ef commit 7373ed1
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 5 deletions.
13 changes: 12 additions & 1 deletion core/java/android/os/BatteryManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,17 @@ public class BatteryManager {
@SystemApi
public static final String EXTRA_EVENT_TIMESTAMP = "android.os.extra.EVENT_TIMESTAMP";

public static final String EXTRA_MOD_FLAG = "mod_flag";
public static final String EXTRA_MOD_LEVEL = "mod_level";
public static final String EXTRA_MOD_POWER_SOURCE = "mod_psrc";
public static final String EXTRA_MOD_STATUS = "mod_status";
public static final String EXTRA_MOD_TYPE = "mod_type";
public static final String EXTRA_PLUGGED_RAW = "plugged_raw";

public static final int BATTERY_PROPERTY_MOD_CHARGE_FULL = 100;
public static final int BATTERY_PROPERTY_CHARGE_FULL = 101;
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;
Expand Down Expand Up @@ -183,7 +194,7 @@ 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
Expand Down
1 change: 1 addition & 0 deletions services/core/Android.bp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ java_library_static {
"android.hardware.contexthub-V1.0-java",
"vendor.oneplus.fingerprint.extension-V1.0-java",
"vendor.oneplus.hardware.display-V1.0-java",
"motorola.hardware.health-V1.0-java",
],
}

Expand Down
98 changes: 94 additions & 4 deletions services/core/java/com/android/server/BatteryService.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
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;
Expand All @@ -71,9 +72,11 @@
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;

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;
Expand All @@ -84,6 +87,9 @@
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
Expand Down Expand Up @@ -117,7 +123,7 @@
public final class BatteryService extends SystemService {
private static final String TAG = BatteryService.class.getSimpleName();

private static final boolean DEBUG = false;
private static final boolean DEBUG = true;

private static final int BATTERY_SCALE = 100; // battery capacity is a percentage

Expand Down Expand Up @@ -213,6 +219,16 @@ public final class BatteryService extends SystemService {

private MetricsLogger mMetricsLogger;

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

Expand Down Expand Up @@ -252,6 +268,20 @@ public void onUEvent(UEvent event) {
invalidChargerObserver.startObserving(
"DEVPATH=/devices/virtual/switch/invalid_charger");
}

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
Expand Down Expand Up @@ -469,6 +499,9 @@ private boolean isPoweredLocked(int plugTypeSet) {
if ((plugTypeSet & BatteryManager.BATTERY_PLUGGED_WIRELESS) != 0 && mHealthInfo.chargerWirelessOnline) {
return true;
}
if ((plugTypeSet & BatteryManager.BATTERY_PLUGGED_MOD) != 0 && mPlugType == BatteryManager.BATTERY_PLUGGED_MOD && isModBatteryActive()) {
return true;
}
return false;
}

Expand Down Expand Up @@ -534,6 +567,16 @@ private void update(android.hardware.health.V2_0.HealthInfo info) {
synchronized (mLock) {
if (!mUpdatesStopped) {
mHealthInfo = info.legacy;
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
Expand Down Expand Up @@ -576,6 +619,8 @@ private void processValuesLocked(boolean force) {
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;
}
Expand All @@ -590,7 +635,7 @@ private void processValuesLocked(boolean force) {
// 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 - mBatteryModProps.modFlag, mHealthInfo.batteryTemperature,
mHealthInfo.batteryVoltage, mHealthInfo.batteryChargeCounter,
mHealthInfo.batteryFullCharge);
} catch (RemoteException e) {
Expand All @@ -610,7 +655,12 @@ private void processValuesLocked(boolean force) {
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) {
Expand Down Expand Up @@ -781,6 +831,11 @@ public void run() {
mLastChargeCounter = mHealthInfo.batteryChargeCounter;
mLastBatteryLevelCritical = mBatteryLevelCritical;
mLastInvalidCharger = mInvalidCharger;
mLastModLevel = mBatteryModProps.modLevel;
mLastModStatus = mBatteryModProps.modStatus;
mLastModFlag = mBatteryModProps.modFlag;
mLastModType = mBatteryModProps.modType;
mLastModPowerSource = mBatteryModProps.modPowerSource;

final int maxChargingMicroWatt;
if (mLastMaxChargingVoltage <= 0) {
Expand Down Expand Up @@ -823,14 +878,20 @@ private void sendBatteryChangedIntentLocked() {
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);
intent.putExtra(BatteryManager.EXTRA_INVALID_CHARGER, mInvalidCharger);
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());
Expand Down Expand Up @@ -966,6 +1027,35 @@ private int getIconLocked(int level) {
}
}

private int maybeTranslatePlugType(int plugType) {
if (plugType != BatteryManager.BATTERY_PLUGGED_MOD) {
return plugType;
}
if (this.mHealthInfo.batteryStatus == 2) {
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) {
Expand Down

0 comments on commit 7373ed1

Please sign in to comment.