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

Commit 9bccfc06 authored by Steve's avatar Steve Committed by Bumble-Bee
Browse files

Add support for external dock batterys

-- Allow the external battery status to be read via framework

Change-Id: Icb5fe703474326e416d9bd2dc099a31139835cf4
parent b2afe03a
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -27,6 +27,12 @@ public class BatteryManager {
     */
    public static final String EXTRA_STATUS = "status";

    /**
     * Integer containing the current status constant for the dock battery.
     * @hide
     */
    public static final String EXTRA_DOCK_STATUS = "dock_status";
    
    /**
     * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
     * integer containing the current health constant.
@@ -46,6 +52,18 @@ public class BatteryManager {
     */
    public static final String EXTRA_LEVEL = "level";

    /**
     * Integer field containing the current dock battery level.
     * @hide
     */
    public static final String EXTRA_DOCK_LEVEL = "dock_level";

    /**
     * Boolean field containing the current dock battery AC status.
     * @hide
     */
    public static final String EXTRA_DOCK_AC_ONLINE = "dock_ac_online";
    
    /**
     * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
     * integer containing the maximum battery level.
@@ -109,6 +127,21 @@ public class BatteryManager {
    public static final int BATTERY_HEALTH_UNSPECIFIED_FAILURE = 6;
    public static final int BATTERY_HEALTH_COLD = 7;

    /** @hide */
    public static final int DOCK_STATE_UNKNOWN = 0;

    /** @hide */
    public static final int DOCK_STATE_UNDOCKED = 1;

    /** @hide */
    public static final int DOCK_STATE_CHARGING = 2;

    /** @hide */
    public static final int DOCK_STATE_DOCKED = 3;

    /** @hide */
    public static final int DOCK_STATE_DISCHARGING = 4;

    // values of the "plugged" field in the ACTION_BATTERY_CHANGED intent.
    // These must be powers of 2.
    /** Power source is an AC charger. */
+3 −0
Original line number Diff line number Diff line
@@ -768,4 +768,7 @@
    <!-- Workaround for devices with broken keyboards -->
    <bool name="config_forceDisableHardwareKeyboard">false</bool>

    <!-- Asus dock compatibility disabled by default -->
    <bool name="config_hasDockBattery">false</bool>

</resources>
+15 −0
Original line number Diff line number Diff line
@@ -105,6 +105,10 @@ class BatteryService extends Binder {
    private boolean mBatteryLevelCritical;
    private int mInvalidCharger;

    private int mDockBatteryStatus;
    private int mDockBatteryLevel;
    private String mDockBatteryPresent;

    private int mLastBatteryStatus;
    private int mLastBatteryHealth;
    private boolean mLastBatteryPresent;
@@ -117,6 +121,8 @@ class BatteryService extends Binder {
    private int mLowBatteryWarningLevel;
    private int mLowBatteryCloseWarningLevel;

    private boolean mHasDockBattery;

    private int mPlugType;
    private int mLastPlugType = -1; // Extra state so we can detect first run

@@ -140,6 +146,9 @@ class BatteryService extends Binder {
        mLowBatteryCloseWarningLevel = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_lowBatteryCloseWarningLevel);

        mHasDockBattery = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_hasDockBattery);

        mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply");

        // watch for invalid charger messages if the invalid_charger switch exists
@@ -396,6 +405,12 @@ class BatteryService extends Binder {
        intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mBatteryTechnology);
        intent.putExtra(BatteryManager.EXTRA_INVALID_CHARGER, mInvalidCharger);

        if (mHasDockBattery){
            intent.putExtra(BatteryManager.EXTRA_DOCK_STATUS, mDockBatteryStatus);
            intent.putExtra(BatteryManager.EXTRA_DOCK_LEVEL, mDockBatteryLevel);
            intent.putExtra(BatteryManager.EXTRA_DOCK_AC_ONLINE, false);
        }

        if (false) {
            Slog.d(TAG, "level:" + mBatteryLevel +
                    " scale:" + BATTERY_SCALE + " status:" + mBatteryStatus +
+4 −0
Original line number Diff line number Diff line
@@ -41,6 +41,10 @@ ifeq ($(WITH_MALLOC_LEAK_CHECK),true)
    LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK
endif

ifeq ($(TARGET_HAS_DOCK_BATTERY),true)
    LOCAL_CFLAGS += -DHAS_DOCK_BATTERY
endif

LOCAL_MODULE:= libandroid_servers

include $(BUILD_SHARED_LIBRARY)
+72 −0
Original line number Diff line number Diff line
@@ -49,6 +49,11 @@ struct FieldIds {
    jfieldID mBatteryVoltage;
    jfieldID mBatteryTemperature;
    jfieldID mBatteryTechnology;
#ifdef HAS_DOCK_BATTERY
    jfieldID mDockBatteryStatus;
    jfieldID mDockBatteryLevel;
    jfieldID mDockBatteryPresent;
#endif
};
static FieldIds gFieldIds;

@@ -65,6 +70,11 @@ struct BatteryManagerConstants {
    jint healthOverVoltage;
    jint healthUnspecifiedFailure;
    jint healthCold;
#ifdef HAS_DOCK_BATTERY
    jint dockstatusCharging;
    jint dockstatusNotCharging;
    jint dockstatusUndocked;
#endif
};
static BatteryManagerConstants gConstants;

@@ -78,6 +88,11 @@ struct PowerSupplyPaths {
    char* batteryVoltagePath;
    char* batteryTemperaturePath;
    char* batteryTechnologyPath;
#ifdef HAS_DOCK_BATTERY
    char* dockbatteryStatusPath;
    char* dockbatteryCapacityPath;
    char* dockbatteryPresentPath;
#endif
};
static PowerSupplyPaths gPaths;

@@ -99,6 +114,21 @@ static jint getBatteryStatus(const char* status)
    }
}

#ifdef HAS_DOCK_BATTERY
static jint getDockBatteryStatus(const char* status)
{
    switch (status[0]) {
        case 'C': return gConstants.dockstatusCharging;         // Charging
        case 'N': return gConstants.dockstatusNotCharging;      // Not charging

        default: {
            LOGW("Unknown battery status '%s'", status);
            return gConstants.dockstatusUndocked;
        }
    }
}
#endif

static jint getBatteryHealth(const char* status)
{
    switch (status[0]) {
@@ -219,6 +249,10 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj)
    setBooleanField(env, obj, gPaths.usbOnlinePath, gFieldIds.mUsbOnline);
    setBooleanField(env, obj, gPaths.batteryPresentPath, gFieldIds.mBatteryPresent);

#ifdef HAS_DOCK_BATTERY
    setIntField(env, obj, gPaths.dockbatteryCapacityPath, gFieldIds.mDockBatteryLevel);
#endif
    
    setPercentageField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel);
    setVoltageField(env, obj, gPaths.batteryVoltagePath, gFieldIds.mBatteryVoltage);
    setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature);
@@ -232,6 +266,14 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj)
        env->SetIntField(obj, gFieldIds.mBatteryStatus,
                         gConstants.statusUnknown);

