diff options
| author | Jorge Ruesga <jorge@ruesga.com> | 2013-01-27 05:03:48 +0100 |
|---|---|---|
| committer | Jorge Ruesga <jorge@ruesga.com> | 2013-02-08 01:29:23 +0100 |
| commit | 042159d9e9a129da3e290a5c6a2d4629acd56a65 (patch) | |
| tree | c4bc85f8ed82ee0d66d3f304826e04d0e0525cc8 | |
| parent | eeb11165b6e5443be802b475017cb7aca9d6f213 (diff) | |
| download | frameworks_base-042159d9e9a129da3e290a5c6a2d4629acd56a65.zip frameworks_base-042159d9e9a129da3e290a5c6a2d4629acd56a65.tar.gz frameworks_base-042159d9e9a129da3e290a5c6a2d4629acd56a65.tar.bz2 | |
SystemUI: Add dock battery icon styles
Support for dock battery icon styles. This changes does a refactor of DockBatteryController to
extend BatteryController and create a new CircleDockBattery that extends CircleBattery (that listen
for dock battery events)
Patchset 2: Fully functional.
Patchset 3: Fixed min icons. Rebased.
Patchset 4: Create full device specific service in frameworks
Move dock battery stuff from the framework to a device handler.
Register/unregister DockBatteryController receivers
Remove battery views if device doesn't support dock battery
Refresh status on dock and screen on events
Rebased
Patchset 5: Transformers backwards compatibility
Better main battery status detection (use status instead of plugged type)
Fixed battery cluster space in status bar
Rebased
Patchset 6: Fix dock icons in ligths out mode
Patchset 7: Fix code style
Fix lockscreen status
Fix lights out mode (typo)
Fix images size
Rebased
Patchset 8: Fix icon images
Fix status on full charge
Rebased
TF700T implementation: http://review.cyanogenmod.org/#/c/31298/
Change-Id: I9a576d1b279f1883f736ac3bcd2435c4b95a73de
Signed-off-by: Jorge Ruesga <jorge@ruesga.com>
109 files changed, 834 insertions, 440 deletions
diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java index 9822219..71c6d1e 100644 --- a/core/java/android/os/BatteryManager.java +++ b/core/java/android/os/BatteryManager.java @@ -28,12 +28,6 @@ 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,12 +40,6 @@ public class BatteryManager { public static final String EXTRA_PRESENT = "present"; /** - * Integer containing the current status constant for the dock battery. - * @hide - */ - public static final String EXTRA_DOCK_PRESENT = "dock_present"; - - /** * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}: * integer field containing the current battery level, from 0 to * {@link #EXTRA_SCALE}. @@ -59,12 +47,6 @@ 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"; - - /** * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}: * integer containing the maximum battery level. */ @@ -111,6 +93,28 @@ public class BatteryManager { */ public static final String EXTRA_INVALID_CHARGER = "invalid_charger"; + // Dock intents + /** @hide **/ + public static final String EXTRA_DOCK_STATUS = "dock_status"; + /** @hide **/ + public static final String EXTRA_DOCK_HEALTH = "dock_health"; + /** @hide **/ + public static final String EXTRA_DOCK_PRESENT = "dock_present"; + /** @hide **/ + public static final String EXTRA_DOCK_LEVEL = "dock_level"; + /** @hide **/ + public static final String EXTRA_DOCK_SCALE = "dock_scale"; + /** @hide **/ + public static final String EXTRA_DOCK_ICON_SMALL = "dock_icon-small"; + /** @hide **/ + public static final String EXTRA_DOCK_PLUGGED = "dock_plugged"; + /** @hide **/ + public static final String EXTRA_DOCK_VOLTAGE = "dock_voltage"; + /** @hide **/ + public static final String EXTRA_DOCK_TEMPERATURE = "dock_temperature"; + /** @hide **/ + public static final String EXTRA_DOCK_TECHNOLOGY = "dock_technology"; + // values for "status" field in the ACTION_BATTERY_CHANGED Intent public static final int BATTERY_STATUS_UNKNOWN = 1; public static final int BATTERY_STATUS_CHARGING = 2; @@ -127,13 +131,6 @@ 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_BATTERY_STATUS_UNKNOWN = 1; - /** @hide */ - public static final int DOCK_BATTERY_STATUS_CHARGING = 2; - /** @hide */ - public static final int DOCK_BATTERY_STATUS_NOT_CHARGING = 4; - // values of the "plugged" field in the ACTION_BATTERY_CHANGED intent. // These must be powers of 2. /** Power source is an AC charger. */ diff --git a/core/java/com/android/internal/os/DeviceDockBatteryHandler.java b/core/java/com/android/internal/os/DeviceDockBatteryHandler.java new file mode 100644 index 0000000..ef5a8b2 --- /dev/null +++ b/core/java/com/android/internal/os/DeviceDockBatteryHandler.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2013 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.os; + +import android.content.Intent; +import android.os.Bundle; + +public interface DeviceDockBatteryHandler { + + /** + * Invoked when the system request an update of the dock battery status. Device should + * access specific sysfs and read status, present and level of the device dock battery. + */ + public void update(); + + /** + * Invoked after {@link #update()} for processing the values prior to notify them. + */ + public void process(); + + /** + * Method that returns the data to notify to {@link Intent#ACTION_BATTERY_CHANGED} action. + */ + public Bundle getNotifyData(); + + /** + * Method that returns if this handler has new battery data to notify + * + * @return If this handler has new battery data to notify. + */ + public boolean hasNewData(); + + /** + * Method that returns if the dock battery is plugged (is powering device main battery) + * + * @return If the dock battery is plugged + */ + public boolean isPlugged(); +} diff --git a/core/java/com/android/internal/os/IDeviceHandler.java b/core/java/com/android/internal/os/IDeviceHandler.java new file mode 100644 index 0000000..f6e196f --- /dev/null +++ b/core/java/com/android/internal/os/IDeviceHandler.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2013 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.os; + +/** + * @hide + */ +public interface IDeviceHandler { + public DeviceKeyHandler getDeviceKeyHandler(); + public DeviceDockBatteryHandler getDeviceDockBatteryHandler(); +} diff --git a/core/java/com/android/internal/policy/IPolicy.java b/core/java/com/android/internal/policy/IPolicy.java index d08b3b4..ad679d2 100644 --- a/core/java/com/android/internal/policy/IPolicy.java +++ b/core/java/com/android/internal/policy/IPolicy.java @@ -22,6 +22,8 @@ import android.view.LayoutInflater; import android.view.Window; import android.view.WindowManagerPolicy; +import com.android.internal.os.IDeviceHandler; + /** * {@hide} */ @@ -33,7 +35,7 @@ public interface IPolicy { public LayoutInflater makeNewLayoutInflater(Context context); - public WindowManagerPolicy makeNewWindowManager(); + public WindowManagerPolicy makeNewWindowManager(IDeviceHandler device); public FallbackEventHandler makeNewFallbackEventHandler(Context context); } diff --git a/core/java/com/android/internal/policy/PolicyManager.java b/core/java/com/android/internal/policy/PolicyManager.java index 5274e54..8b09564 100644 --- a/core/java/com/android/internal/policy/PolicyManager.java +++ b/core/java/com/android/internal/policy/PolicyManager.java @@ -22,6 +22,7 @@ import android.view.LayoutInflater; import android.view.Window; import android.view.WindowManagerPolicy; +import com.android.internal.os.IDeviceHandler; import com.android.internal.policy.IPolicy; /** @@ -63,8 +64,8 @@ public final class PolicyManager { return sPolicy.makeNewLayoutInflater(context); } - public static WindowManagerPolicy makeNewWindowManager() { - return sPolicy.makeNewWindowManager(); + public static WindowManagerPolicy makeNewWindowManager(IDeviceHandler device) { + return sPolicy.makeNewWindowManager(device); } public static FallbackEventHandler makeNewFallbackEventHandler(Context context) { diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index da35002..3fdd1d2 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1092,20 +1092,14 @@ the GPU to handle. --> <integer name="config_wallpaperMaxWidth">-1</integer> - <!-- Asus dock compatibility disabled by default --> - <bool name="config_hasDockBattery">false</bool> + <!-- Name of that dock battery handler class --> + <string name="config_deviceDockBatteryHandlerClass" translatable="false"></string> <!-- LUN file to be used by legacy USB manager. The existence of this file will be used to determine in the legacy USB manager should be started. --> <string name="config_legacyUmsLunFile">/sys/devices/platform/usb_mass_storage/lun0/file</string> - <!-- Path to the library that contains a device specific key handler --> - <string name="config_deviceKeyHandlerLib" translatable="false"></string> - - <!-- Name of that key handler class --> - <string name="config_deviceKeyHandlerClass" translatable="false"></string> - <!-- If a dock provides a lid switch, that lid can be removed. This setting is used to determine, whether lidOpenRotation has to be applied. --> @@ -1114,4 +1108,20 @@ <!-- If true, adds support for no delay A2DP in Samsung devices --> <bool name="config_noDelayInATwoDP">false</bool> + <!-- Dock battery compatibility (disabled by default) --> + <bool name="config_hasDockBattery">false</bool> + + <!-- The list absolute paths of jar/apk files containing the device specific handlers, + delimited by File.pathSeparator, which defaults to ":" on Android --> + <string name="config_deviceHandlersLib" translatable="false"></string> + + <!-- Full qualified name of the class that implements + com.android.internal.os.DeviceKeyHandler interface. --> + <string name="config_deviceKeyHandlerClass" translatable="false"></string> + + <!-- Full qualified name of the class that implements + com.android.internal.os.DeviceDockBatteryHandler interface. + Requires config_hasDockBattery set to true. --> + <string name="config_deviceDockBatteryHandlerLib" translatable="false"></string> + </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index cfaf3a2..9a14fb7 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1840,8 +1840,6 @@ <java-symbol type="bool" name="config_hasRemovableLid" /> <java-symbol type="bool" name="config_hasDockBattery" /> <java-symbol type="bool" name="config_noDelayInATwoDP" /> - <java-symbol type="string" name="config_deviceKeyHandlerLib" /> - <java-symbol type="string" name="config_deviceKeyHandlerClass" /> <!-- Telephony --> <java-symbol type="bool" name="config_smsSamsungCdmaAlternateMessageIDEncoding" /> @@ -1901,4 +1899,9 @@ <!-- Wifi --> <java-symbol type="bool" name="config_wifiApStartInterface" /> <java-symbol type="bool" name="config_wifiApFirmwareReload" /> + + <!-- Device specific handlers --> + <java-symbol type="string" name="config_deviceHandlersLib" /> + <java-symbol type="string" name="config_deviceKeyHandlerClass" /> + <java-symbol type="string" name="config_deviceDockBatteryHandlerClass" /> </resources> diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim0.png Binary files differnew file mode 100644 index 0000000..51f8f2f --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim100.png Binary files differnew file mode 100644 index 0000000..d43e7c9 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim100.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim15.png Binary files differnew file mode 100644 index 0000000..8827ae8 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim15.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim28.png Binary files differnew file mode 100644 index 0000000..26a0b2e --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim28.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim43.png Binary files differnew file mode 100644 index 0000000..519437b --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim43.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim57.png Binary files differnew file mode 100644 index 0000000..8f44b53 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim57.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim71.png Binary files differnew file mode 100644 index 0000000..52c55af --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim71.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim85.png Binary files differnew file mode 100644 index 0000000..70fa203 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_charge_min_anim85.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_icon.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_icon.png Binary files differnew file mode 100644 index 0000000..0405006 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_icon.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_0.png Binary files differnew file mode 100644 index 0000000..8315123 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_100.png Binary files differnew file mode 100644 index 0000000..1be1d88 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_100.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_15.png Binary files differnew file mode 100644 index 0000000..49583cc --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_15.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_28.png Binary files differnew file mode 100644 index 0000000..8dfeb7f --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_28.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_43.png Binary files differnew file mode 100644 index 0000000..f172005 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_43.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_57.png Binary files differnew file mode 100644 index 0000000..49f733f --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_57.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_71.png Binary files differnew file mode 100644 index 0000000..d1b94a6 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_71.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_85.png Binary files differnew file mode 100644 index 0000000..0a99fe2 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_kb_battery_min_85.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim0.png Binary files differnew file mode 100644 index 0000000..47d9077 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim100.png Binary files differnew file mode 100644 index 0000000..45b8f52 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim100.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim15.png Binary files differnew file mode 100644 index 0000000..01328dd --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim15.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim28.png Binary files differnew file mode 100644 index 0000000..2fcfc5c --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim28.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim43.png Binary files differnew file mode 100644 index 0000000..b4a86bb --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim43.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim57.png Binary files differnew file mode 100644 index 0000000..dc600d5 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim57.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim71.png Binary files differnew file mode 100644 index 0000000..e1a4f49 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim71.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim85.png Binary files differnew file mode 100644 index 0000000..1389c50 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_charge_min_anim85.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_icon.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_icon.png Binary files differnew file mode 100644 index 0000000..ba8d71b --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_icon.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_0.png Binary files differnew file mode 100644 index 0000000..50c91e9 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_100.png Binary files differnew file mode 100644 index 0000000..9fadfe8 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_100.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_15.png Binary files differnew file mode 100644 index 0000000..f9879a9 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_15.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_28.png Binary files differnew file mode 100644 index 0000000..5f780ec --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_28.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_43.png Binary files differnew file mode 100644 index 0000000..534043e --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_43.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_57.png Binary files differnew file mode 100644 index 0000000..047a2b5 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_57.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_71.png Binary files differnew file mode 100644 index 0000000..8d64d3e --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_71.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_85.png Binary files differnew file mode 100644 index 0000000..bc4652e --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_kb_battery_min_85.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim0.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim0.png Binary files differnew file mode 100644 index 0000000..7c2856d --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim0.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim100.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim100.png Binary files differnew file mode 100644 index 0000000..401f534 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim100.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim15.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim15.png Binary files differnew file mode 100644 index 0000000..7437da0 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim15.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim28.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim28.png Binary files differnew file mode 100644 index 0000000..0cbc359 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim28.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim43.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim43.png Binary files differnew file mode 100644 index 0000000..537de4b --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim43.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim57.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim57.png Binary files differnew file mode 100644 index 0000000..1c5fc18 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim57.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim71.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim71.png Binary files differnew file mode 100644 index 0000000..ebf6a34 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim71.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim85.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim85.png Binary files differnew file mode 100644 index 0000000..253ad48 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_charge_min_anim85.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_0.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_0.png Binary files differnew file mode 100644 index 0000000..cee09ec --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_0.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_100.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_100.png Binary files differnew file mode 100644 index 0000000..3bd6fc2 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_100.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_15.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_15.png Binary files differnew file mode 100644 index 0000000..3ead40a --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_15.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_28.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_28.png Binary files differnew file mode 100644 index 0000000..4ce926b --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_28.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_43.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_43.png Binary files differnew file mode 100644 index 0000000..f01f6b8 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_43.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_57.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_57.png Binary files differnew file mode 100644 index 0000000..73f0d54 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_57.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_71.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_71.png Binary files differnew file mode 100644 index 0000000..a2074dd --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_71.png diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_85.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_85.png Binary files differnew file mode 100644 index 0000000..30e19c9 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/stat_sys_kb_battery_min_85.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim0.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim0.png Binary files differnew file mode 100644 index 0000000..7791c7e --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim0.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim100.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim100.png Binary files differnew file mode 100644 index 0000000..0aaa70a --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim100.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim15.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim15.png Binary files differnew file mode 100644 index 0000000..614601d --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim15.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim28.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim28.png Binary files differnew file mode 100644 index 0000000..8690413 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim28.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim43.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim43.png Binary files differnew file mode 100644 index 0000000..81835f0 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim43.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim57.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim57.png Binary files differnew file mode 100644 index 0000000..4c62c02 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim57.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim71.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim71.png Binary files differnew file mode 100644 index 0000000..f58c769 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim71.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim85.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim85.png Binary files differnew file mode 100644 index 0000000..93398a9 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_charge_min_anim85.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_0.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_0.png Binary files differnew file mode 100644 index 0000000..3d78fb7 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_0.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_100.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_100.png Binary files differnew file mode 100644 index 0000000..db00469 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_100.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_15.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_15.png Binary files differnew file mode 100644 index 0000000..baa9099 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_15.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_28.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_28.png Binary files differnew file mode 100644 index 0000000..e45f245 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_28.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_43.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_43.png Binary files differnew file mode 100644 index 0000000..3847faf --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_43.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_57.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_57.png Binary files differnew file mode 100644 index 0000000..5a0f1a1 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_57.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_71.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_71.png Binary files differnew file mode 100644 index 0000000..2f1c574 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_71.png diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_85.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_85.png Binary files differnew file mode 100644 index 0000000..04d3ab9 --- /dev/null +++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/stat_sys_kb_battery_min_85.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim0.png Binary files differnew file mode 100644 index 0000000..c3ef421 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim100.png Binary files differnew file mode 100644 index 0000000..133e238 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim100.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim15.png Binary files differnew file mode 100644 index 0000000..41d1eb2e --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim15.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim28.png Binary files differnew file mode 100644 index 0000000..255939d --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim28.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim43.png Binary files differnew file mode 100644 index 0000000..4b7a183 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim43.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim57.png Binary files differnew file mode 100644 index 0000000..04312d0 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim57.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim71.png Binary files differnew file mode 100644 index 0000000..63ceeb8 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim71.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim85.png Binary files differnew file mode 100644 index 0000000..07e1fb4 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_charge_min_anim85.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_icon.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_icon.png Binary files differnew file mode 100644 index 0000000..4bfdd0f --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_icon.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_0.png Binary files differnew file mode 100644 index 0000000..e638da9 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_100.png Binary files differnew file mode 100644 index 0000000..65bd4fe --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_100.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_15.png Binary files differnew file mode 100644 index 0000000..c97af71 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_15.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_28.png Binary files differnew file mode 100644 index 0000000..1a138f3 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_28.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_43.png Binary files differnew file mode 100644 index 0000000..92e1b7c --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_43.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_57.png Binary files differnew file mode 100644 index 0000000..c4700d6 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_57.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_71.png Binary files differnew file mode 100644 index 0000000..13871fd --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_71.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_85.png Binary files differnew file mode 100644 index 0000000..100dac9 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_kb_battery_min_85.png diff --git a/packages/SystemUI/res/drawable/stat_sys_kb_battery_charge.xml b/packages/SystemUI/res/drawable/stat_sys_kb_battery_charge.xml index 9f64b1a..300657b 100644 --- a/packages/SystemUI/res/drawable/stat_sys_kb_battery_charge.xml +++ b/packages/SystemUI/res/drawable/stat_sys_kb_battery_charge.xml @@ -1,20 +1,18 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 2011, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2007 The Android Open Source Project + Copyright (C) 2013 The CyanogenMod Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> diff --git a/packages/SystemUI/res/drawable/stat_sys_kb_battery_charge_min.xml b/packages/SystemUI/res/drawable/stat_sys_kb_battery_charge_min.xml new file mode 100644 index 0000000..d13c4ad --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_kb_battery_charge_min.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2007 The Android Open Source Project + Copyright (C) 2013 The CyanogenMod Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<level-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:maxLevel="4" android:drawable="@drawable/stat_sys_kb_battery_charge_min_anim0" /> + <item android:maxLevel="15" android:drawable="@drawable/stat_sys_kb_battery_charge_min_anim15" /> + <item android:maxLevel="35" android:drawable="@drawable/stat_sys_kb_battery_charge_min_anim28" /> + <item android:maxLevel="49" android:drawable="@drawable/stat_sys_kb_battery_charge_min_anim43" /> + <item android:maxLevel="60" android:drawable="@drawable/stat_sys_kb_battery_charge_min_anim57" /> + <item android:maxLevel="75" android:drawable="@drawable/stat_sys_kb_battery_charge_min_anim71" /> + <item android:maxLevel="90" android:drawable="@drawable/stat_sys_kb_battery_charge_min_anim85" /> + <item android:maxLevel="100" android:drawable="@drawable/stat_sys_kb_battery_charge_min_anim100" /> +</level-list> diff --git a/packages/SystemUI/res/drawable/stat_sys_kb_battery_min.xml b/packages/SystemUI/res/drawable/stat_sys_kb_battery_min.xml new file mode 100644 index 0000000..68d363a --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_kb_battery_min.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/res/drawable/stat_sys_battery.xml +** +** Copyright 2007, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<level-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:maxLevel="4" android:drawable="@drawable/stat_sys_kb_battery_min_0" /> + <item android:maxLevel="15" android:drawable="@drawable/stat_sys_kb_battery_min_15" /> + <item android:maxLevel="35" android:drawable="@drawable/stat_sys_kb_battery_min_28" /> + <item android:maxLevel="49" android:drawable="@drawable/stat_sys_kb_battery_min_43" /> + <item android:maxLevel="60" android:drawable="@drawable/stat_sys_kb_battery_min_57" /> + <item android:maxLevel="75" android:drawable="@drawable/stat_sys_kb_battery_min_71" /> + <item android:maxLevel="90" android:drawable="@drawable/stat_sys_kb_battery_min_85" /> + <item android:maxLevel="100" android:drawable="@drawable/stat_sys_kb_battery_min_100" /> +</level-list> diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index 36273db..deada5d 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -107,15 +107,24 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:singleLine="true" - android:paddingLeft="4dip" - android:layout_marginRight="-3dip" + android:paddingLeft="@dimen/status_bar_battery_cluster_padding" + android:layout_marginRight="@dimen/status_bar_battery_cluster_text_margin" android:gravity="center_vertical|left" /> <ImageView android:id="@+id/dock_battery" android:layout_height="wrap_content" android:layout_width="wrap_content" - android:paddingLeft="4dip" + android:paddingLeft="@dimen/status_bar_battery_cluster_padding" + /> + <com.android.systemui.statusbar.policy.CircleDockBattery + android:id="@+id/circle_dock_battery" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.StatusBar.Battery" + android:singleLine="true" + android:gravity="bottom" + android:paddingLeft="@dimen/status_bar_battery_cluster_padding" /> <TextView android:id="@+id/battery_text" @@ -123,15 +132,15 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:singleLine="true" - android:paddingLeft="4dip" - android:layout_marginRight="-3dip" + android:paddingLeft="@dimen/status_bar_battery_cluster_padding" + android:layout_marginRight="@dimen/status_bar_battery_cluster_text_margin" android:gravity="left|center_vertical" /> <ImageView android:id="@+id/battery" android:layout_height="wrap_content" android:layout_width="wrap_content" - android:paddingLeft="4dip" + android:paddingLeft="@dimen/status_bar_battery_cluster_padding" /> <com.android.systemui.statusbar.policy.CircleBattery android:id="@+id/circle_battery" @@ -140,7 +149,7 @@ android:textAppearance="@style/TextAppearance.StatusBar.Battery" android:singleLine="true" android:gravity="bottom" - android:paddingLeft="4dip" + android:paddingLeft="@dimen/status_bar_battery_cluster_padding" /> </LinearLayout> diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index fc80f5c..1b9518a 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -51,4 +51,9 @@ <!-- How far to slide the panel out when you touch it --> <!-- On tablets this is just the close_handle_height --> <dimen name="peek_height">@dimen/close_handle_height</dimen> + + <!-- The padding of the items of the battery cluster --> + <dimen name="status_bar_battery_cluster_padding">4dip</dimen> + <!-- The margin adjusment of the text items of the battery cluster --> + <dimen name="status_bar_battery_cluster_text_margin">-3dip</dimen> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index f4ee1c8..8cd90b7 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -211,4 +211,9 @@ <!-- How far to slide the panel out when you touch it --> <!-- For phones, this is close_handle_height + header_height --> <dimen name="peek_height">84dp</dimen> + + <!-- The padding of the items of the battery cluster --> + <dimen name="status_bar_battery_cluster_padding">2dip</dimen> + <!-- The margin adjusment of the text items of the battery cluster --> + <dimen name="status_bar_battery_cluster_text_margin">-1dip</dimen> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 26972c4..b7116b8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.List; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -609,12 +610,18 @@ public class PhoneStatusBar extends BaseStatusBar { if (mHasDockBattery) { mDockBatteryController = new DockBatteryController(mContext); - mDockBatteryController.addIconView((ImageView)mStatusBarView.findViewById(R.id.dock_battery)); + mDockBatteryController.addIconView( + (ImageView)mStatusBarView.findViewById(R.id.dock_battery)); mDockBatteryController.addLabelView( (TextView)mStatusBarView.findViewById(R.id.dock_battery_text)); } else { - mStatusBarView.findViewById(R.id.dock_battery).setVisibility(View.GONE); - mStatusBarView.findViewById(R.id.dock_battery_text).setVisibility(View.GONE); + // Remove dock battery icons if device doesn't hava dock battery support + View v = mStatusBarView.findViewById(R.id.dock_battery); + if (v != null) mStatusBarView.removeView(v); + v = mStatusBarView.findViewById(R.id.dock_battery_text); + if (v != null) mStatusBarView.removeView(v); + v = mStatusBarView.findViewById(R.id.circle_dock_battery); + if (v != null) mStatusBarView.removeView(v); } mNetworkController = new NetworkController(mContext); @@ -2109,32 +2116,57 @@ public class PhoneStatusBar extends BaseStatusBar { final View battery = mStatusBarView.findViewById(R.id.battery); final View battery2 = mStatusBarView.findViewById(R.id.battery_text); final View battery3 = mStatusBarView.findViewById(R.id.circle_battery); + final View dockBattery = mStatusBarView.findViewById(R.id.dock_battery); + final View dockBattery2 = mStatusBarView.findViewById(R.id.dock_battery_text); + final View dockBattery3 = mStatusBarView.findViewById(R.id.circle_dock_battery); final View clock = mStatusBarView.findViewById(R.id.clock); + List<ObjectAnimator> lightsOutObjs = new ArrayList<ObjectAnimator>(); + lightsOutObjs.add(ObjectAnimator.ofFloat(notifications, View.ALPHA, 0)); + lightsOutObjs.add(ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 0)); + lightsOutObjs.add(ObjectAnimator.ofFloat(signal, View.ALPHA, 0)); + lightsOutObjs.add(ObjectAnimator.ofFloat(signal2, View.ALPHA, 0)); + lightsOutObjs.add(ObjectAnimator.ofFloat(battery, View.ALPHA, 0.5f)); + lightsOutObjs.add(ObjectAnimator.ofFloat(battery2, View.ALPHA, 0.5f)); + lightsOutObjs.add(ObjectAnimator.ofFloat(battery3, View.ALPHA, 0.5f)); + if (dockBattery != null) { + lightsOutObjs.add(ObjectAnimator.ofFloat(dockBattery, View.ALPHA, 0.5f)); + } + if (dockBattery2 != null) { + lightsOutObjs.add(ObjectAnimator.ofFloat(dockBattery2, View.ALPHA, 0.5f)); + } + if (dockBattery3 != null) { + lightsOutObjs.add(ObjectAnimator.ofFloat(dockBattery3, View.ALPHA, 0.5f)); + } + lightsOutObjs.add(ObjectAnimator.ofFloat(clock, View.ALPHA, 0.5f)); + + List<ObjectAnimator> lightsOnObjs = new ArrayList<ObjectAnimator>(); + lightsOnObjs.add(ObjectAnimator.ofFloat(notifications, View.ALPHA, 1)); + lightsOnObjs.add(ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 1)); + lightsOnObjs.add(ObjectAnimator.ofFloat(signal, View.ALPHA, 1)); + lightsOnObjs.add(ObjectAnimator.ofFloat(signal2, View.ALPHA, 1)); + lightsOnObjs.add(ObjectAnimator.ofFloat(battery, View.ALPHA, 1)); + lightsOnObjs.add(ObjectAnimator.ofFloat(battery2, View.ALPHA, 1)); + lightsOnObjs.add(ObjectAnimator.ofFloat(battery3, View.ALPHA, 1)); + if (dockBattery != null) { + lightsOnObjs.add(ObjectAnimator.ofFloat(dockBattery, View.ALPHA, 1)); + } + if (dockBattery2 != null) { + lightsOnObjs.add(ObjectAnimator.ofFloat(dockBattery2, View.ALPHA, 1)); + } + if (dockBattery3 != null) { + lightsOnObjs.add(ObjectAnimator.ofFloat(dockBattery3, View.ALPHA, 1)); + } + lightsOnObjs.add(ObjectAnimator.ofFloat(clock, View.ALPHA, 1)); + final AnimatorSet lightsOutAnim = new AnimatorSet(); lightsOutAnim.playTogether( - ObjectAnimator.ofFloat(notifications, View.ALPHA, 0), - ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 0), - ObjectAnimator.ofFloat(signal, View.ALPHA, 0), - ObjectAnimator.ofFloat(signal2, View.ALPHA, 0), - ObjectAnimator.ofFloat(battery, View.ALPHA, 0.5f), - ObjectAnimator.ofFloat(battery2, View.ALPHA, 0.5f), - ObjectAnimator.ofFloat(battery3, View.ALPHA, 0.5f), - ObjectAnimator.ofFloat(clock, View.ALPHA, 0.5f) - ); + lightsOutObjs.toArray(new ObjectAnimator[lightsOutObjs.size()])); lightsOutAnim.setDuration(750); final AnimatorSet lightsOnAnim = new AnimatorSet(); lightsOnAnim.playTogether( - ObjectAnimator.ofFloat(notifications, View.ALPHA, 1), - ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 1), - ObjectAnimator.ofFloat(signal, View.ALPHA, 1), - ObjectAnimator.ofFloat(signal2, View.ALPHA, 1), - ObjectAnimator.ofFloat(battery, View.ALPHA, 1), - ObjectAnimator.ofFloat(battery2, View.ALPHA, 1), - ObjectAnimator.ofFloat(battery3, View.ALPHA, 1), - ObjectAnimator.ofFloat(clock, View.ALPHA, 1) - ); + lightsOnObjs.toArray(new ObjectAnimator[lightsOnObjs.size()])); lightsOnAnim.setDuration(250); mLightsOutAnimation = lightsOutAnim; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java index 287d388..95fede4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java @@ -18,7 +18,6 @@ package com.android.systemui.statusbar.policy; import java.util.ArrayList; -import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; @@ -28,7 +27,6 @@ import android.database.ContentObserver; import android.os.BatteryManager; import android.os.Handler; import android.provider.Settings; -import android.util.Slog; import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -42,8 +40,8 @@ public class BatteryController extends BroadcastReceiver { private ArrayList<ImageView> mIconViews = new ArrayList<ImageView>(); private ArrayList<TextView> mLabelViews = new ArrayList<TextView>(); - private static final int BATTERY_STYLE_NORMAL = 0; - private static final int BATTERY_STYLE_PERCENT = 1; + public static final int BATTERY_STYLE_NORMAL = 0; + public static final int BATTERY_STYLE_PERCENT = 1; /*** * BATTERY_STYLE_CIRCLE* cannot be handled in this controller, since we cannot get views from * statusbar here. Yet it is listed for completion and not to confuse at future updates @@ -51,21 +49,17 @@ public class BatteryController extends BroadcastReceiver { * * set to public to be reused by CircleBattery */ - public static final int BATTERY_STYLE_CIRCLE = 2; - public static final int BATTERY_STYLE_CIRCLE_PERCENT = 3; - private static final int BATTERY_STYLE_GONE = 4; + public static final int BATTERY_STYLE_CIRCLE = 2; + public static final int BATTERY_STYLE_CIRCLE_PERCENT = 3; + public static final int BATTERY_STYLE_GONE = 4; - private static final int BATTERY_ICON_STYLE_NORMAL = R.drawable.stat_sys_battery; - private static final int BATTERY_ICON_STYLE_CHARGE = R.drawable.stat_sys_battery_charge; - private static final int BATTERY_ICON_STYLE_NORMAL_MIN = R.drawable.stat_sys_battery_min; - private static final int BATTERY_ICON_STYLE_CHARGE_MIN = R.drawable.stat_sys_battery_charge_min; private static final int BATTERY_TEXT_STYLE_NORMAL = R.string.status_bar_settings_battery_meter_format; private static final int BATTERY_TEXT_STYLE_MIN = R.string.status_bar_settings_battery_meter_min_format; private boolean mBatteryPlugged = false; + private int mBatteryStatus = BatteryManager.BATTERY_STATUS_UNKNOWN; private int mBatteryStyle; - private int mBatteryIcon = BATTERY_ICON_STYLE_NORMAL; Handler mHandler; @@ -94,7 +88,6 @@ public class BatteryController extends BroadcastReceiver { public BatteryController(Context context) { mContext = context; - mHandler = new Handler(); SettingsObserver settingsObserver = new SettingsObserver(mHandler); @@ -103,7 +96,7 @@ public class BatteryController extends BroadcastReceiver { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); - context.registerReceiver(this, filter); + mContext.registerReceiver(this, filter); } public void addIconView(ImageView v) { @@ -118,46 +111,101 @@ public class BatteryController extends BroadcastReceiver { mChangeCallbacks.add(cb); } + // Allow override battery icons + public int getIconStyleUnknown() { + return R.drawable.stat_sys_battery; + } + public int getIconStyleNormal() { + return R.drawable.stat_sys_battery; + } + public int getIconStyleCharge() { + return R.drawable.stat_sys_battery_charge; + } + public int getIconStyleNormalMin() { + return R.drawable.stat_sys_battery_min; + } + public int getIconStyleChargeMin() { + return R.drawable.stat_sys_battery_charge_min; + } + + protected int getBatteryStyle() { + return mBatteryStyle; + } + + protected int getBatteryStatus() { + return mBatteryStatus; + } + + protected boolean isBatteryPlugged() { + return mBatteryPlugged; + } + + protected boolean isBatteryPresent() { + // the battery widget always is shown. + return true; + } + + private boolean isBatteryStatusUnknown() { + return getBatteryStatus() == BatteryManager.BATTERY_STATUS_UNKNOWN; + } + + private boolean isBatteryStatusCharging() { + return getBatteryStatus() == BatteryManager.BATTERY_STATUS_CHARGING; + } + public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { final int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); mBatteryPlugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0; - int N = mIconViews.size(); - for (int i=0; i<N; i++) { - ImageView v = mIconViews.get(i); - v.setImageLevel(level); - v.setContentDescription(mContext.getString(R.string.accessibility_battery_level, - level)); - } - N = mLabelViews.size(); - for (int i=0; i<N; i++) { - TextView v = mLabelViews.get(i); - v.setText(mContext.getString(BATTERY_TEXT_STYLE_MIN, - level)); - } - - for (BatteryStateChangeCallback cb : mChangeCallbacks) { - cb.onBatteryLevelChanged(level, mBatteryPlugged); - } + mBatteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, + BatteryManager.BATTERY_STATUS_UNKNOWN); + updateViews(level); updateBattery(); } } - private void updateBattery() { + protected void updateViews(int level) { + int N = mIconViews.size(); + for (int i=0; i<N; i++) { + ImageView v = mIconViews.get(i); + v.setImageLevel(level); + v.setContentDescription(mContext.getString(R.string.accessibility_battery_level, + level)); + } + N = mLabelViews.size(); + for (int i=0; i<N; i++) { + TextView v = mLabelViews.get(i); + v.setText(mContext.getString(BATTERY_TEXT_STYLE_MIN, + level)); + } + + for (BatteryStateChangeCallback cb : mChangeCallbacks) { + cb.onBatteryLevelChanged(level, isBatteryStatusCharging()); + } + } + + protected void updateBattery() { int mIcon = View.GONE; int mText = View.GONE; - int mIconStyle = BATTERY_ICON_STYLE_NORMAL; - - if (mBatteryStyle == BATTERY_STYLE_NORMAL) { - mIcon = (View.VISIBLE); - mIconStyle = mBatteryPlugged ? BATTERY_ICON_STYLE_CHARGE - : BATTERY_ICON_STYLE_NORMAL; - } else if (mBatteryStyle == BATTERY_STYLE_PERCENT) { - mIcon = (View.VISIBLE); - mText = (View.VISIBLE); - mIconStyle = mBatteryPlugged ? BATTERY_ICON_STYLE_CHARGE_MIN - : BATTERY_ICON_STYLE_NORMAL_MIN; + int mIconStyle = getIconStyleNormal(); + + if (isBatteryPresent()) { + if ( isBatteryStatusUnknown() && + (mBatteryStyle == BATTERY_STYLE_NORMAL || mBatteryStyle == BATTERY_STYLE_PERCENT)) { + // Unknown status doesn't relies on any style + mIcon = (View.VISIBLE); + mIconStyle = getIconStyleUnknown(); + } else if (mBatteryStyle == BATTERY_STYLE_NORMAL) { + mIcon = (View.VISIBLE); + mIconStyle = isBatteryStatusCharging() ? + getIconStyleCharge() : getIconStyleNormal(); + } else if (mBatteryStyle == BATTERY_STYLE_PERCENT) { + mIcon = (View.VISIBLE); + mText = (View.VISIBLE); + mIconStyle = isBatteryStatusCharging() ? + getIconStyleChargeMin() : getIconStyleNormalMin(); + } } int N = mIconViews.size(); @@ -175,9 +223,8 @@ public class BatteryController extends BroadcastReceiver { private void updateSettings() { ContentResolver resolver = mContext.getContentResolver(); - mBatteryStyle = (Settings.System.getInt(resolver, - Settings.System.STATUS_BAR_BATTERY, 0)); + Settings.System.STATUS_BAR_BATTERY, BATTERY_STYLE_NORMAL)); updateBattery(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleBattery.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleBattery.java index e521b02..01178c0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleBattery.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleBattery.java @@ -44,7 +44,7 @@ import com.android.internal.R; /*** * Note about CircleBattery Implementation: * - * Unfortunately, we cannot use BatteryController or DockBatteryController here, + * Unfortunately, we cannot use BatteryController here, * since communication between controller and this view is not possible without * huge changes. As a result, this Class is doing everything by itself, * monitoring battery level and battery settings. @@ -59,22 +59,18 @@ public class CircleBattery extends ImageView { private boolean mAttached; // whether or not attached to a window private boolean mActivated; // whether or not activated due to system settings private boolean mPercentage; // whether or not to show percentage number - private boolean mIsCharging; // whether or not device is currently charging + private boolean mBatteryPlugged;// whether or not battery is currently plugged + private int mBatteryStatus; // current battery status private int mLevel; // current battery level private int mAnimOffset; // current level of charging animation private boolean mIsAnimating; // stores charge-animation status to reliably remove callbacks - private int mDockLevel; // current dock battery level - private boolean mDockIsCharging;// whether or not dock battery is currently charging - private boolean mIsDocked = false; // whether or not dock battery is connected private int mCircleSize; // draw size of circle. read rather complicated from // another status bar icon, so it fits the icon size // no matter the dps and resolution private RectF mRectLeft; // contains the precalculated rect used in drawArc(), derived from mCircleSize - private RectF mRectRight; // contains the precalculated rect used in drawArc() for dock battery private Float mTextLeftX; // precalculated x position for drawText() to appear centered private Float mTextY; // precalculated y position for drawText() to appear vertical-centered - private Float mTextRightX; // precalculated x position for dock battery drawText() // quiet a lot of paint variables. helps to move cpu-usage from actual drawing to initialization private Paint mPaintFont; @@ -112,7 +108,7 @@ public class CircleBattery extends ImageView { mActivated = (batteryStyle == BatteryController.BATTERY_STYLE_CIRCLE || batteryStyle == BatteryController.BATTERY_STYLE_CIRCLE_PERCENT); mPercentage = (batteryStyle == BatteryController.BATTERY_STYLE_CIRCLE_PERCENT); - setVisibility(mActivated ? View.VISIBLE : View.GONE); + setVisibility(mActivated && isBatteryPresent() ? View.VISIBLE : View.GONE); if (mBatteryReceiver != null) { mBatteryReceiver.updateRegistration(); } @@ -134,13 +130,16 @@ public class CircleBattery extends ImageView { public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { - mLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); - mIsCharging = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0; + onBatteryStatusChange(intent); + + int visibility = mActivated && isBatteryPresent() ? View.VISIBLE : View.GONE; + if (getVisibility() != visibility) { + setVisibility(visibility); + } if (mActivated && mAttached) { LayoutParams l = getLayoutParams(); - l.width = mCircleSize + getPaddingLeft() - + (mIsDocked ? mCircleSize + getPaddingLeft() : 0); + l.width = mCircleSize + getPaddingLeft(); setLayoutParams(l); invalidate(); @@ -208,6 +207,10 @@ public class CircleBattery extends ImageView { mPaintSystem = new Paint(mPaintFont); mPaintRed = new Paint(mPaintFont); + mPaintGray.setStrokeCap(Paint.Cap.BUTT); + mPaintSystem.setStrokeCap(Paint.Cap.BUTT); + mPaintRed.setStrokeCap(Paint.Cap.BUTT); + mPaintFont.setColor(res.getColor(R.color.holo_blue_dark)); mPaintSystem.setColor(res.getColor(R.color.holo_blue_dark)); // could not find the darker definition anywhere in resources @@ -220,6 +223,38 @@ public class CircleBattery extends ImageView { mPaintFont.setFakeBoldText(true); } + protected int getLevel() { + return mLevel; + } + + protected int getBatteryStatus() { + return mBatteryStatus; + } + + protected boolean isBatteryPlugged() { + return mBatteryPlugged; + } + + protected boolean isBatteryPresent() { + // the battery widget always is shown. + return true; + } + + private boolean isBatteryStatusUnknown() { + return getBatteryStatus() == BatteryManager.BATTERY_STATUS_UNKNOWN; + } + + private boolean isBatteryStatusCharging() { + return getBatteryStatus() == BatteryManager.BATTERY_STATUS_CHARGING; + } + + protected void onBatteryStatusChange(Intent intent) { + mLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); + mBatteryPlugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0; + mBatteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, + BatteryManager.BATTERY_STATUS_UNKNOWN); + } + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); @@ -249,21 +284,25 @@ public class CircleBattery extends ImageView { initSizeMeasureIconHeight(); } - setMeasuredDimension(mCircleSize + getPaddingLeft() - + (mIsDocked ? mCircleSize + getPaddingLeft() : 0), mCircleSize); + setMeasuredDimension(mCircleSize + getPaddingLeft(), mCircleSize); } - private void drawCircle(Canvas canvas, int level, int animOffset, float textX, RectF drawRect) { + protected void drawCircle(Canvas canvas, int level, int animOffset, float textX, RectF drawRect) { Paint usePaint = mPaintSystem; + int internalLevel = level; + boolean unknownStatus = isBatteryStatusUnknown(); // turn red at 14% - same level android battery warning appears - if (level <= 14) { + if (unknownStatus) { + usePaint = mPaintGray; + internalLevel = 100; // Draw all the circle; + } else if (internalLevel <= 14) { usePaint = mPaintRed; } // pad circle percentage to 100% once it reaches 97% // for one, the circle looks odd with a too small gap, // for another, some phones never reach 100% due to hardware design - int padLevel = level; + int padLevel = internalLevel; if (padLevel >= 97) { padLevel = 100; } @@ -274,9 +313,12 @@ public class CircleBattery extends ImageView { canvas.drawArc(drawRect, 270 + animOffset, 3.6f * padLevel, false, usePaint); // if chosen by options, draw percentage text in the middle // always skip percentage when 100, so layout doesnt break - if (level < 100 && mPercentage) { + if (unknownStatus) { + mPaintFont.setColor(usePaint.getColor()); + canvas.drawText("?", textX, mTextY, mPaintFont); + } else if (internalLevel < 100 && mPercentage) { mPaintFont.setColor(usePaint.getColor()); - canvas.drawText(Integer.toString(level), textX, mTextY, mPaintFont); + canvas.drawText(Integer.toString(internalLevel), textX, mTextY, mPaintFont); } } @@ -289,12 +331,9 @@ public class CircleBattery extends ImageView { updateChargeAnim(); - if (mIsDocked) { - drawCircle(canvas, mDockLevel, (mDockIsCharging ? mAnimOffset : 0), mTextLeftX, mRectLeft); - drawCircle(canvas, mLevel, (mIsCharging ? mAnimOffset : 0), mTextRightX, mRectRight); - } else { - drawCircle(canvas, mLevel, (mIsCharging ? mAnimOffset : 0), mTextLeftX, mRectLeft); - } + drawCircle(canvas, + getLevel(), + (isBatteryStatusCharging() ? mAnimOffset : 0), mTextLeftX, mRectLeft); } /*** @@ -303,7 +342,7 @@ public class CircleBattery extends ImageView { * uses mInvalidate for delayed invalidate() callbacks */ private void updateChargeAnim() { - if (!(mIsCharging || mDockIsCharging) || (mLevel >= 97 && mDockLevel >= 97)) { + if (!isBatteryStatusCharging() || getLevel() >= 97) { if (mIsAnimating) { mIsAnimating = false; mAnimOffset = 0; @@ -345,15 +384,11 @@ public class CircleBattery extends ImageView { int pLeft = getPaddingLeft(); mRectLeft = new RectF(pLeft + strokeWidth / 2.0f, 0 + strokeWidth / 2.0f, mCircleSize - strokeWidth / 2.0f + pLeft, mCircleSize - strokeWidth / 2.0f); - int off = pLeft + mCircleSize; - mRectRight = new RectF(mRectLeft.left + off, mRectLeft.top, mRectLeft.right + off, - mRectLeft.bottom); // calculate Y position for text Rect bounds = new Rect(); mPaintFont.getTextBounds("99", 0, "99".length(), bounds); mTextLeftX = mCircleSize / 2.0f + getPaddingLeft(); - mTextRightX = mTextLeftX + off; // the +1 at end of formular balances out rounding issues. works out on all resolutions mTextY = mCircleSize / 2.0f + (bounds.bottom - bounds.top) / 2.0f - strokeWidth / 2.0f + 1; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleDockBattery.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleDockBattery.java new file mode 100644 index 0000000..dba10b8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleDockBattery.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.os.BatteryManager; +import android.util.AttributeSet; + +import com.android.systemui.R; + +/*** + * Implementation of the CircleBattery widget adapted for listening dock battery status + * @see CircleBattery + */ + +public class CircleDockBattery extends CircleBattery { + + private int mLevel; + private int mDockBatteryStatus = BatteryManager.BATTERY_STATUS_UNKNOWN; + private boolean mBatteryPlugged = false; + private boolean mBatteryPresent = false; + + private final Context mContext; + private boolean mAttached; + + private Bitmap mDockIcon; + private Paint mPaint; + + /*** + * Start of CircleDockBattery implementation + */ + public CircleDockBattery(Context context) { + this(context, null); + } + + public CircleDockBattery(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CircleDockBattery(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mContext = context; + } + + @Override + protected void onAttachedToWindow() { + if (!mAttached) { + // Load the resource to display as dock icon + mDockIcon = BitmapFactory.decodeResource( + mContext.getResources(), + R.drawable.stat_sys_kb_battery_icon); + + // Use an anti-alias while drawing the dock icon + mPaint = new Paint(); + mPaint.setAntiAlias(true); + mPaint.setFilterBitmap(true); + mPaint.setDither(true); + + mAttached = true; + } + super.onAttachedToWindow(); + } + + @Override + protected void onDetachedFromWindow() { + if (mDockIcon != null) { + mDockIcon.recycle(); + } + mDockIcon = null; + mPaint = null; + mAttached = false; + super.onDetachedFromWindow(); + } + + @Override + protected int getLevel() { + return mLevel; + } + + @Override + protected int getBatteryStatus() { + return mDockBatteryStatus; + } + + @Override + protected boolean isBatteryPlugged() { + return mBatteryPlugged; + } + + @Override + protected boolean isBatteryPresent() { + return mBatteryPresent; + } + + @Override + protected void onBatteryStatusChange(Intent intent) { + mLevel = intent.getIntExtra(BatteryManager.EXTRA_DOCK_LEVEL, 0); + mDockBatteryStatus = intent.getIntExtra( + BatteryManager.EXTRA_DOCK_STATUS, + BatteryManager.BATTERY_STATUS_UNKNOWN); + mBatteryPlugged = intent.getIntExtra(BatteryManager.EXTRA_DOCK_PLUGGED, 0) != 0; + mBatteryPresent = intent.getBooleanExtra(BatteryManager.EXTRA_DOCK_PRESENT, false); + } + + @Override + protected void drawCircle(Canvas canvas, int level, int animOffset, float textX, RectF drawRect) { + super.drawCircle(canvas, level, animOffset, textX, drawRect); + if (mDockIcon != null) { + Rect src = new Rect(0, 0, mDockIcon.getWidth(), mDockIcon.getHeight()); + float h = getHeight() - getPaddingBottom(); + float w = getWidth() - getPaddingLeft() - getPaddingRight(); + RectF dst = new RectF( + getPaddingLeft() + (w / 2) - (src.width() / 2), + h - src.height(), + getWidth() - getPaddingRight() - (w / 2) + (src.width() / 2), + h); + canvas.drawBitmap(mDockIcon, src, dst, mPaint); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java index f022839..fae6572 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java @@ -16,151 +16,72 @@ package com.android.systemui.statusbar.policy; -import java.util.ArrayList; - -import android.content.BroadcastReceiver; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; -import android.database.ContentObserver; import android.os.BatteryManager; -import android.os.Handler; -import android.provider.Settings; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; import com.android.systemui.R; -public class DockBatteryController extends BroadcastReceiver { +public class DockBatteryController extends BatteryController { private static final String TAG = "StatusBar.DockBatteryController"; - private Context mContext; - private ArrayList<ImageView> mIconViews = new ArrayList<ImageView>(); - private ArrayList<TextView> mLabelViews = new ArrayList<TextView>(); - - private static final int BATTERY_STYLE_NORMAL = 0; - private static final int BATTERY_STYLE_TEXT = 1; - private static final int BATTERY_STYLE_HIDE = 2; - - private static final int BATTERY_ICON_STYLE_UNKNOWN = R.drawable.stat_sys_kb_battery_unknown; - private static final int BATTERY_ICON_STYLE_NORMAL = R.drawable.stat_sys_kb_battery; - private static final int BATTERY_ICON_STYLE_CHARGE = R.drawable.stat_sys_kb_battery_charge; - - private int mDockStatus = BatteryManager.DOCK_BATTERY_STATUS_UNKNOWN; - private boolean mDockPresent = false; - private int mBatteryStyle; - - private static final int BATTERY_TEXT_STYLE_MIN = - R.string.status_bar_settings_battery_meter_min_format; - - private Handler mHandler; - - class SettingsObserver extends ContentObserver { - SettingsObserver(Handler handler) { - super(handler); - } - - void observe() { - ContentResolver resolver = mContext.getContentResolver(); - resolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.STATUS_BAR_BATTERY), false, this); - } - - @Override - public void onChange(boolean selfChange) { - updateSettings(); - } - } + private int mDockBatteryStatus = BatteryManager.BATTERY_STATUS_UNKNOWN; + private boolean mBatteryPlugged = false; + private boolean mBatteryPresent = false; public DockBatteryController(Context context) { - mContext = context; - mHandler = new Handler(); - - SettingsObserver settingsObserver = new SettingsObserver(mHandler); - settingsObserver.observe(); - updateSettings(); - - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_BATTERY_CHANGED); - context.registerReceiver(this, filter); - } - - public void addIconView(ImageView v) { - mIconViews.add(v); - } - - public void addLabelView(TextView v) { - mLabelViews.add(v); + super(context); } + @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { final int level = intent.getIntExtra(BatteryManager.EXTRA_DOCK_LEVEL, 0); - mDockStatus = intent.getIntExtra(BatteryManager.EXTRA_DOCK_STATUS, - BatteryManager.DOCK_BATTERY_STATUS_UNKNOWN); - mDockPresent = intent.getBooleanExtra(BatteryManager.EXTRA_DOCK_PRESENT, - false); - - int N = mIconViews.size(); - for (int i = 0; i < N; i++) { - ImageView v = mIconViews.get(i); - v.setImageLevel(level); - v.setContentDescription(mContext.getString(R.string.accessibility_battery_level, - level)); - } - - N = mLabelViews.size(); - for (int i = 0; i < N; i++) { - TextView v = mLabelViews.get(i); - v.setText(mContext.getString(BATTERY_TEXT_STYLE_MIN, level)); - } - + mDockBatteryStatus = intent.getIntExtra( + BatteryManager.EXTRA_DOCK_STATUS, + BatteryManager.BATTERY_STATUS_UNKNOWN); + mBatteryPlugged = intent.getIntExtra(BatteryManager.EXTRA_DOCK_PLUGGED, 0) != 0; + mBatteryPresent = intent.getBooleanExtra(BatteryManager.EXTRA_DOCK_PRESENT, false); + updateViews(level); updateBattery(); } } - private void updateBattery() { - int icon = View.GONE; - int text = View.GONE; - int iconStyle = BATTERY_ICON_STYLE_UNKNOWN; - - if (mDockPresent && mBatteryStyle != BATTERY_STYLE_HIDE) { - icon = View.VISIBLE; - - if (mBatteryStyle == BATTERY_STYLE_TEXT) { - text = View.VISIBLE; - } - - if (mDockStatus == BatteryManager.DOCK_BATTERY_STATUS_NOT_CHARGING) { - iconStyle = BATTERY_ICON_STYLE_NORMAL; - } else if (mDockStatus == BatteryManager.DOCK_BATTERY_STATUS_CHARGING) { - iconStyle = BATTERY_ICON_STYLE_CHARGE; - } - } - - int N = mIconViews.size(); - for (int i = 0; i < N; i++) { - ImageView v = mIconViews.get(i); - v.setVisibility(icon); - v.setImageResource(iconStyle); - } - - N = mLabelViews.size(); - for (int i = 0; i < N; i++) { - TextView v = mLabelViews.get(i); - v.setVisibility(text); - } + @Override + public int getIconStyleUnknown() { + return R.drawable.stat_sys_kb_battery_unknown; + } + @Override + public int getIconStyleNormal() { + return R.drawable.stat_sys_kb_battery; + } + @Override + public int getIconStyleCharge() { + return R.drawable.stat_sys_kb_battery_charge; + } + @Override + public int getIconStyleNormalMin() { + return R.drawable.stat_sys_kb_battery_min; + } + @Override + public int getIconStyleChargeMin() { + return R.drawable.stat_sys_kb_battery_charge_min; } - private void updateSettings() { - ContentResolver resolver = mContext.getContentResolver(); + @Override + protected int getBatteryStatus() { + return mDockBatteryStatus; + } - mBatteryStyle = (Settings.System.getInt(resolver, - Settings.System.STATUS_BAR_BATTERY, BATTERY_STYLE_NORMAL)); + @Override + protected boolean isBatteryPlugged() { + return mBatteryPlugged; + } - updateBattery(); + @Override + protected boolean isBatteryPresent() { + return mBatteryPresent; } + } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 6ea2077..ea2a524 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -69,6 +69,7 @@ import android.provider.Settings; import com.android.internal.R; import com.android.internal.app.ThemeUtils; import com.android.internal.os.DeviceKeyHandler; +import com.android.internal.os.IDeviceHandler; import com.android.internal.policy.PolicyManager; import com.android.internal.policy.impl.keyguard.KeyguardViewManager; import com.android.internal.policy.impl.keyguard.KeyguardViewMediator; @@ -76,8 +77,6 @@ import com.android.internal.statusbar.IStatusBarService; import com.android.internal.telephony.ITelephony; import com.android.internal.widget.PointerLocationView; -import dalvik.system.DexClassLoader; - import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Log; @@ -170,7 +169,6 @@ import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.util.List; -import java.lang.reflect.Constructor; /** * WindowManagerPolicy implementation for the Android phone UI. This @@ -259,7 +257,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { KeyEvent.KEYCODE_CALCULATOR, Intent.CATEGORY_APP_CALCULATOR); } - private DeviceKeyHandler mDeviceKeyHandler; + private final DeviceKeyHandler mDeviceKeyHandler; /** * Lock protecting internal state. Must not call out into window @@ -680,6 +678,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { } MyOrientationListener mOrientationListener; + public PhoneWindowManager(IDeviceHandler device) { + mDeviceKeyHandler = (device != null) ? device.getDeviceKeyHandler() : null; + } + IStatusBarService getStatusBarService() { synchronized (mServiceAquireLock) { if (mStatusBarService == null) { @@ -1205,30 +1207,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } else { screenTurnedOff(WindowManagerPolicy.OFF_BECAUSE_OF_USER); } - - String deviceKeyHandlerLib = mContext.getResources().getString( - com.android.internal.R.string.config_deviceKeyHandlerLib); - - String deviceKeyHandlerClass = mContext.getResources().getString( - com.android.internal.R.string.config_deviceKeyHandlerClass); - - if (!deviceKeyHandlerLib.isEmpty() && !deviceKeyHandlerClass.isEmpty()) { - DexClassLoader loader = new DexClassLoader(deviceKeyHandlerLib, - new ContextWrapper(mContext).getCacheDir().getAbsolutePath(), - null, - ClassLoader.getSystemClassLoader()); - try { - Class<?> klass = loader.loadClass(deviceKeyHandlerClass); - Constructor<?> constructor = klass.getConstructor(Context.class); - mDeviceKeyHandler = (DeviceKeyHandler) constructor.newInstance( - mContext); - if(DEBUG) Slog.d(TAG, "Device key handler loaded"); - } catch (Exception e) { - Slog.w(TAG, "Could not instantiate device key handler " - + deviceKeyHandlerClass + " from class " - + deviceKeyHandlerLib, e); - } - } } public void setInitialDisplaySize(Display display, int width, int height, int density) { diff --git a/policy/src/com/android/internal/policy/impl/Policy.java b/policy/src/com/android/internal/policy/impl/Policy.java index 153ef0f..25d653f 100644 --- a/policy/src/com/android/internal/policy/impl/Policy.java +++ b/policy/src/com/android/internal/policy/impl/Policy.java @@ -23,6 +23,7 @@ import android.view.LayoutInflater; import android.view.Window; import android.view.WindowManagerPolicy; +import com.android.internal.os.IDeviceHandler; import com.android.internal.policy.IPolicy; import com.android.internal.policy.impl.PhoneLayoutInflater; import com.android.internal.policy.impl.PhoneWindow; @@ -67,8 +68,8 @@ public class Policy implements IPolicy { return new PhoneLayoutInflater(context); } - public WindowManagerPolicy makeNewWindowManager() { - return new PhoneWindowManager(); + public WindowManagerPolicy makeNewWindowManager(IDeviceHandler device) { + return new PhoneWindowManager(device); } public FallbackEventHandler makeNewFallbackEventHandler(Context context) { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMessageArea.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMessageArea.java index 792c8e2..68a9645 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMessageArea.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMessageArea.java @@ -21,6 +21,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.content.ContentResolver; import android.content.Context; +import android.os.BatteryManager; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; @@ -137,7 +138,9 @@ class KeyguardMessageArea extends TextView { private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { @Override public void onRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatus status) { - mPluggedIn = status.isPluggedIn(); + // Use the status instead of plugged attribute + mPluggedIn = status.status == BatteryManager.BATTERY_STATUS_CHARGING || + status.status == BatteryManager.BATTERY_STATUS_FULL; mBatteryLevel = status.level; mBatteryCharged = status.isCharged(); mBatteryIsLow = status.isBatteryLow(); @@ -229,7 +232,7 @@ class KeyguardMessageArea extends TextView { if (mShowingBatteryInfo && !mShowingMessage) { // Battery status if (mPluggedIn) { - // Charging, charged or waiting to charge. + // Charging, charged. string = getContext().getString(mBatteryCharged ? com.android.internal.R.string.lockscreen_charged :com.android.internal.R.string.lockscreen_plugged_in, mBatteryLevel); diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java index 5dbc2e4..08d9ffa 100644 --- a/services/java/com/android/server/BatteryService.java +++ b/services/java/com/android/server/BatteryService.java @@ -17,18 +17,23 @@ package com.android.server; import com.android.internal.app.IBatteryStats; +import com.android.internal.os.DeviceDockBatteryHandler; +import com.android.internal.os.IDeviceHandler; import com.android.server.am.BatteryStatsService; import android.app.ActivityManagerNative; +import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.Color; import android.os.BatteryManager; import android.os.Binder; +import android.os.Bundle; import android.os.FileUtils; import android.os.Handler; import android.os.IBinder; @@ -65,7 +70,7 @@ import java.util.Calendar; * <p>"present" - boolean, true if the battery is present<br /> * <p>"icon-small" - int, suggested small icon to use for this state</p> * <p>"plugged" - int, 0 if the device is not plugged in; 1 if plugged - * into an AC power adapter; 2 if plugged in via USB.</p> + * into an AC power adapter; 2 if plugged in via USB; 4 if plugged in via Wireless.</p> * <p>"voltage" - int, current battery voltage in millivolts</p> * <p>"temperature" - int, current battery temperature in tenths of * a degree Centigrade</p> @@ -129,15 +134,9 @@ public final class BatteryService extends Binder { private boolean mLastBatteryLevelCritical; private int mLastInvalidCharger; + // Device specific handler for extra dock battery private boolean mHasDockBattery; - - private int mDockBatteryStatus; - private int mDockBatteryLevel; - private boolean mDockBatteryPresent; - - private int mLastDockBatteryStatus; - private int mLastDockBatteryLevel; - private boolean mLastDockBatteryPresent; + private DeviceDockBatteryHandler mDeviceDockBattery; private int mLowBatteryWarningLevel; private int mLowBatteryCloseWarningLevel; @@ -168,7 +167,7 @@ public final class BatteryService extends Binder { private int mQuietHoursEnd = 0; private boolean mQuietHoursDim = true; - public BatteryService(Context context, LightsService lights) { + public BatteryService(Context context, LightsService lights, IDeviceHandler deviceHandler) { mContext = context; mHandler = new Handler(true /*async*/); mLed = new Led(context, lights); @@ -183,8 +182,19 @@ public final class BatteryService extends Binder { mShutdownBatteryTemperature = mContext.getResources().getInteger( com.android.internal.R.integer.config_shutdownBatteryTemperature); + // Has Dock battery? and device specific handler? mHasDockBattery = mContext.getResources().getBoolean( com.android.internal.R.bool.config_hasDockBattery); + if (mHasDockBattery) { + if (deviceHandler != null) { + mDeviceDockBattery = deviceHandler.getDeviceDockBatteryHandler(); + + // Force an update of the data when dock state change + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_DOCK_EVENT); + context.registerReceiver(mDockReceiver, filter); + } + } mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply"); @@ -226,6 +236,7 @@ public final class BatteryService extends Binder { if (mBatteryStatus == BatteryManager.BATTERY_STATUS_UNKNOWN) { return true; } + // mAcOnline is used for main ac and dock battery ac if ((plugTypeSet & BatteryManager.BATTERY_PLUGGED_AC) != 0 && mAcOnline) { return true; } @@ -306,6 +317,9 @@ public final class BatteryService extends Binder { if (!mUpdatesStopped) { // Update the values of mAcOnline, et. all. native_update(); + if (mDeviceDockBattery != null) { + mDeviceDockBattery.update(); + } // Process the new values. processValuesLocked(); @@ -316,8 +330,14 @@ public final class BatteryService extends Binder { boolean logOutlier = false; long dischargeDuration = 0; + // Process the dock battery values + if (mDeviceDockBattery != null) { + mDeviceDockBattery.process(); + } + mBatteryLevelCritical = (mBatteryLevel <= mCriticalBatteryLevel); - if (mAcOnline) { + if (mAcOnline || + (mDeviceDockBattery != null && mDeviceDockBattery.isPlugged())) { mPlugType = BatteryManager.BATTERY_PLUGGED_AC; } else if (mUsbOnline) { mPlugType = BatteryManager.BATTERY_PLUGGED_USB; @@ -328,6 +348,7 @@ public final class BatteryService extends Binder { } if (DEBUG) { + String dockValues = String.valueOf(mDeviceDockBattery); Slog.d(TAG, "Processing new values: " + "mAcOnline=" + mAcOnline + ", mUsbOnline=" + mUsbOnline @@ -340,7 +361,9 @@ public final class BatteryService extends Binder { + ", mBatteryVoltage=" + mBatteryVoltage + ", mBatteryTemperature=" + mBatteryTemperature + ", mBatteryLevelCritical=" + mBatteryLevelCritical - + ", mPlugType=" + mPlugType); + + ", mPlugType=" + mPlugType + + ", mHasDockBattery=" + mHasDockBattery + + ", mDeviceDockBattery=[" + dockValues + "]"); } // Let the battery stats keep track of the current level. @@ -355,12 +378,9 @@ public final class BatteryService extends Binder { shutdownIfNoPowerLocked(); shutdownIfOverTempLocked(); - boolean dockBatteryChanged = false; - if (mHasDockBattery && - (mDockBatteryLevel != mLastDockBatteryLevel || - mDockBatteryStatus != mLastDockBatteryStatus || - mDockBatteryPresent != mLastDockBatteryPresent)) { - dockBatteryChanged = true; + boolean dockBatteryHasNewData = false; + if (mDeviceDockBattery != null) { + dockBatteryHasNewData = mDeviceDockBattery.hasNewData(); } if (mBatteryStatus != mLastBatteryStatus || @@ -371,7 +391,7 @@ public final class BatteryService extends Binder { mBatteryVoltage != mLastBatteryVoltage || mBatteryTemperature != mLastBatteryTemperature || mInvalidCharger != mLastInvalidCharger || - dockBatteryChanged) { + dockBatteryHasNewData) { if (mPlugType != mLastPlugType) { if (mLastPlugType == BATTERY_PLUGGED_NONE) { @@ -494,12 +514,6 @@ public final class BatteryService extends Binder { mLastBatteryTemperature = mBatteryTemperature; mLastBatteryLevelCritical = mBatteryLevelCritical; mLastInvalidCharger = mInvalidCharger; - - if (mHasDockBattery) { - mLastDockBatteryLevel = mDockBatteryLevel; - mLastDockBatteryStatus = mDockBatteryStatus; - mLastDockBatteryPresent = mDockBatteryPresent; - } } } @@ -509,6 +523,11 @@ public final class BatteryService extends Binder { intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING); + Bundle dockData = new Bundle(); + if (mDeviceDockBattery != null) { + dockData = mDeviceDockBattery.getNotifyData(); + } + int icon = getIconLocked(mBatteryLevel); intent.putExtra(BatteryManager.EXTRA_STATUS, mBatteryStatus); @@ -522,8 +541,13 @@ public final class BatteryService extends Binder { intent.putExtra(BatteryManager.EXTRA_TEMPERATURE, mBatteryTemperature); intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mBatteryTechnology); intent.putExtra(BatteryManager.EXTRA_INVALID_CHARGER, mInvalidCharger); + intent.putExtras(dockData); if (DEBUG) { + String dockDebug = ""; + for (String key : dockData.keySet()) { + dockDebug += ", " + key + ": " + String.valueOf(dockData.get(key)); + } Slog.d(TAG, "Sending ACTION_BATTERY_CHANGED. level:" + mBatteryLevel + ", scale:" + BATTERY_SCALE + ", status:" + mBatteryStatus + ", health:" + mBatteryHealth + ", present:" + mBatteryPresent + @@ -532,24 +556,8 @@ public final class BatteryService extends Binder { ", technology: " + mBatteryTechnology + ", AC powered:" + mAcOnline + ", USB powered:" + mUsbOnline + ", Wireless powered:" + mWirelessOnline + - ", icon:" + icon + ", invalid charger:" + mInvalidCharger); - } - - if (mHasDockBattery){ - intent.putExtra(BatteryManager.EXTRA_DOCK_PRESENT, mDockBatteryPresent); - intent.putExtra(BatteryManager.EXTRA_DOCK_STATUS, mDockBatteryStatus); - intent.putExtra(BatteryManager.EXTRA_DOCK_LEVEL, mDockBatteryLevel); - } - - if (false) { - Slog.d(TAG, "level:" + mBatteryLevel + - " scale:" + BATTERY_SCALE + " status:" + mBatteryStatus + - " health:" + mBatteryHealth + " present:" + mBatteryPresent + - " voltage: " + mBatteryVoltage + - " temperature: " + mBatteryTemperature + - " technology: " + mBatteryTechnology + - " AC powered:" + mAcOnline + " USB powered:" + mUsbOnline + - " icon:" + icon + " invalid charger:" + mInvalidCharger); + ", icon:" + icon + ", invalid charger:" + mInvalidCharger + + dockDebug); } mHandler.post(new Runnable() { @@ -711,6 +719,17 @@ public final class BatteryService extends Binder { } } + private final BroadcastReceiver mDockReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) { + synchronized (mLock) { + updateLocked(); + } + } + } + }; + private final UEventObserver mPowerSupplyObserver = new UEventObserver() { @Override public void onUEvent(UEventObserver.UEvent event) { diff --git a/services/java/com/android/server/DeviceHandlerService.java b/services/java/com/android/server/DeviceHandlerService.java new file mode 100644 index 0000000..ddf455d --- /dev/null +++ b/services/java/com/android/server/DeviceHandlerService.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2013 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.Resources; +import android.os.Binder; +import android.util.Log; + +import com.android.internal.os.DeviceDockBatteryHandler; +import com.android.internal.os.DeviceKeyHandler; +import com.android.internal.os.IDeviceHandler; + +import dalvik.system.DexClassLoader; + +import java.lang.reflect.Constructor; + +/** + * DeviceHandlerService exposed device specific handlers to other services. + * All specific device, not implemented by aosp, should be included here. + * @see DeviceKeyHandler + * @see DeviceDockBatteryHandler + * @hide + */ +public final class DeviceHandlerService extends Binder implements IDeviceHandler { + private static final String TAG = DeviceHandlerService.class.getSimpleName(); + + private static final boolean DEBUG = true; + + private final Context mContext; + + private DeviceKeyHandler mDeviceKeyHandler = null; + private DeviceDockBatteryHandler mDeviceDockBatteryHandler = null; + + public DeviceHandlerService(Context context) { + mContext = context; + registerHandlers(); + } + + private void registerHandlers() { + // For register device specific handlers at least a library with the + // implementations is required. + Resources res = mContext.getResources(); + String deviceHandlersLib = + res.getString( + com.android.internal.R.string.config_deviceHandlersLib); + if (deviceHandlersLib.isEmpty()) { + Log.i(TAG, "No device specific handler lib was defined."); + return; + } + ClassLoader classLoader = + new DexClassLoader( + deviceHandlersLib, + new ContextWrapper(mContext).getCacheDir().getAbsolutePath(), + null, + ClassLoader.getSystemClassLoader()); + + // ------------------ + // DeviceKeyHandler + // ------------------ + String handlerClass = + res.getString(com.android.internal.R.string.config_deviceKeyHandlerClass); + if (!handlerClass.isEmpty()) { + mDeviceKeyHandler = (DeviceKeyHandler)getHandler(classLoader, "key", handlerClass); + } + + // ------------------ + // DeviceDockBatteryHandler + // ------------------ + // Has dock battery? and device specific handler? + boolean hasDockBattery = res.getBoolean(com.android.internal.R.bool.config_hasDockBattery); + if (hasDockBattery) { + handlerClass = + res.getString( + com.android.internal.R.string.config_deviceDockBatteryHandlerClass); + if (!handlerClass.isEmpty()) { + mDeviceDockBatteryHandler = + (DeviceDockBatteryHandler)getHandler( + classLoader, "dock battery", handlerClass); + } + } + } + + private Object getHandler(final ClassLoader classLoader, + final String type, final String handlerClass) { + try { + Class<?> clazz = classLoader.loadClass(handlerClass); + Constructor<?> constructor = clazz.getConstructor(Context.class); + Object handler = constructor.newInstance(mContext); + if(DEBUG) { + Log.d(TAG, String.format("Instantiated %s handler class %s", type, handlerClass)); + } + return handler; + + } catch (Exception e) { + Log.w(TAG, + String.format( + "Could not instantiate %s handler class %s", type, handlerClass), e); + } + return null; + } + + public DeviceKeyHandler getDeviceKeyHandler() { + return mDeviceKeyHandler; + } + + public DeviceDockBatteryHandler getDeviceDockBatteryHandler() { + return mDeviceDockBatteryHandler; + } +} diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 9decd62..fe04911 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -144,6 +144,7 @@ class ServerThread extends Thread { LightsService lights = null; PowerManagerService power = null; DisplayManagerService display = null; + DeviceHandlerService device = null; BatteryService battery = null; VibratorService vibrator = null; AlarmManagerService alarm = null; @@ -300,11 +301,15 @@ class ServerThread extends Thread { Slog.i(TAG, "System Content Providers"); ActivityManagerService.installSystemProviders(); + // Requires context, activity manager y providers + Slog.i(TAG, "Device Handler Service"); + device = new DeviceHandlerService(context); + Slog.i(TAG, "Lights Service"); lights = new LightsService(context); Slog.i(TAG, "Battery Service"); - battery = new BatteryService(context, lights); + battery = new BatteryService(context, lights, device); ServiceManager.addService("battery", battery); Slog.i(TAG, "Vibrator Service"); @@ -329,7 +334,7 @@ class ServerThread extends Thread { Slog.i(TAG, "Window Manager"); wm = WindowManagerService.main(context, power, display, inputManager, - uiHandler, wmHandler, + device, uiHandler, wmHandler, factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL, !firstBoot, onlyCore); ServiceManager.addService(Context.WINDOW_SERVICE, wm); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 7907931..826d7ba 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -43,6 +43,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import com.android.internal.app.IBatteryStats; import com.android.internal.app.ThemeUtils; +import com.android.internal.os.IDeviceHandler; import com.android.internal.policy.PolicyManager; import com.android.internal.policy.impl.PhoneWindowManager; import com.android.internal.view.IInputContext; @@ -327,7 +328,7 @@ public class WindowManagerService extends IWindowManager.Stub final boolean mLimitedAlphaCompositing; - final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager(); + final WindowManagerPolicy mPolicy; final IActivityManager mActivityManager; @@ -766,7 +767,7 @@ public class WindowManagerService extends IWindowManager.Stub public static WindowManagerService main(final Context context, final PowerManagerService pm, final DisplayManagerService dm, - final InputManagerService im, + final InputManagerService im, final IDeviceHandler device, final Handler uiHandler, final Handler wmHandler, final boolean haveInputMethods, final boolean showBootMsgs, final boolean onlyCore) { @@ -775,7 +776,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void run() { holder[0] = new WindowManagerService(context, pm, dm, im, - uiHandler, haveInputMethods, showBootMsgs, onlyCore); + device, uiHandler, haveInputMethods, showBootMsgs, onlyCore); } }, 0); return holder[0]; @@ -797,7 +798,7 @@ public class WindowManagerService extends IWindowManager.Stub private WindowManagerService(Context context, PowerManagerService pm, DisplayManagerService displayManager, InputManagerService inputManager, - Handler uiHandler, + IDeviceHandler device, Handler uiHandler, boolean haveInputMethods, boolean showBootMsgs, boolean onlyCore) { mContext = context; mHaveInputMethods = haveInputMethods; @@ -807,6 +808,7 @@ public class WindowManagerService extends IWindowManager.Stub com.android.internal.R.bool.config_sf_limitedAlpha); mDisplayManagerService = displayManager; mHeadless = displayManager.isHeadless(); + mPolicy = PolicyManager.makeNewWindowManager(device); mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE); mDisplayManager.registerDisplayListener(this, null); diff --git a/services/jni/com_android_server_BatteryService.cpp b/services/jni/com_android_server_BatteryService.cpp index c6fe620..c7e931e 100644 --- a/services/jni/com_android_server_BatteryService.cpp +++ b/services/jni/com_android_server_BatteryService.cpp @@ -50,11 +50,6 @@ struct FieldIds { jfieldID mBatteryVoltage; jfieldID mBatteryTemperature; jfieldID mBatteryTechnology; -#ifdef HAS_DOCK_BATTERY - jfieldID mDockBatteryStatus; - jfieldID mDockBatteryLevel; - jfieldID mDockBatteryPresent; -#endif }; static FieldIds gFieldIds; @@ -71,11 +66,6 @@ struct BatteryManagerConstants { jint healthOverVoltage; jint healthUnspecifiedFailure; jint healthCold; -#ifdef HAS_DOCK_BATTERY - jint dockStatusUnknown; - jint dockStatusCharging; - jint dockStatusNotCharging; -#endif }; static BatteryManagerConstants gConstants; @@ -90,11 +80,6 @@ struct PowerSupplyPaths { char* batteryVoltagePath; char* batteryTemperaturePath; char* batteryTechnologyPath; -#ifdef HAS_DOCK_BATTERY - char* dockBatteryStatusPath; - char* dockBatteryCapacityPath; - char* dockBatteryPresentPath; -#endif }; static PowerSupplyPaths gPaths; @@ -116,21 +101,6 @@ 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: { - ALOGW("Unknown dock battery status '%s'", status); - return gConstants.dockStatusUnknown; - } - } -} -#endif - static jint getBatteryHealth(const char* status) { switch (status[0]) { @@ -251,26 +221,6 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj) if (readFromFile(gPaths.batteryTechnologyPath, buf, SIZE) > 0) env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env->NewStringUTF(buf)); - -#ifdef HAS_DOCK_BATTERY - jboolean present = false; - if (readFromFile(gPaths.dockBatteryPresentPath, buf, SIZE) >= 15) { - // should return "dock detect = 1" - if (buf[14] == '1') { - present = true; - } - } - env->SetBooleanField(obj, gFieldIds.mDockBatteryPresent, present); - - setIntField(env, obj, gPaths.dockBatteryCapacityPath, gFieldIds.mDockBatteryLevel); - - if (readFromFile(gPaths.dockBatteryStatusPath, buf, SIZE) > 0) - env->SetIntField(obj, gFieldIds.mDockBatteryStatus, - getDockBatteryStatus(buf)); - else - env->SetIntField(obj, gFieldIds.mDockBatteryStatus, - gConstants.dockStatusUnknown); -#endif } static JNINativeMethod sMethods[] = { @@ -356,19 +306,6 @@ 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); @@ -413,12 +350,6 @@ 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", "Z"); -#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.mWirelessOnline == NULL, "Unable to find BatteryService.WIRELESS_ONLINE_PATH"); @@ -473,17 +404,6 @@ int register_android_server_BatteryService(JNIEnv* env) gConstants.healthCold = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "BATTERY_HEALTH_COLD", "I")); -#ifdef HAS_DOCK_BATTERY - gConstants.dockStatusUnknown = env->GetStaticIntField(clazz, - env->GetStaticFieldID(clazz, "DOCK_BATTERY_STATUS_UNKNOWN", "I")); - - gConstants.dockStatusCharging = env->GetStaticIntField(clazz, - env->GetStaticFieldID(clazz, "DOCK_BATTERY_STATUS_CHARGING", "I")); - - gConstants.dockStatusNotCharging = env->GetStaticIntField(clazz, - env->GetStaticFieldID(clazz, "DOCK_BATTERY_STATUS_NOT_CHARGING", "I")); -#endif - return jniRegisterNativeMethods(env, "com/android/server/BatteryService", sMethods, NELEM(sMethods)); } |
