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

Commit df259ec5 authored by Ricardo Cerqueira's avatar Ricardo Cerqueira Committed by Gerrit Code Review
Browse files

Merge "Add support for external dock batterys" into ics

parents c3806192 9bccfc06
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));
}