#ifdef HAS_DOCK_BATTERY
    if (readFromFile(gPaths.dockbatteryStatusPath, buf, SIZE) > 0)
        env->SetIntField(obj, gFieldIds.mDockBatteryStatus, getDockBatteryStatus(buf));
    else
        env->SetIntField(obj, gFieldIds.mDockBatteryStatus,
                         gConstants.dockstatusUndocked);
#endif
    
    if (readFromFile(gPaths.batteryHealthPath, buf, SIZE) > 0)
        env->SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));

@@ -318,6 +360,19 @@ int register_android_server_BatteryService(JNIEnv* env)
                if (access(path, R_OK) == 0)
                    gPaths.batteryTechnologyPath = strdup(path);
            }
#ifdef HAS_DOCK_BATTERY
            else if(strcmp(buf, "DockBattery") == 0) {
                snprintf(path, sizeof(path), "%s/%s/status", POWER_SUPPLY_PATH, name);
                if (access(path, R_OK) == 0)
                    gPaths.dockbatteryStatusPath = strdup(path);
                snprintf(path, sizeof(path), "%s/%s/capacity", POWER_SUPPLY_PATH, name);
                if (access(path, R_OK) == 0)
                    gPaths.dockbatteryCapacityPath = strdup(path);
                snprintf(path, sizeof(path), "%s/%s/device/ec_dock", POWER_SUPPLY_PATH, name);
                if (access(path, R_OK) == 0)
                    gPaths.dockbatteryPresentPath = strdup(path);
            }
#endif
        }
    }
    closedir(dir);
@@ -358,6 +413,12 @@ int register_android_server_BatteryService(JNIEnv* env)
    gFieldIds.mBatteryVoltage = env->GetFieldID(clazz, "mBatteryVoltage", "I");
    gFieldIds.mBatteryTemperature = env->GetFieldID(clazz, "mBatteryTemperature", "I");

#ifdef HAS_DOCK_BATTERY
    gFieldIds.mDockBatteryStatus = env->GetFieldID(clazz, "mDockBatteryStatus", "I");
    gFieldIds.mDockBatteryLevel = env->GetFieldID(clazz, "mDockBatteryLevel", "I");
    gFieldIds.mDockBatteryPresent = env->GetFieldID(clazz, "mDockBatteryPresent", "Ljava/lang/String;");
#endif

    LOG_FATAL_IF(gFieldIds.mAcOnline == NULL, "Unable to find BatteryService.AC_ONLINE_PATH");
    LOG_FATAL_IF(gFieldIds.mUsbOnline == NULL, "Unable to find BatteryService.USB_ONLINE_PATH");
    LOG_FATAL_IF(gFieldIds.mBatteryStatus == NULL, "Unable to find BatteryService.BATTERY_STATUS_PATH");
@@ -411,6 +472,17 @@ int register_android_server_BatteryService(JNIEnv* env)
    gConstants.healthCold = env->GetStaticIntField(clazz,
            env->GetStaticFieldID(clazz, "BATTERY_HEALTH_COLD", "I"));

#ifdef HAS_DOCK_BATTERY
    gConstants.dockstatusCharging = env->GetStaticIntField(clazz,
            env->GetStaticFieldID(clazz, "DOCK_STATE_CHARGING", "I"));

    gConstants.dockstatusNotCharging = env->GetStaticIntField(clazz,
            env->GetStaticFieldID(clazz, "DOCK_STATE_DISCHARGING", "I"));

    gConstants.dockstatusUndocked = env->GetStaticIntField(clazz,
            env->GetStaticFieldID(clazz, "DOCK_STATE_UNDOCKED", "I"));
#endif

    return jniRegisterNativeMethods(env, "com/android/server/BatteryService", sMethods, NELEM(sMethods));
}