summaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
authorMadison Koenig <pedlar88@gmail.com>2011-11-27 06:41:50 -0500
committerSteve Kondik <shade@chemlab.org>2011-12-20 15:02:58 -0800
commit40d3e503754b88d1440484120788f35ffa0bce92 (patch)
treea6064ded2fa5849664139a090f4c81660b0ffa42 /packages
parent164fcfb867bc49a1f51649442e923ed191cbbc58 (diff)
downloadframeworks_base-40d3e503754b88d1440484120788f35ffa0bce92.zip
frameworks_base-40d3e503754b88d1440484120788f35ffa0bce92.tar.gz
frameworks_base-40d3e503754b88d1440484120788f35ffa0bce92.tar.bz2
Notification Power Widget
Ported over from CM 7.1 into CM9 Rewrite by cvpcs Requires configuration settings from CMParts. Will be done when settings app available. Disabled WiMax button until WiMax support is added back in. ToDo: Change default color to Cyan to match ICS default color Scheme. Make indicator bar smaller? Requires: http://review.cyanogenmod.com/#change,10578 - Light Sensor Information. Also requires CMSettings for Configuration: https://github.com/Pedlar/android_packages_apps_CMSettings Change-Id: I657f459969c784164730e6b0660db40822d8c491
Diffstat (limited to 'packages')
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_2g3g_off.pngbin0 -> 1102 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_2g3g_on.pngbin0 -> 1316 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_3g_on.pngbin0 -> 1195 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_airplane_off.pngbin0 -> 1651 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_airplane_on.pngbin0 -> 938 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_bgoff.9.pngbin0 -> 1074 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_bgon.9.pngbin0 -> 1099 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_bgon_custom.9.pngbin0 -> 1085 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_bluetooth_off.pngbin0 -> 1496 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_bluetooth_on.pngbin0 -> 955 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_brightness_auto.pngbin0 -> 1502 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_brightness_mid.pngbin0 -> 1677 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_brightness_off.pngbin0 -> 2362 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_brightness_on.pngbin0 -> 711 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_data_off.pngbin0 -> 1839 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_data_on.pngbin0 -> 1329 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_flashlight_off.pngbin0 -> 1748 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_flashlight_on.pngbin0 -> 1116 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_gps_off.pngbin0 -> 2546 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_gps_on.pngbin0 -> 1628 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_ing_off.pngbin0 -> 2156 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_inner_focus.9.pngbin0 -> 1082 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_inner_press.9.pngbin0 -> 1080 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_lock_screen_off.pngbin0 -> 1623 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_lock_screen_on.pngbin0 -> 1172 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_media_next.pngbin0 -> 541 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_media_pause.pngbin0 -> 347 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_media_play.pngbin0 -> 464 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_media_previous.pngbin0 -> 564 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_orientation_off.pngbin0 -> 2009 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_orientation_on.pngbin0 -> 1291 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_power_background.9.pngbin0 -> 932 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_ring_on.pngbin0 -> 1355 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_ring_vibrate_on.pngbin0 -> 2350 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_screen_timeout_off.pngbin0 -> 2127 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_screen_timeout_on.pngbin0 -> 1392 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_silent.pngbin0 -> 1156 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_sleep.pngbin0 -> 1428 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_sync_off.pngbin0 -> 2298 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_sync_on.pngbin0 -> 1608 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_vibrate_off.pngbin0 -> 1360 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_vibrate_on.pngbin0 -> 1360 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_wifi_ap_off.pngbin0 -> 2907 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_wifi_ap_on.pngbin0 -> 1833 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_wifi_off.pngbin0 -> 3041 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_wifi_on.pngbin0 -> 2057 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_wimax_off.pngbin0 -> 1261 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_wimax_on.pngbin0 -> 1250 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_2g3g_off.pngbin0 -> 838 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_2g3g_on.pngbin0 -> 1018 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_3g_on.pngbin0 -> 958 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_airplane_off.pngbin0 -> 1051 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_airplane_on.pngbin0 -> 778 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_bgoff.9.pngbin0 -> 1074 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_bgon.9.pngbin0 -> 1099 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_bgon_custom.9.pngbin0 -> 1085 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_bluetooth_off.pngbin0 -> 1164 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_bluetooth_on.pngbin0 -> 768 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_brightness_auto.pngbin0 -> 1177 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_brightness_mid.pngbin0 -> 1358 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_brightness_off.pngbin0 -> 1736 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_brightness_on.pngbin0 -> 617 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_data_off.pngbin0 -> 1337 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_data_on.pngbin0 -> 1059 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_flashlight_off.pngbin0 -> 1237 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_flashlight_on.pngbin0 -> 869 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_gps_off.pngbin0 -> 1713 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_gps_on.pngbin0 -> 1327 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_ing_off.pngbin0 -> 1595 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_inner_focus.9.pngbin0 -> 1082 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_inner_press.9.pngbin0 -> 1080 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_lock_screen_off.pngbin0 -> 1147 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_lock_screen_on.pngbin0 -> 974 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_media_next.pngbin0 -> 452 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_media_pause.pngbin0 -> 320 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_media_play.pngbin0 -> 340 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_media_previous.pngbin0 -> 452 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_orientation_off.pngbin0 -> 1449 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_orientation_on.pngbin0 -> 1103 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_power_background.9.pngbin0 -> 932 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_ring_on.pngbin0 -> 1163 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_ring_vibrate_on.pngbin0 -> 1616 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_screen_timeout_off.pngbin0 -> 1522 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_screen_timeout_on.pngbin0 -> 1165 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_silent.pngbin0 -> 821 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_sleep.pngbin0 -> 1170 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_sync_off.pngbin0 -> 1599 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_sync_on.pngbin0 -> 1306 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_vibrate_off.pngbin0 -> 1057 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_vibrate_on.pngbin0 -> 1057 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_wifi_ap_off.pngbin0 -> 1946 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_wifi_ap_on.pngbin0 -> 1414 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_wifi_off.pngbin0 -> 2027 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_wifi_on.pngbin0 -> 1439 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_wimax_off.pngbin0 -> 993 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/stat_wimax_on.pngbin0 -> 1019 bytes
-rw-r--r--packages/SystemUI/res/drawable/stat_power_bg.xml28
-rw-r--r--packages/SystemUI/res/layout/power_widget_button.xml36
-rw-r--r--packages/SystemUI/res/layout/status_bar_expanded.xml106
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/AirplaneButton.java66
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/AutoRotateButton.java67
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/BluetoothButton.java132
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/BrightnessButton.java204
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/FlashlightButton.java.no_build59
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/GPSButton.java63
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/LockScreenButton.java88
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaKeyEventButton.java41
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaNextButton.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaPlayPauseButton.java57
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaPreviousButton.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MobileDataButton.java88
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/NetworkModeButton.java204
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerButton.java367
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerWidget.java304
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/ScreenTimeoutButton.java156
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SleepButton.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SoundButton.java242
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/StateTracker.java155
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SyncButton.java104
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WifiApButton.java153
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WifiButton.java147
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WimaxButton.java.no_build148
123 files changed, 3077 insertions, 47 deletions
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_2g3g_off.png b/packages/SystemUI/res/drawable-hdpi/stat_2g3g_off.png
new file mode 100755
index 0000000..6db10ef
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_2g3g_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_2g3g_on.png b/packages/SystemUI/res/drawable-hdpi/stat_2g3g_on.png
new file mode 100755
index 0000000..366404b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_2g3g_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_3g_on.png b/packages/SystemUI/res/drawable-hdpi/stat_3g_on.png
new file mode 100755
index 0000000..5e19fd2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_3g_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_airplane_off.png b/packages/SystemUI/res/drawable-hdpi/stat_airplane_off.png
new file mode 100755
index 0000000..9312868
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_airplane_on.png b/packages/SystemUI/res/drawable-hdpi/stat_airplane_on.png
new file mode 100755
index 0000000..7ed1ac3
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_airplane_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_bgoff.9.png b/packages/SystemUI/res/drawable-hdpi/stat_bgoff.9.png
new file mode 100644
index 0000000..e288cb2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_bgoff.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_bgon.9.png b/packages/SystemUI/res/drawable-hdpi/stat_bgon.9.png
new file mode 100644
index 0000000..b27a5cb
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_bgon.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_bgon_custom.9.png b/packages/SystemUI/res/drawable-hdpi/stat_bgon_custom.9.png
new file mode 100644
index 0000000..3c1439b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_bgon_custom.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_bluetooth_off.png b/packages/SystemUI/res/drawable-hdpi/stat_bluetooth_off.png
new file mode 100755
index 0000000..a45acbb
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_bluetooth_on.png b/packages/SystemUI/res/drawable-hdpi/stat_bluetooth_on.png
new file mode 100755
index 0000000..94f03e9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_bluetooth_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_brightness_auto.png b/packages/SystemUI/res/drawable-hdpi/stat_brightness_auto.png
new file mode 100755
index 0000000..417a4a7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_brightness_auto.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_brightness_mid.png b/packages/SystemUI/res/drawable-hdpi/stat_brightness_mid.png
new file mode 100755
index 0000000..937bfa1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_brightness_mid.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_brightness_off.png b/packages/SystemUI/res/drawable-hdpi/stat_brightness_off.png
new file mode 100755
index 0000000..10f1e12
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_brightness_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_brightness_on.png b/packages/SystemUI/res/drawable-hdpi/stat_brightness_on.png
new file mode 100755
index 0000000..8b22698
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_brightness_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_data_off.png b/packages/SystemUI/res/drawable-hdpi/stat_data_off.png
new file mode 100755
index 0000000..3bf48e0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_data_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_data_on.png b/packages/SystemUI/res/drawable-hdpi/stat_data_on.png
new file mode 100755
index 0000000..8f15204
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_data_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_flashlight_off.png b/packages/SystemUI/res/drawable-hdpi/stat_flashlight_off.png
new file mode 100755
index 0000000..b6f48e1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_flashlight_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_flashlight_on.png b/packages/SystemUI/res/drawable-hdpi/stat_flashlight_on.png
new file mode 100755
index 0000000..fe73b22
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_flashlight_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_gps_off.png b/packages/SystemUI/res/drawable-hdpi/stat_gps_off.png
new file mode 100755
index 0000000..34c2164
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_gps_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_gps_on.png b/packages/SystemUI/res/drawable-hdpi/stat_gps_on.png
new file mode 100755
index 0000000..6bd0e64
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_gps_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_ing_off.png b/packages/SystemUI/res/drawable-hdpi/stat_ing_off.png
new file mode 100755
index 0000000..80a196c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_ing_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_inner_focus.9.png b/packages/SystemUI/res/drawable-hdpi/stat_inner_focus.9.png
new file mode 100644
index 0000000..ed79969
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_inner_focus.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_inner_press.9.png b/packages/SystemUI/res/drawable-hdpi/stat_inner_press.9.png
new file mode 100644
index 0000000..b1b6cab
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_inner_press.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_lock_screen_off.png b/packages/SystemUI/res/drawable-hdpi/stat_lock_screen_off.png
new file mode 100755
index 0000000..e484e10
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_lock_screen_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_lock_screen_on.png b/packages/SystemUI/res/drawable-hdpi/stat_lock_screen_on.png
new file mode 100755
index 0000000..67d02dd
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_lock_screen_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_media_next.png b/packages/SystemUI/res/drawable-hdpi/stat_media_next.png
new file mode 100755
index 0000000..2a50952
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_media_next.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_media_pause.png b/packages/SystemUI/res/drawable-hdpi/stat_media_pause.png
new file mode 100755
index 0000000..814b97b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_media_pause.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_media_play.png b/packages/SystemUI/res/drawable-hdpi/stat_media_play.png
new file mode 100755
index 0000000..dc95df0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_media_play.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_media_previous.png b/packages/SystemUI/res/drawable-hdpi/stat_media_previous.png
new file mode 100755
index 0000000..f2163db
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_media_previous.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_orientation_off.png b/packages/SystemUI/res/drawable-hdpi/stat_orientation_off.png
new file mode 100755
index 0000000..fed7fff
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_orientation_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_orientation_on.png b/packages/SystemUI/res/drawable-hdpi/stat_orientation_on.png
new file mode 100755
index 0000000..4991bbe
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_orientation_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_power_background.9.png b/packages/SystemUI/res/drawable-hdpi/stat_power_background.9.png
new file mode 100755
index 0000000..3204d1d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_power_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_ring_on.png b/packages/SystemUI/res/drawable-hdpi/stat_ring_on.png
new file mode 100755
index 0000000..ca4cdb2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_ring_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_ring_vibrate_on.png b/packages/SystemUI/res/drawable-hdpi/stat_ring_vibrate_on.png
new file mode 100755
index 0000000..bae1a9e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_ring_vibrate_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_screen_timeout_off.png b/packages/SystemUI/res/drawable-hdpi/stat_screen_timeout_off.png
new file mode 100755
index 0000000..f4ae52c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_screen_timeout_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_screen_timeout_on.png b/packages/SystemUI/res/drawable-hdpi/stat_screen_timeout_on.png
new file mode 100755
index 0000000..9efcc73
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_screen_timeout_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_silent.png b/packages/SystemUI/res/drawable-hdpi/stat_silent.png
new file mode 100755
index 0000000..d8107f3
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_silent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sleep.png b/packages/SystemUI/res/drawable-hdpi/stat_sleep.png
new file mode 100755
index 0000000..9c3de06
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sleep.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sync_off.png b/packages/SystemUI/res/drawable-hdpi/stat_sync_off.png
new file mode 100755
index 0000000..1da382f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sync_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sync_on.png b/packages/SystemUI/res/drawable-hdpi/stat_sync_on.png
new file mode 100755
index 0000000..06c6c5d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sync_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_vibrate_off.png b/packages/SystemUI/res/drawable-hdpi/stat_vibrate_off.png
new file mode 100755
index 0000000..94c295b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_vibrate_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_vibrate_on.png b/packages/SystemUI/res/drawable-hdpi/stat_vibrate_on.png
new file mode 100755
index 0000000..94c295b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_vibrate_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_wifi_ap_off.png b/packages/SystemUI/res/drawable-hdpi/stat_wifi_ap_off.png
new file mode 100755
index 0000000..605c6a3
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_wifi_ap_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_wifi_ap_on.png b/packages/SystemUI/res/drawable-hdpi/stat_wifi_ap_on.png
new file mode 100755
index 0000000..8cacb0c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_wifi_ap_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_wifi_off.png b/packages/SystemUI/res/drawable-hdpi/stat_wifi_off.png
new file mode 100755
index 0000000..7247846
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_wifi_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_wifi_on.png b/packages/SystemUI/res/drawable-hdpi/stat_wifi_on.png
new file mode 100755
index 0000000..c4e7c84
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_wifi_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_wimax_off.png b/packages/SystemUI/res/drawable-hdpi/stat_wimax_off.png
new file mode 100755
index 0000000..909c96b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_wimax_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_wimax_on.png b/packages/SystemUI/res/drawable-hdpi/stat_wimax_on.png
new file mode 100755
index 0000000..4ff265f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_wimax_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_2g3g_off.png b/packages/SystemUI/res/drawable-mdpi/stat_2g3g_off.png
new file mode 100755
index 0000000..bc47fc1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_2g3g_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_2g3g_on.png b/packages/SystemUI/res/drawable-mdpi/stat_2g3g_on.png
new file mode 100755
index 0000000..0d7245d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_2g3g_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_3g_on.png b/packages/SystemUI/res/drawable-mdpi/stat_3g_on.png
new file mode 100755
index 0000000..020a199
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_3g_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_airplane_off.png b/packages/SystemUI/res/drawable-mdpi/stat_airplane_off.png
new file mode 100755
index 0000000..ad2f607
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_airplane_on.png b/packages/SystemUI/res/drawable-mdpi/stat_airplane_on.png
new file mode 100755
index 0000000..b1a670b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_airplane_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_bgoff.9.png b/packages/SystemUI/res/drawable-mdpi/stat_bgoff.9.png
new file mode 100644
index 0000000..e288cb2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_bgoff.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_bgon.9.png b/packages/SystemUI/res/drawable-mdpi/stat_bgon.9.png
new file mode 100644
index 0000000..b27a5cb
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_bgon.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_bgon_custom.9.png b/packages/SystemUI/res/drawable-mdpi/stat_bgon_custom.9.png
new file mode 100644
index 0000000..3c1439b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_bgon_custom.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_bluetooth_off.png b/packages/SystemUI/res/drawable-mdpi/stat_bluetooth_off.png
new file mode 100755
index 0000000..719d3c5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_bluetooth_on.png b/packages/SystemUI/res/drawable-mdpi/stat_bluetooth_on.png
new file mode 100755
index 0000000..0e73746
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_bluetooth_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_brightness_auto.png b/packages/SystemUI/res/drawable-mdpi/stat_brightness_auto.png
new file mode 100755
index 0000000..163b2e2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_brightness_auto.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_brightness_mid.png b/packages/SystemUI/res/drawable-mdpi/stat_brightness_mid.png
new file mode 100755
index 0000000..984e22a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_brightness_mid.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_brightness_off.png b/packages/SystemUI/res/drawable-mdpi/stat_brightness_off.png
new file mode 100755
index 0000000..cd67d9d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_brightness_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_brightness_on.png b/packages/SystemUI/res/drawable-mdpi/stat_brightness_on.png
new file mode 100755
index 0000000..fbf019e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_brightness_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_data_off.png b/packages/SystemUI/res/drawable-mdpi/stat_data_off.png
new file mode 100755
index 0000000..2f12c68
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_data_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_data_on.png b/packages/SystemUI/res/drawable-mdpi/stat_data_on.png
new file mode 100755
index 0000000..29a34d1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_data_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_flashlight_off.png b/packages/SystemUI/res/drawable-mdpi/stat_flashlight_off.png
new file mode 100755
index 0000000..ea44e58
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_flashlight_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_flashlight_on.png b/packages/SystemUI/res/drawable-mdpi/stat_flashlight_on.png
new file mode 100755
index 0000000..ad8ed1f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_flashlight_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_gps_off.png b/packages/SystemUI/res/drawable-mdpi/stat_gps_off.png
new file mode 100755
index 0000000..9e217c1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_gps_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_gps_on.png b/packages/SystemUI/res/drawable-mdpi/stat_gps_on.png
new file mode 100755
index 0000000..07258a7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_gps_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_ing_off.png b/packages/SystemUI/res/drawable-mdpi/stat_ing_off.png
new file mode 100755
index 0000000..2215157
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_ing_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_inner_focus.9.png b/packages/SystemUI/res/drawable-mdpi/stat_inner_focus.9.png
new file mode 100644
index 0000000..ed79969
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_inner_focus.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_inner_press.9.png b/packages/SystemUI/res/drawable-mdpi/stat_inner_press.9.png
new file mode 100644
index 0000000..b1b6cab
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_inner_press.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_lock_screen_off.png b/packages/SystemUI/res/drawable-mdpi/stat_lock_screen_off.png
new file mode 100755
index 0000000..f3251da
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_lock_screen_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_lock_screen_on.png b/packages/SystemUI/res/drawable-mdpi/stat_lock_screen_on.png
new file mode 100755
index 0000000..22f7d7a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_lock_screen_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_media_next.png b/packages/SystemUI/res/drawable-mdpi/stat_media_next.png
new file mode 100755
index 0000000..7a06074
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_media_next.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_media_pause.png b/packages/SystemUI/res/drawable-mdpi/stat_media_pause.png
new file mode 100755
index 0000000..f1ae88c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_media_pause.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_media_play.png b/packages/SystemUI/res/drawable-mdpi/stat_media_play.png
new file mode 100755
index 0000000..1f9df50
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_media_play.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_media_previous.png b/packages/SystemUI/res/drawable-mdpi/stat_media_previous.png
new file mode 100755
index 0000000..d59920f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_media_previous.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_orientation_off.png b/packages/SystemUI/res/drawable-mdpi/stat_orientation_off.png
new file mode 100755
index 0000000..7f2105a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_orientation_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_orientation_on.png b/packages/SystemUI/res/drawable-mdpi/stat_orientation_on.png
new file mode 100755
index 0000000..7b0587e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_orientation_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_power_background.9.png b/packages/SystemUI/res/drawable-mdpi/stat_power_background.9.png
new file mode 100755
index 0000000..3204d1d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_power_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_ring_on.png b/packages/SystemUI/res/drawable-mdpi/stat_ring_on.png
new file mode 100755
index 0000000..0a36920
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_ring_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_ring_vibrate_on.png b/packages/SystemUI/res/drawable-mdpi/stat_ring_vibrate_on.png
new file mode 100755
index 0000000..3081342
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_ring_vibrate_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_screen_timeout_off.png b/packages/SystemUI/res/drawable-mdpi/stat_screen_timeout_off.png
new file mode 100755
index 0000000..5e9a501
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_screen_timeout_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_screen_timeout_on.png b/packages/SystemUI/res/drawable-mdpi/stat_screen_timeout_on.png
new file mode 100755
index 0000000..804e483
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_screen_timeout_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_silent.png b/packages/SystemUI/res/drawable-mdpi/stat_silent.png
new file mode 100755
index 0000000..a2df148
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_silent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sleep.png b/packages/SystemUI/res/drawable-mdpi/stat_sleep.png
new file mode 100755
index 0000000..de3e168
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sleep.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sync_off.png b/packages/SystemUI/res/drawable-mdpi/stat_sync_off.png
new file mode 100755
index 0000000..f6145c3
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sync_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sync_on.png b/packages/SystemUI/res/drawable-mdpi/stat_sync_on.png
new file mode 100755
index 0000000..94aa827
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sync_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_vibrate_off.png b/packages/SystemUI/res/drawable-mdpi/stat_vibrate_off.png
new file mode 100755
index 0000000..3852ee1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_vibrate_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_vibrate_on.png b/packages/SystemUI/res/drawable-mdpi/stat_vibrate_on.png
new file mode 100755
index 0000000..3852ee1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_vibrate_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_wifi_ap_off.png b/packages/SystemUI/res/drawable-mdpi/stat_wifi_ap_off.png
new file mode 100755
index 0000000..897239c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_wifi_ap_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_wifi_ap_on.png b/packages/SystemUI/res/drawable-mdpi/stat_wifi_ap_on.png
new file mode 100755
index 0000000..2249f0b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_wifi_ap_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_wifi_off.png b/packages/SystemUI/res/drawable-mdpi/stat_wifi_off.png
new file mode 100755
index 0000000..964c7da
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_wifi_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_wifi_on.png b/packages/SystemUI/res/drawable-mdpi/stat_wifi_on.png
new file mode 100755
index 0000000..46f58ca
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_wifi_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_wimax_off.png b/packages/SystemUI/res/drawable-mdpi/stat_wimax_off.png
new file mode 100755
index 0000000..3040ba3b2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_wimax_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_wimax_on.png b/packages/SystemUI/res/drawable-mdpi/stat_wimax_on.png
new file mode 100755
index 0000000..493ff39
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_wimax_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/stat_power_bg.xml b/packages/SystemUI/res/drawable/stat_power_bg.xml
new file mode 100644
index 0000000..a21b510
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_power_bg.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_pressed="true"
+ android:drawable="@drawable/stat_inner_press" />
+
+ <item android:state_focused="true" android:state_enabled="true"
+ android:state_window_focused="true"
+ android:drawable="@drawable/stat_inner_focus" />
+
+ <item
+ android:drawable="@drawable/stat_power_background" />
+</selector>
diff --git a/packages/SystemUI/res/layout/power_widget_button.xml b/packages/SystemUI/res/layout/power_widget_button.xml
new file mode 100644
index 0000000..e84fd85
--- /dev/null
+++ b/packages/SystemUI/res/layout/power_widget_button.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* apps/common/assets/default/default/skins/StatusBar.xml
+**
+** Copyright 2006, 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.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/power_widget_button"
+ android:orientation="vertical"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="@drawable/stat_power_bg">
+ <ImageView android:id="@+id/power_widget_button_image"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:scaleType="center" />
+ <ImageView android:id="@+id/power_widget_button_indic"
+ android:layout_width="match_parent"
+ android:layout_height="2dp"
+ android:scaleType="fitXY" />
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index cd4e37c..def690f 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -26,58 +26,70 @@
android:descendantFocusability="afterDescendants"
>
- <RelativeLayout
+
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="52dp"
- android:paddingTop="3dp"
- android:paddingBottom="5dp"
- android:paddingRight="3dp"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
android:background="@drawable/notification_header_bg"
- >
- <com.android.systemui.statusbar.policy.DateView android:id="@+id/date"
- android:textAppearance="@style/TextAppearance.StatusBar.Date"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_alignParentLeft="true"
- android:singleLine="true"
- android:gravity="center_vertical|left"
- android:paddingLeft="16dp"
- />
- <!--
- <com.android.systemui.statusbar.phone.CarrierLabel
- android:layout_width="0dp"
+ >
+ <com.android.systemui.statusbar.powerwidget.PowerWidget android:id="@+id/exp_power_stat"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_weight="1"
- android:layout_marginTop="1dp"
- android:layout_marginLeft="5dp"
- android:layout_gravity="center_vertical"
- android:paddingBottom="1dp"
- android:paddingLeft="4dp"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textColor="?android:attr/textColorSecondary"
- />
- -->
+ />
- <ImageView android:id="@+id/settings_button"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_toRightOf="@id/date"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:src="@drawable/ic_notify_quicksettings"
- android:contentDescription="@string/accessibility_settings_button"
- />
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="52dp"
+ android:paddingTop="3dp"
+ android:paddingBottom="5dp"
+ android:paddingRight="3dp"
+ >
+ <com.android.systemui.statusbar.policy.DateView android:id="@+id/date"
+ android:textAppearance="@style/TextAppearance.StatusBar.Date"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentLeft="true"
+ android:singleLine="true"
+ android:gravity="center_vertical|left"
+ android:paddingLeft="16dp"
+ />
+ <!--
+ <com.android.systemui.statusbar.phone.CarrierLabel
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginTop="1dp"
+ android:layout_marginLeft="5dp"
+ android:layout_gravity="center_vertical"
+ android:paddingBottom="1dp"
+ android:paddingLeft="4dp"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textColor="?android:attr/textColorSecondary"
+ />
+ -->
- <ImageView android:id="@+id/clear_all_button"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_alignParentRight="true"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:src="@drawable/ic_notify_clear"
- android:contentDescription="@string/accessibility_clear_all"
- />
- </RelativeLayout>
+ <ImageView android:id="@+id/settings_button"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_toRightOf="@id/date"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:src="@drawable/ic_notify_quicksettings"
+ android:contentDescription="@string/accessibility_settings_button"
+ />
+
+ <ImageView android:id="@+id/clear_all_button"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentRight="true"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:src="@drawable/ic_notify_clear"
+ android:contentDescription="@string/accessibility_clear_all"
+ />
+ </RelativeLayout>
+ </LinearLayout>
<View
android:layout_width="match_parent"
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 3c9d12c..d5dce20 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -75,6 +75,8 @@ import java.util.ArrayList;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarNotification;
+import com.android.systemui.statusbar.powerwidget.PowerWidget;
+
import com.android.systemui.R;
import com.android.systemui.recent.RecentTasksLoader;
import com.android.systemui.recent.RecentsPanelView;
@@ -193,6 +195,9 @@ public class PhoneStatusBar extends StatusBar {
int mTrackingPosition; // the position of the top of the tracking view.
private boolean mPanelSlightlyVisible;
+ // the power widget
+ PowerWidget mPowerWidget;
+
// ticker
private Ticker mTicker;
private View mTickerView;
@@ -332,6 +337,19 @@ public class PhoneStatusBar extends StatusBar {
mSettingsButton.setOnClickListener(mSettingsButtonListener);
mScrollView = (ScrollView)expanded.findViewById(R.id.scroll);
+
+ mPowerWidget = (PowerWidget)expanded.findViewById(R.id.exp_power_stat);
+ mPowerWidget.setupSettingsObserver(mHandler);
+ mPowerWidget.setGlobalButtonOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ if(Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.EXPANDED_HIDE_ONCHANGE, 0) == 1) {
+ animateCollapse();
+ }
+ }
+ });
+
+
mTicker = new MyTicker(context, sb);
TickerView tickerView = (TickerView)sb.findViewById(R.id.tickerText);
@@ -372,6 +390,8 @@ public class PhoneStatusBar extends StatusBar {
filter.addAction(Intent.ACTION_SCREEN_OFF);
context.registerReceiver(mBroadcastReceiver, filter);
+ mPowerWidget.setupWidget();
+
return sb;
}
@@ -519,6 +539,7 @@ public class PhoneStatusBar extends StatusBar {
StatusBarIconView view = new StatusBarIconView(mContext, slot, null);
view.set(icon);
mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconSize, mIconSize));
+ mPowerWidget.updateWidget();
}
public void updateIcon(String slot, int index, int viewIndex,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/AirplaneButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/AirplaneButton.java
new file mode 100644
index 0000000..7e2f20c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/AirplaneButton.java
@@ -0,0 +1,66 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.provider.Settings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AirplaneButton extends PowerButton {
+
+ private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
+ static {
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON));
+ }
+
+ public AirplaneButton() { mType = BUTTON_AIRPLANE; }
+
+ @Override
+ protected void updateState() {
+ if (getState(mView.getContext())) {
+ mIcon = R.drawable.stat_airplane_on;
+ mState = STATE_ENABLED;
+ } else {
+ mIcon = R.drawable.stat_airplane_off;
+ mState = STATE_DISABLED;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ Context context = mView.getContext();
+ boolean state = getState(context);
+ Settings.System.putInt(context.getContentResolver(),
+ Settings.System.AIRPLANE_MODE_ON, state ? 0 : 1);
+ // notify change
+ Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ // Reverse state when sending the intent, since we grabbed it before the toggle.
+ intent.putExtra("state", !state);
+ context.sendBroadcast(intent);
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.AIRPLANE_MODE_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ protected List<Uri> getObservedUris() {
+ return OBSERVED_URIS;
+ }
+
+ private static boolean getState(Context context) {
+ return Settings.System.getInt(context.getContentResolver(),
+ Settings.System.AIRPLANE_MODE_ON,0) == 1;
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/AutoRotateButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/AutoRotateButton.java
new file mode 100644
index 0000000..81262c5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/AutoRotateButton.java
@@ -0,0 +1,67 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.provider.Settings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AutoRotateButton extends PowerButton {
+
+ private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
+ static {
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION));
+ }
+
+ public AutoRotateButton() { mType = BUTTON_AUTOROTATE; }
+
+ @Override
+ protected void updateState() {
+ if (getOrientationState(mView.getContext()) == 1) {
+ mIcon = R.drawable.stat_orientation_on;
+ mState = STATE_ENABLED;
+ } else {
+ mIcon = R.drawable.stat_orientation_off;
+ mState = STATE_DISABLED;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ Context context = mView.getContext();
+ if(getOrientationState(context) == 0) {
+ Settings.System.putInt(
+ context.getContentResolver(),
+ Settings.System.ACCELEROMETER_ROTATION, 1);
+ } else {
+ Settings.System.putInt(
+ context.getContentResolver(),
+ Settings.System.ACCELEROMETER_ROTATION, 0);
+ }
+ }
+
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.DISPLAY_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ protected List<Uri> getObservedUris() {
+ return OBSERVED_URIS;
+ }
+
+ private static int getOrientationState(Context context) {
+ return Settings.System.getInt(
+ context.getContentResolver(),
+ Settings.System.ACCELEROMETER_ROTATION, 0);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/BluetoothButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/BluetoothButton.java
new file mode 100644
index 0000000..fad57d3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/BluetoothButton.java
@@ -0,0 +1,132 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.os.AsyncTask;
+
+public class BluetoothButton extends PowerButton {
+
+ private static final StateTracker sBluetoothState = new BluetoothStateTracker();
+
+ private static final class BluetoothStateTracker extends StateTracker {
+
+ @Override
+ public int getActualState(Context context) {
+ BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ if (mBluetoothAdapter == null) {
+ return STATE_UNKNOWN; // On emulator?
+ }
+ return bluetoothStateToFiveState(mBluetoothAdapter
+ .getState());
+ }
+
+ @Override
+ protected void requestStateChange(Context context,
+ final boolean desiredState) {
+ // Actually request the Bluetooth change and persistent
+ // settings write off the UI thread, as it can take a
+ // user-noticeable amount of time, especially if there's
+ // disk contention.
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... args) {
+ BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ if(mBluetoothAdapter.isEnabled()) {
+ mBluetoothAdapter.disable();
+ } else {
+ mBluetoothAdapter.enable();
+ }
+ return null;
+ }
+ }.execute();
+ }
+
+ @Override
+ public void onActualStateChange(Context context, Intent intent) {
+ if (!BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent
+ .getAction())) {
+ return;
+ }
+ int bluetoothState = intent.getIntExtra(
+ BluetoothAdapter.EXTRA_STATE, -1);
+ setCurrentState(context, bluetoothStateToFiveState(bluetoothState));
+ }
+
+ /**
+ * Converts BluetoothAdapter's state values into our
+ * Wifi/Bluetooth-common state values.
+ */
+ private static int bluetoothStateToFiveState(int bluetoothState) {
+ switch (bluetoothState) {
+ case BluetoothAdapter.STATE_OFF:
+ return STATE_DISABLED;
+ case BluetoothAdapter.STATE_ON:
+ return STATE_ENABLED;
+ case BluetoothAdapter.STATE_TURNING_ON:
+ return STATE_TURNING_ON;
+ case BluetoothAdapter.STATE_TURNING_OFF:
+ return STATE_TURNING_OFF;
+ default:
+ return STATE_UNKNOWN;
+ }
+ }
+ }
+
+ public BluetoothButton() { mType = BUTTON_BLUETOOTH; }
+
+ @Override
+ protected void updateState() {
+ mState = sBluetoothState.getTriState(mView.getContext());
+ switch (mState) {
+ case STATE_DISABLED:
+ mIcon = R.drawable.stat_bluetooth_off;
+ break;
+ case STATE_ENABLED:
+ mIcon = R.drawable.stat_bluetooth_on;
+ break;
+ case STATE_INTERMEDIATE:
+ // In the transitional state, the bottom green bar
+ // shows the tri-state (on, off, transitioning), but
+ // the top dark-gray-or-bright-white logo shows the
+ // user's intent. This is much easier to see in
+ // sunlight.
+ if (sBluetoothState.isTurningOn()) {
+ mIcon = R.drawable.stat_bluetooth_on;
+ } else {
+ mIcon = R.drawable.stat_bluetooth_off;
+ }
+ break;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ sBluetoothState.toggleState(mView.getContext());
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.BLUETOOTH_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ sBluetoothState.onActualStateChange(context, intent);
+ }
+
+ @Override
+ protected IntentFilter getBroadcastIntentFilter() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+ return filter;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/BrightnessButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/BrightnessButton.java
new file mode 100644
index 0000000..1804cf38
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/BrightnessButton.java
@@ -0,0 +1,204 @@
+
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.IPowerManager;
+import android.os.Power;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.preference.ListPreferenceMultiSelect;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BrightnessButton extends PowerButton {
+
+ private static final String TAG = "BrightnessButton";
+
+ /**
+ * Minimum and maximum brightnesses. Don't go to 0 since that makes the
+ * display unusable
+ */
+ private static final int MIN_BACKLIGHT = Power.BRIGHTNESS_DIM + 10;
+ private static final int MAX_BACKLIGHT = Power.BRIGHTNESS_ON;
+
+ // Auto-backlight level
+ private static final int AUTO_BACKLIGHT = -1;
+ // Mid-range brightness values + thresholds
+ private static final int LOW_BACKLIGHT = (int) (MAX_BACKLIGHT * 0.25f);
+ private static final int MID_BACKLIGHT = (int) (MAX_BACKLIGHT * 0.5f);
+ private static final int HIGH_BACKLIGHT = (int) (MAX_BACKLIGHT * 0.75f);
+
+ // Defaults for now. MIN_BACKLIGHT will be replaced later
+ private static final int[] BACKLIGHTS = new int[] {
+ AUTO_BACKLIGHT, MIN_BACKLIGHT, LOW_BACKLIGHT, MID_BACKLIGHT, HIGH_BACKLIGHT,
+ MAX_BACKLIGHT
+ };
+
+ private static final Uri BRIGHTNESS_URI = Settings.System
+ .getUriFor(Settings.System.SCREEN_BRIGHTNESS);
+ private static final Uri BRIGHTNESS_MODE_URI = Settings.System
+ .getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
+ private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
+ static {
+ OBSERVED_URIS.add(BRIGHTNESS_URI);
+ OBSERVED_URIS.add(BRIGHTNESS_MODE_URI);
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.LIGHT_SENSOR_CUSTOM));
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.LIGHT_SCREEN_DIM));
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.EXPANDED_BRIGHTNESS_MODE));
+ }
+
+ private boolean mAutoBrightnessSupported = false;
+
+ private boolean mAutoBrightness = false;
+
+ private int mCurrentBrightness;
+
+ private int mCurrentBacklightIndex = 0;
+
+ private int[] mBacklightValues = new int[] {
+ 0, 1, 2, 3, 4, 5
+ };
+
+ public BrightnessButton() {
+ mType = BUTTON_BRIGHTNESS;
+ }
+
+ @Override
+ protected void setupButton(View view) {
+ super.setupButton(view);
+ if (mView != null) {
+ Context context = mView.getContext();
+ mAutoBrightnessSupported = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_automatic_brightness_available);
+ updateSettings();
+ }
+ }
+
+ @Override
+ protected void updateState() {
+ if (mAutoBrightness) {
+ mIcon = R.drawable.stat_brightness_auto;
+ mState = STATE_ENABLED;
+ } else if (mCurrentBrightness <= LOW_BACKLIGHT) {
+ mIcon = R.drawable.stat_brightness_off;
+ mState = STATE_DISABLED;
+ } else if (mCurrentBrightness <= MID_BACKLIGHT) {
+ mIcon = R.drawable.stat_brightness_mid;
+ mState = STATE_INTERMEDIATE;
+ } else {
+ mIcon = R.drawable.stat_brightness_on;
+ mState = STATE_ENABLED;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ try {
+ IPowerManager power = IPowerManager.Stub
+ .asInterface(ServiceManager.getService("power"));
+ if (power != null) {
+ ContentResolver resolver = mView.getContext().getContentResolver();
+ mCurrentBacklightIndex++;
+ if (mCurrentBacklightIndex > mBacklightValues.length - 1) {
+ mCurrentBacklightIndex = 0;
+ }
+ int backlightIndex = mBacklightValues[mCurrentBacklightIndex];
+ int brightness = BACKLIGHTS[backlightIndex];
+ if (brightness == AUTO_BACKLIGHT) {
+ Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+ } else {
+ if (mAutoBrightnessSupported) {
+ Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+ }
+ power.setBacklightBrightness(brightness);
+ Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, brightness);
+ }
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "toggleState()", e);
+ }
+
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.DISPLAY_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ protected List<Uri> getObservedUris() {
+ return OBSERVED_URIS;
+ }
+
+ @Override
+ protected void onChangeUri(Uri uri) {
+ ContentResolver resolver = mView.getContext().getContentResolver();
+ if (BRIGHTNESS_URI.equals(uri)) {
+ mCurrentBrightness = Settings.System.getInt(resolver,
+ Settings.System.SCREEN_BRIGHTNESS, 0);
+ } else if (BRIGHTNESS_MODE_URI.equals(uri)) {
+ mAutoBrightness = (Settings.System.getInt(resolver,
+ Settings.System.SCREEN_BRIGHTNESS_MODE, 0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+ } else {
+ updateSettings();
+ }
+ }
+
+ private void updateSettings() {
+ ContentResolver resolver = mView.getContext().getContentResolver();
+
+ boolean lightSensorCustom = (Settings.System.getInt(resolver,
+ Settings.System.LIGHT_SENSOR_CUSTOM, 0) != 0);
+ if (lightSensorCustom) {
+ BACKLIGHTS[1] = Settings.System.getInt(resolver, Settings.System.LIGHT_SCREEN_DIM,
+ MIN_BACKLIGHT);
+ } else {
+ BACKLIGHTS[1] = MIN_BACKLIGHT;
+ }
+
+ String[] modes = ListPreferenceMultiSelect.parseStoredValue(Settings.System.getString(
+ resolver, Settings.System.EXPANDED_BRIGHTNESS_MODE));
+ if (modes == null || modes.length == 0) {
+ mBacklightValues = new int[] {
+ 0, 1, 2, 3, 4, 5
+ };
+ } else {
+ mBacklightValues = new int[modes.length];
+ for (int i = 0; i < modes.length; i++) {
+ mBacklightValues[i] = Integer.valueOf(modes[i]);
+ }
+ }
+
+ mAutoBrightness = (Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
+ 0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+ if (mAutoBrightness) {
+ mCurrentBrightness = AUTO_BACKLIGHT;
+ } else {
+ mCurrentBrightness = Settings.System.getInt(resolver,
+ Settings.System.SCREEN_BRIGHTNESS, -1);
+ for (int i = 0; i < BACKLIGHTS.length; i++) {
+ if (mCurrentBrightness == BACKLIGHTS[i]) {
+ mCurrentBacklightIndex = i;
+ break;
+ }
+ }
+ }
+ updateState();
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/FlashlightButton.java.no_build b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/FlashlightButton.java.no_build
new file mode 100644
index 0000000..a9f17bc
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/FlashlightButton.java.no_build
@@ -0,0 +1,59 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.provider.Settings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class FlashlightButton extends PowerButton {
+
+ private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
+ static {
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.TORCH_STATE));
+ }
+
+ public FlashlightButton() { mType = BUTTON_FLASHLIGHT; }
+
+ @Override
+ protected void updateState() {
+ boolean enabled = Settings.System.getInt(mView.getContext().getContentResolver(), Settings.System.TORCH_STATE, 0) == 1;
+ if(enabled) {
+ mIcon = R.drawable.stat_flashlight_on;
+ mState = STATE_ENABLED;
+ } else {
+ mIcon = R.drawable.stat_flashlight_off;
+ mState = STATE_DISABLED;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ Context context = mView.getContext();
+ boolean bright = Settings.System.getInt(context.getContentResolver(),
+ Settings.System.EXPANDED_FLASH_MODE, 0) == 1;
+ Intent i = new Intent("net.cactii.flash2.TOGGLE_FLASHLIGHT");
+ i.putExtra("bright", bright);
+ context.sendBroadcast(i);
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ // it may be better to make an Intent action for the Torch
+ // we may want to look at that option later
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClassName("net.cactii.flash2", "net.cactii.flash2.MainActivity");
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ protected List<Uri> getObservedUris() {
+ return OBSERVED_URIS;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/GPSButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/GPSButton.java
new file mode 100644
index 0000000..32a1ea3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/GPSButton.java
@@ -0,0 +1,63 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.location.LocationManager;
+import android.net.Uri;
+import android.provider.Settings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GPSButton extends PowerButton {
+
+ private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
+ static {
+ OBSERVED_URIS.add(Settings.Secure.getUriFor(Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
+ }
+
+ public GPSButton() { mType = BUTTON_GPS; }
+
+ @Override
+ protected void updateState() {
+ if(getGpsState(mView.getContext())) {
+ mIcon = R.drawable.stat_gps_on;
+ mState = STATE_ENABLED;
+ } else {
+ mIcon = R.drawable.stat_gps_off;
+ mState = STATE_DISABLED;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ Context context = mView.getContext();
+ ContentResolver resolver = context.getContentResolver();
+ boolean enabled = getGpsState(context);
+ Settings.Secure.setLocationProviderEnabled(resolver,
+ LocationManager.GPS_PROVIDER, !enabled);
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.LOCATION_SOURCE_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ protected List<Uri> getObservedUris() {
+ return OBSERVED_URIS;
+ }
+
+ private static boolean getGpsState(Context context) {
+ ContentResolver resolver = context.getContentResolver();
+ return Settings.Secure.isLocationProviderEnabled(resolver,
+ LocationManager.GPS_PROVIDER);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/LockScreenButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/LockScreenButton.java
new file mode 100644
index 0000000..a36c495
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/LockScreenButton.java
@@ -0,0 +1,88 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.app.Activity;
+import android.app.KeyguardManager;
+import android.app.KeyguardManager.KeyguardLock;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.view.Gravity;
+import android.widget.Toast;
+
+public class LockScreenButton extends PowerButton {
+
+ private static Boolean LOCK_SCREEN_STATE = null;
+
+ private KeyguardLock mLock = null;
+
+ public LockScreenButton() { mType = BUTTON_LOCKSCREEN; }
+
+ @Override
+ protected void updateState() {
+ getState();
+ if (LOCK_SCREEN_STATE == null) {
+ mIcon = R.drawable.stat_lock_screen_off;
+ mState = STATE_INTERMEDIATE;
+ } else if (LOCK_SCREEN_STATE) {
+ mIcon = R.drawable.stat_lock_screen_on;
+ mState = STATE_ENABLED;
+ } else {
+ mIcon = R.drawable.stat_lock_screen_off;
+ mState = STATE_DISABLED;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ Context context = mView.getContext();
+ getState();
+ if(LOCK_SCREEN_STATE == null) {
+ Toast msg = Toast.makeText(context, "Not yet initialized", Toast.LENGTH_LONG);
+ msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
+ msg.show();
+ } else {
+ getLock(context);
+ if (mLock != null) {
+ if (LOCK_SCREEN_STATE) {
+ mLock.disableKeyguard();
+ LOCK_SCREEN_STATE = false;
+ } else {
+ mLock.reenableKeyguard();
+ LOCK_SCREEN_STATE = true;
+ }
+ }
+ }
+
+ // we're handling this, so just update our buttons now
+ // this is UGLY, do it better later >.>
+ update();
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.SECURITY_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ private KeyguardLock getLock(Context context) {
+ if (mLock == null) {
+ KeyguardManager keyguardManager = (KeyguardManager)context.
+ getSystemService(Activity.KEYGUARD_SERVICE);
+ mLock = keyguardManager.newKeyguardLock(Context.KEYGUARD_SERVICE);
+ }
+ return mLock;
+ }
+
+ private static boolean getState() {
+ if (LOCK_SCREEN_STATE == null) {
+ LOCK_SCREEN_STATE = true;
+ }
+ return LOCK_SCREEN_STATE;
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaKeyEventButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaKeyEventButton.java
new file mode 100644
index 0000000..f722036
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaKeyEventButton.java
@@ -0,0 +1,41 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.os.SystemClock;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+
+public abstract class MediaKeyEventButton extends PowerButton {
+ private static final String TAG = "MediaKeyEventButton";
+
+ private static AudioManager AUDIO_MANAGER = null;
+
+ protected void sendMediaKeyEvent(int code) {
+ Context context = mView.getContext();
+ long eventtime = SystemClock.uptimeMillis();
+
+ Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
+ KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, code, 0);
+ downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
+ context.sendOrderedBroadcast(downIntent, null);
+
+ Intent upIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
+ KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, code, 0);
+ upIntent.putExtra(Intent.EXTRA_KEY_EVENT, upEvent);
+ context.sendOrderedBroadcast(upIntent, null);
+ }
+
+ protected static AudioManager getAudioManager(Context context) {
+ if(AUDIO_MANAGER == null) {
+ AUDIO_MANAGER = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ }
+
+ return AUDIO_MANAGER;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaNextButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaNextButton.java
new file mode 100644
index 0000000..d416c9a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaNextButton.java
@@ -0,0 +1,26 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.view.KeyEvent;
+
+public class MediaNextButton extends MediaKeyEventButton {
+ public MediaNextButton() { mType = BUTTON_MEDIA_NEXT; }
+
+ @Override
+ protected void updateState() {
+ mIcon = R.drawable.stat_media_next;
+ mState = STATE_DISABLED;
+ }
+
+ @Override
+ protected void toggleState() {
+ sendMediaKeyEvent(KeyEvent.KEYCODE_MEDIA_NEXT);
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ return false;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaPlayPauseButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaPlayPauseButton.java
new file mode 100644
index 0000000..ea814e3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaPlayPauseButton.java
@@ -0,0 +1,57 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.view.KeyEvent;
+
+public class MediaPlayPauseButton extends MediaKeyEventButton {
+ public MediaPlayPauseButton() { mType = BUTTON_MEDIA_PLAY_PAUSE; }
+
+ private static final int MEDIA_STATE_UNKNOWN = -1;
+ private static final int MEDIA_STATE_INACTIVE = 0;
+ private static final int MEDIA_STATE_ACTIVE = 1;
+
+ private int mCurrentState = MEDIA_STATE_UNKNOWN;
+
+ @Override
+ protected void updateState() {
+ mState = STATE_DISABLED;
+ if(isMusicActive()) {
+ mIcon = R.drawable.stat_media_pause;
+ } else {
+ mIcon = R.drawable.stat_media_play;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ sendMediaKeyEvent(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
+
+ mCurrentState = (isMusicActive() ? MEDIA_STATE_INACTIVE : MEDIA_STATE_ACTIVE);
+
+ update();
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ return false;
+ }
+
+ private boolean isMusicActive() {
+ if(mCurrentState == MEDIA_STATE_UNKNOWN) {
+ mCurrentState = MEDIA_STATE_INACTIVE;
+ AudioManager am = getAudioManager(mView.getContext());
+ if(am != null) {
+ mCurrentState = (am.isMusicActive() ? MEDIA_STATE_ACTIVE : MEDIA_STATE_INACTIVE);
+ }
+
+ return (mCurrentState == MEDIA_STATE_ACTIVE);
+ } else {
+ boolean active = (mCurrentState == MEDIA_STATE_ACTIVE);
+ mCurrentState = MEDIA_STATE_UNKNOWN;
+ return active;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaPreviousButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaPreviousButton.java
new file mode 100644
index 0000000..b7657f6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MediaPreviousButton.java
@@ -0,0 +1,26 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.view.KeyEvent;
+
+public class MediaPreviousButton extends MediaKeyEventButton {
+ public MediaPreviousButton() { mType = BUTTON_MEDIA_PREVIOUS; }
+
+ @Override
+ protected void updateState() {
+ mIcon = R.drawable.stat_media_previous;
+ mState = STATE_DISABLED;
+ }
+
+ @Override
+ protected void toggleState() {
+ sendMediaKeyEvent(KeyEvent.KEYCODE_MEDIA_PREVIOUS);
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ return false;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MobileDataButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MobileDataButton.java
new file mode 100644
index 0000000..d5d3282
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MobileDataButton.java
@@ -0,0 +1,88 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.net.ConnectivityManager;
+import android.provider.Settings;
+
+import com.android.internal.telephony.TelephonyIntents;
+
+public class MobileDataButton extends PowerButton {
+
+ public static final String MOBILE_DATA_CHANGED = "com.android.internal.telephony.MOBILE_DATA_CHANGED";
+
+ public static boolean STATE_CHANGE_REQUEST = false;
+
+ public MobileDataButton() { mType = BUTTON_MOBILEDATA; }
+
+ @Override
+ protected void updateState() {
+ if (STATE_CHANGE_REQUEST) {
+ mIcon = R.drawable.stat_data_on;
+ mState = STATE_INTERMEDIATE;
+ } else if (getDataState(mView.getContext())) {
+ mIcon = R.drawable.stat_data_on;
+ mState = STATE_ENABLED;
+ } else {
+ mIcon = R.drawable.stat_data_off;
+ mState = STATE_DISABLED;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ Context context = mView.getContext();
+ boolean enabled = getDataState(context);
+
+ ConnectivityManager cm = (ConnectivityManager) context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (enabled) {
+ cm.setMobileDataEnabled(false);
+ } else {
+ cm.setMobileDataEnabled(true);
+ }
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ // it may be better to make an Intent action for this or find the appropriate one
+ // we may want to look at that option later
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClassName("com.android.phone", "com.android.phone.Settings");
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ protected IntentFilter getBroadcastIntentFilter() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
+ return filter;
+ }
+
+ private static boolean getDataRomingEnabled(Context context) {
+ return Settings.Secure.getInt(context.getContentResolver(),
+ Settings.Secure.DATA_ROAMING,0) > 0;
+ }
+
+ private static boolean getDataState(Context context) {
+ ConnectivityManager cm = (ConnectivityManager) context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ return cm.getMobileDataEnabled();
+ }
+
+ public void networkModeChanged(Context context, int networkMode) {
+ if (STATE_CHANGE_REQUEST) {
+ ConnectivityManager cm = (ConnectivityManager) context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ cm.setMobileDataEnabled(true);
+ STATE_CHANGE_REQUEST=false;
+ }
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/NetworkModeButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/NetworkModeButton.java
new file mode 100644
index 0000000..8aa5e5c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/NetworkModeButton.java
@@ -0,0 +1,204 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.Uri;
+import android.provider.Settings.SettingNotFoundException;
+import android.provider.Settings;
+import android.util.Log;
+
+import com.android.internal.telephony.Phone;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NetworkModeButton extends PowerButton{
+ private static final String TAG = "NetworkModeButton";
+
+ private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
+ static {
+ OBSERVED_URIS.add(Settings.Secure.getUriFor(Settings.Secure.PREFERRED_NETWORK_MODE));
+ }
+
+ // retrieved from Phone.apk
+ public static final String ACTION_NETWORK_MODE_CHANGED = "com.android.internal.telephony.NETWORK_MODE_CHANGED";
+ public static final String ACTION_REQUEST_NETWORK_MODE = "com.android.internal.telephony.REQUEST_NETWORK_MODE";
+ public static final String ACTION_MODIFY_NETWORK_MODE = "com.android.internal.telephony.MODIFY_NETWORK_MODE";
+ public static final String EXTRA_NETWORK_MODE = "networkMode";
+
+ private static final int NO_NETWORK_MODE_YET = -99;
+ private static final int NETWORK_MODE_UNKNOWN = -100;
+
+ private static final int CM_MODE_3G2G = 0;
+ private static final int CM_MODE_3GONLY = 1;
+ private static final int CM_MODE_BOTH = 2;
+
+ private static int NETWORK_MODE = NO_NETWORK_MODE_YET;
+ private static int INTENDED_NETWORK_MODE = NO_NETWORK_MODE_YET;
+ private static int CURRENT_INTERNAL_STATE = STATE_INTERMEDIATE;
+
+ public NetworkModeButton() { mType = BUTTON_NETWORKMODE; }
+
+ @Override
+ protected void updateState() {
+ Context context = mView.getContext();
+ NETWORK_MODE = get2G3G(context);
+ mState = networkModeToState(context);
+
+ switch (mState) {
+ case STATE_DISABLED:
+ mIcon = R.drawable.stat_2g3g_off;
+ break;
+ case STATE_ENABLED:
+ if (NETWORK_MODE == Phone.NT_MODE_WCDMA_ONLY) {
+ mIcon = R.drawable.stat_3g_on;
+ } else {
+ mIcon = R.drawable.stat_2g3g_on;
+ }
+ break;
+ case STATE_INTERMEDIATE:
+ // In the transitional state, the bottom green bar
+ // shows the tri-state (on, off, transitioning), but
+ // the top dark-gray-or-bright-white logo shows the
+ // user's intent. This is much easier to see in
+ // sunlight.
+ if (CURRENT_INTERNAL_STATE == STATE_TURNING_ON) {
+ if (INTENDED_NETWORK_MODE == Phone.NT_MODE_WCDMA_ONLY) {
+ mIcon = R.drawable.stat_3g_on;
+ } else {
+ mIcon = R.drawable.stat_2g3g_on;
+ }
+ } else {
+ mIcon = R.drawable.stat_2g3g_off;
+ }
+ break;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ Context context = mView.getContext();
+ int currentMode = getCurrentCMMode(context);
+
+ Intent intent = new Intent(ACTION_MODIFY_NETWORK_MODE);
+ switch (NETWORK_MODE) {
+ case Phone.NT_MODE_WCDMA_PREF:
+ case Phone.NT_MODE_GSM_UMTS:
+ intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_GSM_ONLY);
+ CURRENT_INTERNAL_STATE = STATE_TURNING_OFF;
+ INTENDED_NETWORK_MODE=Phone.NT_MODE_GSM_ONLY;
+ break;
+ case Phone.NT_MODE_WCDMA_ONLY:
+ if(currentMode == CM_MODE_3GONLY) {
+ intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_GSM_ONLY);
+ CURRENT_INTERNAL_STATE = STATE_TURNING_OFF;
+ INTENDED_NETWORK_MODE = Phone.NT_MODE_GSM_ONLY;
+ } else {
+ intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_WCDMA_PREF);
+ CURRENT_INTERNAL_STATE = STATE_TURNING_ON;
+ INTENDED_NETWORK_MODE = Phone.NT_MODE_WCDMA_PREF;
+ }
+ break;
+ case Phone.NT_MODE_GSM_ONLY:
+ if(currentMode == CM_MODE_3GONLY || currentMode == CM_MODE_BOTH) {
+ intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_WCDMA_ONLY);
+ CURRENT_INTERNAL_STATE = STATE_TURNING_ON;
+ INTENDED_NETWORK_MODE = Phone.NT_MODE_WCDMA_ONLY;
+ } else {
+ intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_WCDMA_PREF);
+ CURRENT_INTERNAL_STATE = STATE_TURNING_ON;
+ INTENDED_NETWORK_MODE = Phone.NT_MODE_WCDMA_PREF;
+ }
+ break;
+ }
+
+ NETWORK_MODE = NETWORK_MODE_UNKNOWN;
+ context.sendBroadcast(intent);
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ // it may be better to make an Intent action for this or find the appropriate one
+ // we may want to look at that option later
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClassName("com.android.phone", "com.android.phone.Settings");
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getExtras() != null) {
+ NETWORK_MODE = intent.getExtras().getInt(EXTRA_NETWORK_MODE);
+ //Update to actual state
+ INTENDED_NETWORK_MODE = NETWORK_MODE;
+ }
+
+ //need to clear intermediate states
+ CURRENT_INTERNAL_STATE = STATE_ENABLED;
+
+ int widgetState = networkModeToState(context);
+ CURRENT_INTERNAL_STATE = widgetState;
+ if (widgetState == STATE_ENABLED) {
+ MobileDataButton mdb = (MobileDataButton)getLoadedButton(BUTTON_MOBILEDATA);
+ if(mdb != null) {
+ mdb.networkModeChanged(context, NETWORK_MODE);
+ }
+ }
+ }
+
+ @Override
+ protected IntentFilter getBroadcastIntentFilter() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(ACTION_NETWORK_MODE_CHANGED);
+ return filter;
+ }
+
+ @Override
+ protected List<Uri> getObservedUris() {
+ return OBSERVED_URIS;
+ }
+
+ private static int get2G3G(Context context) {
+ int state = 99;
+ try {
+ state = Settings.Secure.getInt(context.getContentResolver(),
+ Settings.Secure.PREFERRED_NETWORK_MODE);
+ } catch (SettingNotFoundException e) {
+ }
+ return state;
+ }
+
+ private static int networkModeToState(Context context) {
+ if (CURRENT_INTERNAL_STATE == STATE_TURNING_ON ||
+ CURRENT_INTERNAL_STATE == STATE_TURNING_OFF)
+ return STATE_INTERMEDIATE;
+
+ switch(NETWORK_MODE) {
+ case Phone.NT_MODE_WCDMA_PREF:
+ case Phone.NT_MODE_WCDMA_ONLY:
+ case Phone.NT_MODE_GSM_UMTS:
+ return STATE_ENABLED;
+ case Phone.NT_MODE_GSM_ONLY:
+ return STATE_DISABLED;
+ case Phone.NT_MODE_CDMA:
+ case Phone.NT_MODE_CDMA_NO_EVDO:
+ case Phone.NT_MODE_EVDO_NO_CDMA:
+ case Phone.NT_MODE_GLOBAL:
+ // need to check wtf is going on
+ Log.d(TAG, "Unexpected network mode (" + NETWORK_MODE + ")");
+ return STATE_DISABLED;
+ }
+ return STATE_INTERMEDIATE;
+ }
+
+ private static int getCurrentCMMode(Context context) {
+ return Settings.System.getInt(context.getContentResolver(),
+ Settings.System.EXPANDED_NETWORK_MODE,
+ CM_MODE_3G2G);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerButton.java
new file mode 100644
index 0000000..1ea4016
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerButton.java
@@ -0,0 +1,367 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.graphics.PorterDuff.Mode;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.provider.Settings;
+import android.view.View;
+import android.provider.Settings;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public abstract class PowerButton {
+ public static final String TAG = "PowerButton";
+
+ public static final int STATE_ENABLED = 1;
+ public static final int STATE_DISABLED = 2;
+ public static final int STATE_TURNING_ON = 3;
+ public static final int STATE_TURNING_OFF = 4;
+ public static final int STATE_INTERMEDIATE = 5;
+ public static final int STATE_UNKNOWN = 6;
+
+ public static final String BUTTON_WIFI = "toggleWifi";
+ public static final String BUTTON_GPS = "toggleGPS";
+ public static final String BUTTON_BLUETOOTH = "toggleBluetooth";
+ public static final String BUTTON_BRIGHTNESS = "toggleBrightness";
+ public static final String BUTTON_SOUND = "toggleSound";
+ public static final String BUTTON_SYNC = "toggleSync";
+ public static final String BUTTON_WIFIAP = "toggleWifiAp";
+ public static final String BUTTON_SCREENTIMEOUT = "toggleScreenTimeout";
+ public static final String BUTTON_MOBILEDATA = "toggleMobileData";
+ public static final String BUTTON_LOCKSCREEN = "toggleLockScreen";
+ public static final String BUTTON_NETWORKMODE = "toggleNetworkMode";
+ public static final String BUTTON_AUTOROTATE = "toggleAutoRotate";
+ public static final String BUTTON_AIRPLANE = "toggleAirplane";
+ public static final String BUTTON_FLASHLIGHT = "toggleFlashlight";
+ public static final String BUTTON_SLEEP = "toggleSleepMode";
+ public static final String BUTTON_MEDIA_PLAY_PAUSE = "toggleMediaPlayPause";
+ public static final String BUTTON_MEDIA_PREVIOUS = "toggleMediaPrevious";
+ public static final String BUTTON_MEDIA_NEXT = "toggleMediaNext";
+ public static final String BUTTON_WIMAX = "toggleWimax";
+ public static final String BUTTON_UNKNOWN = "unknown";
+
+ private static final Mode MASK_MODE = Mode.SCREEN;
+
+ // this is a list of all of our buttons and their corresponding classes
+ private static final HashMap<String, Class<? extends PowerButton>> BUTTONS = new HashMap<String, Class<? extends PowerButton>>();
+ static {
+ BUTTONS.put(BUTTON_WIFI, WifiButton.class);
+ BUTTONS.put(BUTTON_GPS, GPSButton.class);
+ BUTTONS.put(BUTTON_BLUETOOTH, BluetoothButton.class);
+ BUTTONS.put(BUTTON_BRIGHTNESS, BrightnessButton.class);
+ BUTTONS.put(BUTTON_SOUND, SoundButton.class);
+ BUTTONS.put(BUTTON_SYNC, SyncButton.class);
+ BUTTONS.put(BUTTON_WIFIAP, WifiApButton.class);
+ BUTTONS.put(BUTTON_SCREENTIMEOUT, ScreenTimeoutButton.class);
+ BUTTONS.put(BUTTON_MOBILEDATA, MobileDataButton.class);
+ BUTTONS.put(BUTTON_LOCKSCREEN, LockScreenButton.class);
+ BUTTONS.put(BUTTON_NETWORKMODE, NetworkModeButton.class);
+ BUTTONS.put(BUTTON_AUTOROTATE, AutoRotateButton.class);
+ BUTTONS.put(BUTTON_AIRPLANE, AirplaneButton.class);
+// BUTTONS.put(BUTTON_FLASHLIGHT, FlashlightButton.class);
+ BUTTONS.put(BUTTON_SLEEP, SleepButton.class);
+ BUTTONS.put(BUTTON_MEDIA_PLAY_PAUSE, MediaPlayPauseButton.class);
+ BUTTONS.put(BUTTON_MEDIA_PREVIOUS, MediaPreviousButton.class);
+ BUTTONS.put(BUTTON_MEDIA_NEXT, MediaNextButton.class);
+ /* BUTTONS.put(BUTTON_WIMAX, WimaxButton.class); */
+ }
+ // this is a list of our currently loaded buttons
+ private static final HashMap<String, PowerButton> BUTTONS_LOADED = new HashMap<String, PowerButton>();
+
+ protected int mIcon;
+ protected int mState;
+ protected View mView;
+ protected String mType = BUTTON_UNKNOWN;
+
+ // a static onclicklistener that can be set to register a callback when ANY button is clicked
+ private static View.OnClickListener GLOBAL_ON_CLICK_LISTENER = null;
+
+ // a static onlongclicklistener that can be set to register a callback when ANY button is long clicked
+ private static View.OnLongClickListener GLOBAL_ON_LONG_CLICK_LISTENER = null;
+
+ // we use this to ensure we update our views on the UI thread
+ private Handler mViewUpdateHandler = new Handler() {
+ public void handleMessage(Message msg) {
+ // this is only used to update the view, so do it
+ if(mView != null) {
+ Context context = mView.getContext();
+ Resources res = context.getResources();
+ int buttonLayer = R.id.power_widget_button;
+ int buttonIcon = R.id.power_widget_button_image;
+ int buttonState = R.id.power_widget_button_indic;
+ ImageView indic = (ImageView)mView.findViewById(R.id.power_widget_button_indic);
+ if ((Settings.System.getInt(context.getContentResolver(),Settings.System.EXPANDED_HIDE_INDICATOR, 0)) == 1){
+ indic.setVisibility(8);
+ }else{
+ indic.setVisibility(0);
+ }
+ updateImageView(buttonIcon, mIcon);
+
+ int sColorMaskBase = Settings.System.getInt(context.getContentResolver(),
+ Settings.System.EXPANDED_VIEW_WIDGET_COLOR, 0xFF33B5E5);
+ int sColorMaskOn = (sColorMaskBase & 0x00FFFFFF) | 0xA0000000;
+ int sColorMaskOff = (sColorMaskBase & 0x00FFFFFF) | 0x33000000;
+ int sColorMaskInter = (sColorMaskBase & 0x00FFFFFF) | 0x60000000;
+
+ /* Button State */
+ switch(mState) {
+ case STATE_ENABLED:
+ updateImageView(buttonState,
+ res.getDrawable(R.drawable.stat_bgon_custom, sColorMaskOn, MASK_MODE));
+ break;
+ case STATE_DISABLED:
+ updateImageView(buttonState,
+ res.getDrawable(R.drawable.stat_bgon_custom, sColorMaskOff, MASK_MODE));
+ break;
+ default:
+ updateImageView(buttonState,
+ res.getDrawable(R.drawable.stat_bgon_custom, sColorMaskInter, MASK_MODE));
+ break;
+ }
+ }
+ }
+ };
+
+ protected abstract void updateState();
+ protected abstract void toggleState();
+ protected abstract boolean handleLongClick();
+
+ protected void update() {
+ updateState();
+ updateView();
+ }
+
+ protected void onReceive(Context context, Intent intent) {
+ // do nothing as a standard, override this if the button needs to respond
+ // to broadcast events from the StatusBarService broadcast receiver
+ }
+
+ protected void onChangeUri(Uri uri) {
+ // do nothing as a standard, override this if the button needs to respond
+ // to a changed setting
+ }
+
+ protected IntentFilter getBroadcastIntentFilter() {
+ return new IntentFilter();
+ }
+
+ protected List<Uri> getObservedUris() {
+ return new ArrayList<Uri>();
+ }
+
+ protected void setupButton(View view) {
+ mView = view;
+ if(mView != null) {
+ mView.setTag(mType);
+ mView.setOnClickListener(mClickListener);
+ mView.setOnLongClickListener(mLongClickListener);
+ }
+ }
+
+ protected void updateView() {
+ mViewUpdateHandler.sendEmptyMessage(0);
+ }
+
+ private void updateImageView(int id, int resId) {
+ ImageView imageIcon = (ImageView)mView.findViewById(id);
+ imageIcon.setImageResource(resId);
+ }
+
+ private void updateImageView(int id, Drawable resDraw) {
+ ImageView imageIcon = (ImageView)mView.findViewById(id);
+ imageIcon.setImageResource(R.drawable.stat_bgon_custom);
+ imageIcon.setImageDrawable(resDraw);
+ }
+
+ private View.OnClickListener mClickListener = new View.OnClickListener() {
+ public void onClick(View v) {
+ String type = (String)v.getTag();
+
+ for(Map.Entry<String, PowerButton> entry : BUTTONS_LOADED.entrySet()) {
+ if(entry.getKey().equals(type)) {
+ entry.getValue().toggleState();
+ break;
+ }
+ }
+
+ // call our static listener if it's set
+ if(GLOBAL_ON_CLICK_LISTENER != null) {
+ GLOBAL_ON_CLICK_LISTENER.onClick(v);
+ }
+ }
+ };
+
+ private View.OnLongClickListener mLongClickListener = new View.OnLongClickListener() {
+ public boolean onLongClick(View v) {
+ boolean result = false;
+ String type = (String)v.getTag();
+ for (Map.Entry<String, PowerButton> entry : BUTTONS_LOADED.entrySet()) {
+ if(entry.getKey().endsWith(type)) {
+ result = entry.getValue().handleLongClick();
+ break;
+ }
+ }
+
+ if(result && GLOBAL_ON_LONG_CLICK_LISTENER != null) {
+ GLOBAL_ON_LONG_CLICK_LISTENER.onLongClick(v);
+ }
+ return result;
+ }
+ };
+
+ public static boolean loadButton(String key, View view) {
+ // first make sure we have a valid button
+ if(BUTTONS.containsKey(key) && view != null) {
+ synchronized (BUTTONS_LOADED) {
+ if(BUTTONS_LOADED.containsKey(key)) {
+ // setup the button again
+ BUTTONS_LOADED.get(key).setupButton(view);
+ } else {
+ try {
+ // we need to instantiate a new button and add it
+ PowerButton pb = BUTTONS.get(key).newInstance();
+ // set it up
+ pb.setupButton(view);
+ // save it
+ BUTTONS_LOADED.put(key, pb);
+ } catch(Exception e) {
+ Log.e(TAG, "Error loading button: " + key, e);
+ }
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public static void unloadButton(String key) {
+ synchronized (BUTTONS_LOADED) {
+ // first make sure we have a valid button
+ if(BUTTONS_LOADED.containsKey(key)) {
+ // wipe out the button view
+ BUTTONS_LOADED.get(key).setupButton(null);
+ // remove the button from our list of loaded ones
+ BUTTONS_LOADED.remove(key);
+ }
+ }
+ }
+
+ public static void unloadAllButtons() {
+ synchronized (BUTTONS_LOADED) {
+ // cycle through setting the buttons to null
+ for(PowerButton pb : BUTTONS_LOADED.values()) {
+ pb.setupButton(null);
+ }
+
+ // clear our list
+ BUTTONS_LOADED.clear();
+ }
+ }
+
+ public static void updateAllButtons() {
+ synchronized (BUTTONS_LOADED) {
+ // cycle through our buttons and update them
+ for(PowerButton pb : BUTTONS_LOADED.values()) {
+ pb.update();
+ }
+ }
+ }
+
+ // glue for broadcast receivers
+ public static IntentFilter getAllBroadcastIntentFilters() {
+ IntentFilter filter = new IntentFilter();
+
+ synchronized(BUTTONS_LOADED) {
+ for(PowerButton button : BUTTONS_LOADED.values()) {
+ IntentFilter tmp = button.getBroadcastIntentFilter();
+
+ // cycle through these actions, and see if we need them
+ int num = tmp.countActions();
+ for(int i = 0; i < num; i++) {
+ String action = tmp.getAction(i);
+ if(!filter.hasAction(action)) {
+ filter.addAction(action);
+ }
+ }
+ }
+ }
+
+ // return our merged filter
+ return filter;
+ }
+
+ // glue for content observation
+ public static List<Uri> getAllObservedUris() {
+ List<Uri> uris = new ArrayList<Uri>();
+
+ synchronized(BUTTONS_LOADED) {
+ for(PowerButton button : BUTTONS_LOADED.values()) {
+ List<Uri> tmp = button.getObservedUris();
+
+ for(Uri uri : tmp) {
+ if(!uris.contains(uri)) {
+ uris.add(uri);
+ }
+ }
+ }
+ }
+
+ return uris;
+ }
+
+ public static void handleOnReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+
+ // cycle through power buttons
+ synchronized(BUTTONS_LOADED) {
+ for(PowerButton button : BUTTONS_LOADED.values()) {
+ // call "onReceive" on those that matter
+ if(button.getBroadcastIntentFilter().hasAction(action)) {
+ button.onReceive(context, intent);
+ }
+ }
+ }
+ }
+
+ public static void handleOnChangeUri(Uri uri) {
+ synchronized(BUTTONS_LOADED) {
+ for(PowerButton button : BUTTONS_LOADED.values()) {
+ if(button.getObservedUris().contains(uri)) {
+ button.onChangeUri(uri);
+ }
+ }
+ }
+ }
+
+ public static void setGlobalOnClickListener(View.OnClickListener listener) {
+ GLOBAL_ON_CLICK_LISTENER = listener;
+ }
+
+ public static void setGlobalOnLongClickListener(View.OnLongClickListener listener) {
+ GLOBAL_ON_LONG_CLICK_LISTENER = listener;
+ }
+
+ protected static PowerButton getLoadedButton(String key) {
+ synchronized(BUTTONS_LOADED) {
+ if(BUTTONS_LOADED.containsKey(key)) {
+ return BUTTONS_LOADED.get(key);
+ } else {
+ return null;
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerWidget.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerWidget.java
new file mode 100644
index 0000000..e8ad635
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerWidget.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package com.android.systemui.statusbar.powerwidget;
+
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.net.Uri;
+/* import android.net.wimax.WimaxHelper; */
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.HorizontalScrollView;
+import android.widget.LinearLayout;
+import android.view.ViewGroup;
+
+import com.android.systemui.R;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class PowerWidget extends FrameLayout {
+ private static final String TAG = "PowerWidget";
+
+ public static final String BUTTON_DELIMITER = "|";
+
+ private static final String BUTTONS_DEFAULT = PowerButton.BUTTON_WIFI
+ + BUTTON_DELIMITER + PowerButton.BUTTON_BLUETOOTH
+ + BUTTON_DELIMITER + PowerButton.BUTTON_GPS
+ + BUTTON_DELIMITER + PowerButton.BUTTON_SOUND;
+
+ private static final FrameLayout.LayoutParams WIDGET_LAYOUT_PARAMS = new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT, // width = match_parent
+ ViewGroup.LayoutParams.WRAP_CONTENT // height = wrap_content
+ );
+
+ private static final LinearLayout.LayoutParams BUTTON_LAYOUT_PARAMS = new LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT, // width = wrap_content
+ ViewGroup.LayoutParams.MATCH_PARENT, // height = match_parent
+ 1.0f // weight = 1
+ );
+
+ private static final int LAYOUT_SCROLL_BUTTON_THRESHOLD = 6;
+
+ private Context mContext;
+ private LayoutInflater mInflater;
+ private WidgetBroadcastReceiver mBroadcastReceiver = null;
+ private WidgetSettingsObserver mObserver = null;
+
+ private HorizontalScrollView mScrollView;
+
+ public PowerWidget(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ mContext = context;
+ mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ // get an initial width
+ updateButtonLayoutWidth();
+ setupWidget();
+ updateVisibility();
+ }
+
+ public void setupWidget() {
+ Log.i(TAG, "Clearing any old widget stuffs");
+ // remove all views from the layout
+ removeAllViews();
+
+ // unregister our content receiver
+ if(mBroadcastReceiver != null) {
+ mContext.unregisterReceiver(mBroadcastReceiver);
+ }
+ // unobserve our content
+ if(mObserver != null) {
+ mObserver.unobserve();
+ }
+
+ // clear the button instances
+ PowerButton.unloadAllButtons();
+
+ Log.i(TAG, "Setting up widget");
+
+ String buttons = Settings.System.getString(mContext.getContentResolver(), Settings.System.WIDGET_BUTTONS);
+ if(buttons == null) {
+ Log.i(TAG, "Default buttons being loaded");
+ buttons = BUTTONS_DEFAULT;
+ // Add the WiMAX button if it's supported
+ /* TODO: Fix after WiMax Fixed
+ if (WimaxHelper.isWimaxSupported(mContext)) {
+ buttons += BUTTON_DELIMITER + PowerButton.BUTTON_WIMAX;
+ }
+ */
+ }
+ Log.i(TAG, "Button list: " + buttons);
+
+ // create a linearlayout to hold our buttons
+ LinearLayout ll = new LinearLayout(mContext);
+ ll.setOrientation(LinearLayout.HORIZONTAL);
+ ll.setGravity(Gravity.CENTER_HORIZONTAL);
+
+ int buttonCount = 0;
+ for(String button : buttons.split("\\|")) {
+ Log.i(TAG, "Setting up button: " + button);
+ // inflate our button, we don't add it to a parent and don't do any layout shit yet
+ View buttonView = mInflater.inflate(R.layout.power_widget_button, null, false);
+
+ if(PowerButton.loadButton(button, buttonView)) {
+ // add the button here
+ ll.addView(buttonView, BUTTON_LAYOUT_PARAMS);
+ buttonCount++;
+ } else {
+ Log.e(TAG, "Error setting up button: " + button);
+ }
+ }
+
+ // we determine if we're using a horizontal scroll view based on a threshold of button counts
+ if(buttonCount > LAYOUT_SCROLL_BUTTON_THRESHOLD) {
+ // we need our horizontal scroll view to wrap the linear layout
+ mScrollView = new HorizontalScrollView(mContext);
+ // make the fading edge the size of a button (makes it more noticible that we can scroll
+ mScrollView.setFadingEdgeLength(mContext.getResources().getDisplayMetrics().widthPixels / LAYOUT_SCROLL_BUTTON_THRESHOLD);
+ mScrollView.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
+ mScrollView.setOverScrollMode(View.OVER_SCROLL_NEVER);
+ // set the padding on the linear layout to the size of our scrollbar, so we don't have them overlap
+ ll.setPadding(ll.getPaddingLeft(), ll.getPaddingTop(), ll.getPaddingRight(), mScrollView.getVerticalScrollbarWidth());
+ mScrollView.addView(ll, WIDGET_LAYOUT_PARAMS);
+ updateScrollbar();
+ addView(mScrollView, WIDGET_LAYOUT_PARAMS);
+ } else {
+ // not needed, just add the linear layout
+ addView(ll, WIDGET_LAYOUT_PARAMS);
+ }
+
+ // set up a broadcast receiver for our intents, based off of what our power buttons have been loaded
+ setupBroadcastReceiver();
+ IntentFilter filter = PowerButton.getAllBroadcastIntentFilters();
+ // we add this so we can update views and such if the settings for our widget change
+ filter.addAction(Settings.SETTINGS_CHANGED);
+ // we need to detect orientation changes and update the static button width value appropriately
+ filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+ // register the receiver
+ mContext.registerReceiver(mBroadcastReceiver, filter);
+ // register our observer
+ if(mObserver != null) {
+ mObserver.observe();
+ }
+ }
+
+ public void updateWidget() {
+ PowerButton.updateAllButtons();
+ }
+
+ public void setupSettingsObserver(Handler handler) {
+ if(mObserver == null) {
+ mObserver = new WidgetSettingsObserver(handler);
+ }
+ }
+
+ public void setGlobalButtonOnClickListener(View.OnClickListener listener) {
+ PowerButton.setGlobalOnClickListener(listener);
+ }
+
+ public void setGlobalButtonOnLongClickListener(View.OnLongClickListener listener) {
+ PowerButton.setGlobalOnLongClickListener(listener);
+ }
+
+ private void setupBroadcastReceiver() {
+ if(mBroadcastReceiver == null) {
+ mBroadcastReceiver = new WidgetBroadcastReceiver();
+ }
+ }
+
+ private void updateButtonLayoutWidth() {
+ // use our context to set a valid button width
+ BUTTON_LAYOUT_PARAMS.width = mContext.getResources().getDisplayMetrics().widthPixels / LAYOUT_SCROLL_BUTTON_THRESHOLD;
+ }
+
+ private void updateVisibility() {
+ // now check if we need to display the widget still
+ boolean displayPowerWidget = Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.EXPANDED_VIEW_WIDGET, 1) == 1;
+ if(!displayPowerWidget) {
+ setVisibility(View.GONE);
+ } else {
+ setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void updateScrollbar() {
+ if (mScrollView == null) return;
+ boolean hideScrollBar = Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.EXPANDED_HIDE_SCROLLBAR, 0) == 1;
+ mScrollView.setHorizontalScrollBarEnabled(!hideScrollBar);
+ }
+
+ // our own broadcast receiver :D
+ private class WidgetBroadcastReceiver extends BroadcastReceiver {
+ public void onReceive(Context context, Intent intent) {
+ if(intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
+ updateButtonLayoutWidth();
+ setupWidget();
+ } else {
+ // handle the intent through our power buttons
+ PowerButton.handleOnReceive(context, intent);
+ }
+
+ // update our widget
+ updateWidget();
+ }
+ };
+
+ // our own settings observer :D
+ private class WidgetSettingsObserver extends ContentObserver {
+ public WidgetSettingsObserver(Handler handler) {
+ super(handler);
+ }
+
+ public void observe() {
+ ContentResolver resolver = mContext.getContentResolver();
+
+ // watch for display widget
+ resolver.registerContentObserver(
+ Settings.System.getUriFor(Settings.System.EXPANDED_VIEW_WIDGET),
+ false, this);
+
+ // watch for scrollbar hiding
+ resolver.registerContentObserver(
+ Settings.System.getUriFor(Settings.System.EXPANDED_HIDE_SCROLLBAR),
+ false, this);
+
+ // watch for haptic feedback
+ resolver.registerContentObserver(
+ Settings.System.getUriFor(Settings.System.EXPANDED_HAPTIC_FEEDBACK),
+ false, this);
+
+ // watch for changes in buttons
+ resolver.registerContentObserver(
+ Settings.System.getUriFor(Settings.System.WIDGET_BUTTONS),
+ false, this);
+
+ // watch for changes in color
+ resolver.registerContentObserver(
+ Settings.System.getUriFor(Settings.System.EXPANDED_VIEW_WIDGET_COLOR),
+ false, this);
+
+ // watch for power-button specifc stuff that has been loaded
+ for(Uri uri : PowerButton.getAllObservedUris()) {
+ resolver.registerContentObserver(uri, false, this);
+ }
+ }
+
+ public void unobserve() {
+ ContentResolver resolver = mContext.getContentResolver();
+
+ resolver.unregisterContentObserver(this);
+ }
+
+ @Override
+ public void onChangeUri(Uri uri, boolean selfChange) {
+ ContentResolver resolver = mContext.getContentResolver();
+ Resources res = mContext.getResources();
+
+ // first check if our widget buttons have changed
+ if(uri.equals(Settings.System.getUriFor(Settings.System.WIDGET_BUTTONS))) {
+ setupWidget();
+ // now check if we change visibility
+ } else if(uri.equals(Settings.System.getUriFor(Settings.System.EXPANDED_VIEW_WIDGET))) {
+ updateVisibility();
+ // now check for scrollbar hiding
+ } else if(uri.equals(Settings.System.getUriFor(Settings.System.EXPANDED_HIDE_SCROLLBAR))) {
+ updateScrollbar();
+ }
+
+ // do whatever the individual buttons must
+ PowerButton.handleOnChangeUri(uri);
+
+ // something happened so update the widget
+ updateWidget();
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/ScreenTimeoutButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/ScreenTimeoutButton.java
new file mode 100644
index 0000000..acac53e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/ScreenTimeoutButton.java
@@ -0,0 +1,156 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.provider.Settings;
+import android.view.Gravity;
+import android.widget.Toast;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ScreenTimeoutButton extends PowerButton {
+
+ // timeout values
+ private static final int SCREEN_TIMEOUT_MIN = 15000;
+ private static final int SCREEN_TIMEOUT_LOW = 30000;
+ private static final int SCREEN_TIMEOUT_NORMAL = 60000;
+ private static final int SCREEN_TIMEOUT_HIGH = 120000;
+ private static final int SCREEN_TIMEOUT_MAX = 300000;
+
+ // cm modes
+ private static final int CM_MODE_15_60_300 = 0;
+ private static final int CM_MODE_30_120_300 = 1;
+
+ private static Toast TOAST = null;
+
+ private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
+ static {
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.SCREEN_OFF_TIMEOUT));
+ }
+
+ public ScreenTimeoutButton() { mType = BUTTON_SCREENTIMEOUT; }
+
+ @Override
+ protected void updateState() {
+ int timeout=getScreenTtimeout(mView.getContext());
+
+ if (timeout <= SCREEN_TIMEOUT_LOW) {
+ mIcon = R.drawable.stat_screen_timeout_off;
+ mState = STATE_DISABLED;
+ } else if (timeout <= SCREEN_TIMEOUT_HIGH) {
+ mIcon = R.drawable.stat_screen_timeout_off;
+ mState = STATE_INTERMEDIATE;
+ } else {
+ mIcon = R.drawable.stat_screen_timeout_on;
+ mState = STATE_ENABLED;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ Context context = mView.getContext();
+ int screentimeout = getScreenTtimeout(context);
+ int currentMode = getCurrentCMMode(context);
+
+ if (screentimeout < SCREEN_TIMEOUT_MIN) {
+ if (currentMode == CM_MODE_15_60_300) {
+ screentimeout = SCREEN_TIMEOUT_MIN;
+ } else {
+ screentimeout = SCREEN_TIMEOUT_LOW;
+ }
+ } else if (screentimeout < SCREEN_TIMEOUT_LOW) {
+ if (currentMode == CM_MODE_15_60_300) {
+ screentimeout = SCREEN_TIMEOUT_NORMAL;
+ } else {
+ screentimeout = SCREEN_TIMEOUT_LOW;
+ }
+ } else if (screentimeout < SCREEN_TIMEOUT_NORMAL) {
+ if (currentMode == CM_MODE_15_60_300) {
+ screentimeout = SCREEN_TIMEOUT_NORMAL;
+ } else {
+ screentimeout = SCREEN_TIMEOUT_HIGH;
+ }
+ } else if (screentimeout < SCREEN_TIMEOUT_HIGH) {
+ if (currentMode == CM_MODE_15_60_300) {
+ screentimeout = SCREEN_TIMEOUT_MAX;
+ } else {
+ screentimeout = SCREEN_TIMEOUT_HIGH;
+ }
+ } else if (screentimeout < SCREEN_TIMEOUT_MAX) {
+ screentimeout = SCREEN_TIMEOUT_MAX;
+ } else if (currentMode == CM_MODE_30_120_300) {
+ screentimeout = SCREEN_TIMEOUT_LOW;
+ } else {
+ screentimeout = SCREEN_TIMEOUT_MIN;
+ }
+
+ Settings.System.putInt(
+ context.getContentResolver(),
+ Settings.System.SCREEN_OFF_TIMEOUT, screentimeout);
+
+ // create our toast
+ if(TOAST == null) {
+ TOAST = Toast.makeText(context, "", Toast.LENGTH_LONG);
+ }
+
+ // cancel any previous toast
+ TOAST.cancel();
+
+ // inform users of how long the timeout is now
+ TOAST.setText("Screen timeout set to: " + timeoutToString(screentimeout));
+ TOAST.setGravity(Gravity.CENTER, TOAST.getXOffset() / 2, TOAST.getYOffset() / 2);
+ TOAST.show();
+ }
+
+ @Override
+ protected List<Uri> getObservedUris() {
+ return OBSERVED_URIS;
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.DISPLAY_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ private static int getScreenTtimeout(Context context) {
+ return Settings.System.getInt(
+ context.getContentResolver(),
+ Settings.System.SCREEN_OFF_TIMEOUT, 0);
+ }
+
+ private static String timeoutToString(int timeout) {
+ String[] tags = new String[] {
+ "second(s)",
+ "minute(s)",
+ "hour(s)"
+ };
+
+ // default to however many seconds we have
+ int tmp = (timeout / 1000);
+ String sTimeout = tmp + " " + tags[0];
+
+ for(int i = 1; i < tags.length && tmp >= 60; i++) {
+ tmp /= (60 * i);
+ sTimeout = tmp + " " + tags[i];
+ }
+
+ return sTimeout;
+ }
+
+ private static int getCurrentCMMode(Context context) {
+ return Settings.System.getInt(context.getContentResolver(),
+ Settings.System.EXPANDED_SCREENTIMEOUT_MODE,
+ CM_MODE_15_60_300);
+ }
+}
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SleepButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SleepButton.java
new file mode 100644
index 0000000..61fecc9
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SleepButton.java
@@ -0,0 +1,36 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.os.PowerManager;
+import android.os.SystemClock;
+
+public class SleepButton extends PowerButton {
+ public SleepButton() { mType = BUTTON_SLEEP; }
+
+ @Override
+ protected void updateState() {
+ mIcon = R.drawable.stat_sleep;
+ mState = STATE_DISABLED;
+ }
+
+ @Override
+ protected void toggleState() {
+ PowerManager pm = (PowerManager)mView.getContext()
+ .getSystemService(Context.POWER_SERVICE);
+ pm.goToSleep(SystemClock.uptimeMillis() + 1);
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.DISPLAY_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SoundButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SoundButton.java
new file mode 100644
index 0000000..d68eeb6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SoundButton.java
@@ -0,0 +1,242 @@
+
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.net.Uri;
+import android.os.Vibrator;
+import android.preference.ListPreferenceMultiSelect;
+import android.provider.Settings;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SoundButton extends PowerButton {
+
+ private static final String TAG = "SoundButton";
+
+ private static final int VIBRATE_DURATION = 500; // 0.5s
+
+ private static final IntentFilter INTENT_FILTER = new IntentFilter();
+ static {
+ INTENT_FILTER.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
+ INTENT_FILTER.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
+ }
+
+ private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
+ static {
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.EXPANDED_RING_MODE));
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.EXPANDED_HAPTIC_FEEDBACK));
+ OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_ENABLED));
+ }
+
+ private final Ringer mSilentRinger = new Ringer(false, AudioManager.VIBRATE_SETTING_OFF,
+ AudioManager.RINGER_MODE_SILENT, false);
+ private final Ringer mVibrateRinger = new Ringer(true, AudioManager.VIBRATE_SETTING_ONLY_SILENT,
+ AudioManager.RINGER_MODE_VIBRATE, true);
+ private final Ringer mSoundRinger = new Ringer(true, AudioManager.VIBRATE_SETTING_ONLY_SILENT,
+ AudioManager.RINGER_MODE_NORMAL, false);
+ private final Ringer mSoundVibrateRinger = new Ringer(true, AudioManager.VIBRATE_SETTING_ON,
+ AudioManager.RINGER_MODE_NORMAL, true);
+ private final Ringer[] mRingers = new Ringer[] {
+ mSilentRinger, mVibrateRinger, mSoundRinger, mSoundVibrateRinger
+ };
+ private int mRingersIndex = 2;
+
+ private int[] mRingerValues = new int[] {
+ 0, 1, 2, 3
+ };
+ private int mRingerValuesIndex = 2;
+
+ private boolean mHapticFeedbackEnabled = false;
+
+ private AudioManager mAudioManager;
+ private Vibrator mVibrator;
+
+ public SoundButton() {
+ mType = BUTTON_SOUND;
+ }
+
+ @Override
+ protected void setupButton(View view) {
+ super.setupButton(view);
+ if (mView != null) {
+ Context context = mView.getContext();
+ mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
+ updateSettings();
+ }
+ }
+
+ @Override
+ protected void updateState() {
+ findCurrentState();
+ switch (mRingersIndex) {
+ case 0:
+ mIcon = R.drawable.stat_silent;
+ mState = STATE_DISABLED;
+ break;
+ case 1:
+ mIcon = R.drawable.stat_vibrate_off;
+ mState = STATE_DISABLED;
+ break;
+ case 2:
+ mIcon = R.drawable.stat_ring_on;
+ mState = STATE_ENABLED;
+ break;
+ case 3:
+ mIcon = R.drawable.stat_ring_vibrate_on;
+ mState = STATE_ENABLED;
+ break;
+ }
+ for (int i = 0; i < mRingerValues.length; i++) {
+ if (mRingersIndex == mRingerValues[i]) {
+ mRingerValuesIndex = i;
+ break;
+ }
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ mRingerValuesIndex++;
+ if (mRingerValuesIndex > mRingerValues.length - 1) {
+ mRingerValuesIndex = 0;
+ }
+ mRingersIndex = mRingerValues[mRingerValuesIndex];
+ if (mRingersIndex > mRingers.length - 1) {
+ mRingersIndex = 0;
+ }
+ Ringer ringer = mRingers[mRingersIndex];
+ ringer.execute();
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.SOUND_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ protected void onChangeUri(Uri uri) {
+ updateSettings();
+ }
+
+ @Override
+ protected List<Uri> getObservedUris() {
+ return OBSERVED_URIS;
+ }
+
+ @Override
+ protected IntentFilter getBroadcastIntentFilter() {
+ return INTENT_FILTER;
+ }
+
+ private void updateSettings() {
+ ContentResolver resolver = mView.getContext().getContentResolver();
+
+ int expandedHapticFeedback = Settings.System.getInt(resolver,
+ Settings.System.EXPANDED_HAPTIC_FEEDBACK, 2);
+ if (expandedHapticFeedback == 2) {
+ mHapticFeedbackEnabled = (Settings.System.getInt(resolver,
+ Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) == 1);
+ } else {
+ mHapticFeedbackEnabled = (expandedHapticFeedback == 1);
+ }
+
+ String[] modes = ListPreferenceMultiSelect.parseStoredValue(Settings.System.getString(
+ resolver, Settings.System.EXPANDED_RING_MODE));
+ if (modes == null || modes.length == 0) {
+ mRingerValues = new int[] {
+ 0, 1, 2, 3
+ };
+ } else {
+ mRingerValues = new int[modes.length];
+ for (int i = 0; i < modes.length; i++) {
+ mRingerValues[i] = Integer.valueOf(modes[i]);
+ }
+ }
+
+ updateState();
+ }
+
+ private void findCurrentState() {
+ ContentResolver resolver = mView.getContext().getContentResolver();
+ boolean vibrateInSilent = Settings.System.getInt(resolver,
+ Settings.System.VIBRATE_IN_SILENT, 0) == 1;
+ int vibrateSetting = mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER);
+ int ringerMode = mAudioManager.getRingerMode();
+ // Sometimes the setting don't quite match up to the states we've defined.
+ // In that case, override the reported settings to get us "close" to the
+ // defined settings. This bit is a little ugly but oh well.
+ if (!vibrateInSilent && ringerMode == AudioManager.RINGER_MODE_SILENT) {
+ vibrateSetting = AudioManager.VIBRATE_SETTING_OFF; // match Silent ringer
+ } else if (!vibrateInSilent && ringerMode == AudioManager.RINGER_MODE_NORMAL) {
+ vibrateInSilent = true; // match either Sound or SoundVibrate ringer
+ if (vibrateSetting == AudioManager.VIBRATE_SETTING_OFF) {
+ vibrateSetting = AudioManager.VIBRATE_SETTING_ONLY_SILENT; // match Sound ringer
+ }
+ } else if (vibrateInSilent && ringerMode == AudioManager.RINGER_MODE_VIBRATE) {
+ vibrateSetting = AudioManager.VIBRATE_SETTING_ONLY_SILENT; // match Vibrate ringer
+ }
+
+ Ringer ringer = new Ringer(vibrateInSilent, vibrateSetting, ringerMode, false);
+ for (int i = 0; i < mRingers.length; i++) {
+ if (mRingers[i].equals(ringer)) {
+ mRingersIndex = i;
+ break;
+ }
+ }
+ }
+
+ private class Ringer {
+
+ final boolean mVibrateInSilent;
+ final int mVibrateSetting;
+ final int mRingerMode;
+ final boolean mDoHapticFeedback;
+
+ Ringer(boolean vibrateInSilent, int vibrateSetting, int ringerMode, boolean doHapticFeedback) {
+ mVibrateInSilent = vibrateInSilent;
+ mVibrateSetting = vibrateSetting;
+ mRingerMode = ringerMode;
+ mDoHapticFeedback = doHapticFeedback;
+ }
+
+ void execute() {
+ ContentResolver resolver = mView.getContext().getContentResolver();
+ Settings.System.putInt(resolver, Settings.System.VIBRATE_IN_SILENT,
+ (mVibrateInSilent ? 1 : 0));
+ mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, mVibrateSetting);
+ mAudioManager.setRingerMode(mRingerMode);
+ if (mDoHapticFeedback && mHapticFeedbackEnabled) {
+ mVibrator.vibrate(VIBRATE_DURATION);
+ }
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null) {
+ return false;
+ }
+ if (o.getClass() != getClass()) {
+ return false;
+ }
+
+ Ringer r = (Ringer) o;
+ return r.mVibrateInSilent == mVibrateInSilent && r.mVibrateSetting == mVibrateSetting
+ && r.mRingerMode == mRingerMode;
+ }
+
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/StateTracker.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/StateTracker.java
new file mode 100644
index 0000000..0a3603d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/StateTracker.java
@@ -0,0 +1,155 @@
+
+package com.android.systemui.statusbar.powerwidget;
+
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+/**
+ * The state machine for Wifi and Bluetooth toggling, tracking reality versus
+ * the user's intent. This is necessary because reality moves relatively slowly
+ * (turning on &amp; off radio drivers), compared to user's expectations.
+ */
+public abstract class StateTracker {
+ // Is the state in the process of changing?
+ private boolean mInTransition = false;
+
+ private Boolean mActualState = null; // initially not set
+
+ private Boolean mIntendedState = null; // initially not set
+
+ // Did a toggle request arrive while a state update was
+ // already in-flight? If so, the mIntendedState needs to be
+ // requested when the other one is done, unless we happened to
+ // arrive at that state already.
+ private boolean mDeferredStateChangeRequestNeeded = false;
+
+ /**
+ * User pressed a button to change the state. Something should immediately
+ * appear to the user afterwards, even if we effectively do nothing. Their
+ * press must be heard.
+ */
+ public final void toggleState(Context context) {
+ int currentState = getTriState(context);
+ boolean newState = false;
+ switch (currentState) {
+ case PowerButton.STATE_ENABLED:
+ newState = false;
+ break;
+ case PowerButton.STATE_DISABLED:
+ newState = true;
+ break;
+ case PowerButton.STATE_INTERMEDIATE:
+ if (mIntendedState != null) {
+ newState = !mIntendedState;
+ }
+ break;
+ }
+ mIntendedState = newState;
+ if (mInTransition) {
+ // We don't send off a transition request if we're
+ // already transitioning. Makes our state tracking
+ // easier, and is probably nicer on lower levels.
+ // (even though they should be able to take it...)
+ mDeferredStateChangeRequestNeeded = true;
+ } else {
+ mInTransition = true;
+ requestStateChange(context, newState);
+ }
+ }
+
+ /**
+ * Update internal state from a broadcast state change.
+ */
+ public abstract void onActualStateChange(Context context, Intent intent);
+
+ /**
+ * Sets the value that we're now in. To be called from onActualStateChange.
+ *
+ * @param newState one of STATE_DISABLED, STATE_ENABLED, STATE_TURNING_ON,
+ * STATE_TURNING_OFF, STATE_UNKNOWN
+ */
+ protected final void setCurrentState(Context context, int newState) {
+ final boolean wasInTransition = mInTransition;
+ switch (newState) {
+ case PowerButton.STATE_DISABLED:
+ mInTransition = false;
+ mActualState = false;
+ break;
+ case PowerButton.STATE_ENABLED:
+ mInTransition = false;
+ mActualState = true;
+ break;
+ case PowerButton.STATE_TURNING_ON:
+ mInTransition = true;
+ mActualState = false;
+ break;
+ case PowerButton.STATE_TURNING_OFF:
+ mInTransition = true;
+ mActualState = true;
+ break;
+ }
+
+ if (wasInTransition && !mInTransition) {
+ if (mDeferredStateChangeRequestNeeded) {
+ Log.v("StateTracker", "processing deferred state change");
+ if (mActualState != null && mIntendedState != null
+ && mIntendedState.equals(mActualState)) {
+ Log.v("StateTracker", "... but intended state matches, so no changes.");
+ } else if (mIntendedState != null) {
+ mInTransition = true;
+ requestStateChange(context, mIntendedState);
+ }
+ mDeferredStateChangeRequestNeeded = false;
+ }
+ }
+ }
+
+ /**
+ * If we're in a transition mode, this returns true if we're transitioning
+ * towards being enabled.
+ */
+ public final boolean isTurningOn() {
+ return mIntendedState != null && mIntendedState;
+ }
+
+ /**
+ * Returns simplified 3-state value from underlying 5-state.
+ *
+ * @param context
+ * @return STATE_ENABLED, STATE_DISABLED, or STATE_INTERMEDIATE
+ */
+ public final int getTriState(Context context) {
+ /*
+ * if (mInTransition) { // If we know we just got a toggle request
+ * recently // (which set mInTransition), don't even ask the //
+ * underlying interface for its state. We know we're // changing. This
+ * avoids blocking the UI thread // during UI refresh post-toggle if the
+ * underlying // service state accessor has coarse locking on its //
+ * state (to be fixed separately). return
+ * PowerButton.STATE_INTERMEDIATE; }
+ */
+ switch (getActualState(context)) {
+ case PowerButton.STATE_DISABLED:
+ return PowerButton.STATE_DISABLED;
+ case PowerButton.STATE_ENABLED:
+ return PowerButton.STATE_ENABLED;
+ default:
+ return PowerButton.STATE_INTERMEDIATE;
+ }
+ }
+
+ /**
+ * Gets underlying actual state.
+ *
+ * @param context
+ * @return STATE_ENABLED, STATE_DISABLED, STATE_ENABLING, STATE_DISABLING,
+ * or or STATE_UNKNOWN.
+ */
+ public abstract int getActualState(Context context);
+
+ /**
+ * Actually make the desired change to the underlying radio API.
+ */
+ protected abstract void requestStateChange(Context context, boolean desiredState);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SyncButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SyncButton.java
new file mode 100644
index 0000000..81167c2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SyncButton.java
@@ -0,0 +1,104 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SyncStatusObserver;
+import android.net.ConnectivityManager;
+import android.util.Log;
+import android.view.View;
+
+public class SyncButton extends PowerButton {
+ private static final String TAG = "SyncButton";
+
+ public SyncButton() { mType = BUTTON_SYNC; }
+
+ private SyncStatusObserver mSyncObserver = new SyncStatusObserver() {
+ public void onStatusChanged(int which) {
+ // update state/view if something happened
+ update();
+ }
+ };
+ private Object mSyncObserverHandle = null;
+
+ @Override
+ protected void setupButton(View view) {
+ super.setupButton(view);
+
+ if(mView == null && mSyncObserverHandle != null) {
+ Log.i(TAG, "Unregistering sync state listener");
+ ContentResolver.removeStatusChangeListener(mSyncObserverHandle);
+ mSyncObserverHandle = null;
+ } else if(mView != null && mSyncObserverHandle == null) {
+ Log.i(TAG, "Registering sync state listener");
+ mSyncObserverHandle = ContentResolver.addStatusChangeListener(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, mSyncObserver);
+ }
+ }
+
+ @Override
+ protected void updateState() {
+ if (getSyncState(mView.getContext())) {
+ mIcon = R.drawable.stat_sync_on;
+ mState = STATE_ENABLED;
+ } else {
+ mIcon = R.drawable.stat_sync_off;
+ mState = STATE_DISABLED;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ Context context = mView.getContext();
+ ConnectivityManager connManager = (ConnectivityManager)context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ boolean backgroundData = getBackgroundDataState(context);
+ boolean sync = ContentResolver.getMasterSyncAutomatically();
+
+ // four cases to handle:
+ // setting toggled from off to on:
+ // 1. background data was off, sync was off: turn on both
+ if (!backgroundData && !sync) {
+ connManager.setBackgroundDataSetting(true);
+ ContentResolver.setMasterSyncAutomatically(true);
+ }
+
+ // 2. background data was off, sync was on: turn on background data
+ if (!backgroundData && sync) {
+ connManager.setBackgroundDataSetting(true);
+ }
+
+ // 3. background data was on, sync was off: turn on sync
+ if (backgroundData && !sync) {
+ ContentResolver.setMasterSyncAutomatically(true);
+ }
+
+ // setting toggled from on to off:
+ // 4. background data was on, sync was on: turn off sync
+ if (backgroundData && sync) {
+ ContentResolver.setMasterSyncAutomatically(false);
+ }
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.SYNC_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ private static boolean getBackgroundDataState(Context context) {
+ ConnectivityManager connManager = (ConnectivityManager) context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ return connManager.getBackgroundDataSetting();
+ }
+
+ private static boolean getSyncState(Context context) {
+ boolean backgroundData = getBackgroundDataState(context);
+ boolean sync = ContentResolver.getMasterSyncAutomatically();
+ return backgroundData && sync;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WifiApButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WifiApButton.java
new file mode 100644
index 0000000..3df4578
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WifiApButton.java
@@ -0,0 +1,153 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.net.wifi.WifiManager;
+import android.os.AsyncTask;
+import android.util.Log;
+
+public class WifiApButton extends PowerButton {
+
+ private static final StateTracker sWifiApState = new WifiApStateTracker();
+
+ /**
+ * Subclass of StateTracker to get/set Wifi AP state.
+ */
+ private static final class WifiApStateTracker extends StateTracker {
+ @Override
+ public int getActualState(Context context) {
+ WifiManager wifiManager = (WifiManager) context
+ .getSystemService(Context.WIFI_SERVICE);
+ if (wifiManager != null) {
+ return wifiApStateToFiveState(wifiManager.getWifiApState());
+ }
+ return STATE_UNKNOWN;
+ }
+
+ @Override
+ protected void requestStateChange(Context context,
+ final boolean desiredState) {
+
+ final WifiManager wifiManager = (WifiManager) context
+ .getSystemService(Context.WIFI_SERVICE);
+ if (wifiManager == null) {
+ Log.d("WifiAPManager", "No wifiManager.");
+ return;
+ }
+ Log.i("WifiAp", "Setting: " + desiredState);
+
+ // Actually request the Wi-Fi AP change and persistent
+ // settings write off the UI thread, as it can take a
+ // user-noticeable amount of time, especially if there's
+ // disk contention.
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... args) {
+ /**
+ * Disable Wif if enabling tethering
+ */
+ int wifiState = wifiManager.getWifiState();
+ if (desiredState
+ && ((wifiState == WifiManager.WIFI_STATE_ENABLING) || (wifiState == WifiManager.WIFI_STATE_ENABLED))) {
+ wifiManager.setWifiEnabled(false);
+ }
+
+ wifiManager.setWifiApEnabled(null, desiredState);
+ Log.i("WifiAp", "Async Setting: " + desiredState);
+ return null;
+ }
+ }.execute();
+ }
+
+ @Override
+ public void onActualStateChange(Context context, Intent intent) {
+
+ if (!WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(intent
+ .getAction())) {
+ return;
+ }
+ int wifiState = intent
+ .getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE, -1);
+ int widgetState=wifiApStateToFiveState(wifiState);
+ setCurrentState(context, widgetState);
+ }
+
+ /**
+ * Converts WifiManager's state values into our Wifi/WifiAP/Bluetooth-common
+ * state values.
+ */
+ private static int wifiApStateToFiveState(int wifiState) {
+ switch (wifiState) {
+ case WifiManager.WIFI_AP_STATE_DISABLED:
+ return STATE_DISABLED;
+ case WifiManager.WIFI_AP_STATE_ENABLED:
+ return STATE_ENABLED;
+ case WifiManager.WIFI_AP_STATE_DISABLING:
+ return STATE_TURNING_OFF;
+ case WifiManager.WIFI_AP_STATE_ENABLING:
+ return STATE_TURNING_ON;
+ default:
+ return STATE_UNKNOWN;
+ }
+ }
+ }
+
+ public WifiApButton() { mType = BUTTON_WIFIAP; }
+
+ @Override
+ protected void updateState() {
+ mState = sWifiApState.getTriState(mView.getContext());
+ switch (mState) {
+ case STATE_DISABLED:
+ mIcon = R.drawable.stat_wifi_ap_off;
+ break;
+ case STATE_ENABLED:
+ mIcon = R.drawable.stat_wifi_ap_on;
+ break;
+ case STATE_INTERMEDIATE:
+ // In the transitional state, the bottom green bar
+ // shows the tri-state (on, off, transitioning), but
+ // the top dark-gray-or-bright-white logo shows the
+ // user's intent. This is much easier to see in
+ // sunlight.
+ if (sWifiApState.isTurningOn()) {
+ mIcon = R.drawable.stat_wifi_ap_on;
+ } else {
+ mIcon = R.drawable.stat_wifi_ap_off;
+ }
+ break;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ sWifiApState.toggleState(mView.getContext());
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ // it may be better to make an Intent action for the WifiAp settings
+ // we may want to look at that option later
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClassName("com.android.settings", "com.android.settings.TetherSettings");
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ sWifiApState.onActualStateChange(context, intent);
+ }
+
+ @Override
+ protected IntentFilter getBroadcastIntentFilter() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+ return filter;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WifiButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WifiButton.java
new file mode 100644
index 0000000..bc0aca9
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WifiButton.java
@@ -0,0 +1,147 @@
+package com.android.systemui.statusbar.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.wifi.WifiManager;
+import android.os.AsyncTask;
+import android.util.Log;
+
+public class WifiButton extends PowerButton{
+
+ private static final StateTracker sWifiState = new WifiStateTracker();
+
+ /**
+ * Subclass of StateTracker to get/set Wifi state.
+ */
+ private static final class WifiStateTracker extends StateTracker {
+ @Override
+ public int getActualState(Context context) {
+ WifiManager wifiManager = (WifiManager) context
+ .getSystemService(Context.WIFI_SERVICE);
+ if (wifiManager != null) {
+ return wifiStateToFiveState(wifiManager.getWifiState());
+ }
+ return STATE_UNKNOWN;
+ }
+
+ @Override
+ protected void requestStateChange(Context context,
+ final boolean desiredState) {
+ final WifiManager wifiManager = (WifiManager) context
+ .getSystemService(Context.WIFI_SERVICE);
+ if (wifiManager == null) {
+ Log.d("WifiButton", "No wifiManager.");
+ return;
+ }
+
+ // Actually request the wifi change and persistent
+ // settings write off the UI thread, as it can take a
+ // user-noticeable amount of time, especially if there's
+ // disk contention.
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... args) {
+ /**
+ * Disable tethering if enabling Wifi
+ */
+ int wifiApState = wifiManager.getWifiApState();
+ if (desiredState
+ && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) || (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED))) {
+ wifiManager.setWifiApEnabled(null, false);
+ }
+
+ wifiManager.setWifiEnabled(desiredState);
+ return null;
+ }
+ }.execute();
+ }
+
+ @Override
+ public void onActualStateChange(Context context, Intent intent) {
+ if (!WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent
+ .getAction())) {
+ return;
+ }
+ int wifiState = intent
+ .getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1);
+ int widgetState=wifiStateToFiveState(wifiState);
+ setCurrentState(context, widgetState);
+ }
+
+ /**
+ * Converts WifiManager's state values into our Wifi/Bluetooth-common
+ * state values.
+ */
+ private static int wifiStateToFiveState(int wifiState) {
+ switch (wifiState) {
+ case WifiManager.WIFI_STATE_DISABLED:
+ return STATE_DISABLED;
+ case WifiManager.WIFI_STATE_ENABLED:
+ return STATE_ENABLED;
+ case WifiManager.WIFI_STATE_DISABLING:
+ return STATE_TURNING_OFF;
+ case WifiManager.WIFI_STATE_ENABLING:
+ return STATE_TURNING_ON;
+ default:
+ return STATE_UNKNOWN;
+ }
+ }
+ }
+
+ public WifiButton() { mType = BUTTON_WIFI; }
+
+ @Override
+ protected void updateState() {
+ mState = sWifiState.getTriState(mView.getContext());
+ switch (mState) {
+ case STATE_DISABLED:
+ mIcon = R.drawable.stat_wifi_off;
+ break;
+ case STATE_ENABLED:
+ mIcon = R.drawable.stat_wifi_on;
+ break;
+ case STATE_INTERMEDIATE:
+ // In the transitional state, the bottom green bar
+ // shows the tri-state (on, off, transitioning), but
+ // the top dark-gray-or-bright-white logo shows the
+ // user's intent. This is much easier to see in
+ // sunlight.
+ if (sWifiState.isTurningOn()) {
+ mIcon = R.drawable.stat_wifi_on;
+ } else {
+ mIcon = R.drawable.stat_wifi_off;
+ }
+ break;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ sWifiState.toggleState(mView.getContext());
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.WIFI_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ sWifiState.onActualStateChange(context, intent);
+ }
+
+ @Override
+ protected IntentFilter getBroadcastIntentFilter() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ return filter;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WimaxButton.java.no_build b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WimaxButton.java.no_build
new file mode 100644
index 0000000..1bedd34
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/WimaxButton.java.no_build
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2011 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.powerwidget;
+
+import com.android.systemui.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.wimax.WimaxHelper;
+import android.net.wimax.WimaxManagerConstants;
+import android.os.AsyncTask;
+import android.util.Log;
+
+public class WimaxButton extends PowerButton {
+
+ private static final StateTracker sWimaxState = new WimaxStateTracker();
+
+ /**
+ * Subclass of StateTracker to get/set WiMAX state.
+ */
+ private static final class WimaxStateTracker extends StateTracker {
+ @Override
+ public int getActualState(Context context) {
+ if (WimaxHelper.isWimaxSupported(context)) {
+ return wimaxStateToFiveState(WimaxHelper.getWimaxState(context));
+ }
+ return STATE_UNKNOWN;
+ }
+
+ @Override
+ protected void requestStateChange(final Context context,
+ final boolean desiredState) {
+ if (!WimaxHelper.isWimaxSupported(context)) {
+ Log.e(TAG, "WiMAX is not supported");
+ return;
+ }
+
+ // Actually request the wifi change and persistent
+ // settings write off the UI thread, as it can take a
+ // user-noticeable amount of time, especially if there's
+ // disk contention.
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... args) {
+ WimaxHelper.setWimaxEnabled(context, desiredState);
+ return null;
+ }
+ }.execute();
+ }
+
+ @Override
+ public void onActualStateChange(Context context, Intent intent) {
+ if (!WimaxManagerConstants.WIMAX_ENABLED_CHANGED_ACTION.equals(intent.getAction())) {
+ return;
+ }
+ int wimaxState = intent.getIntExtra(WimaxManagerConstants.CURRENT_WIMAX_ENABLED_STATE, WimaxManagerConstants.WIMAX_ENABLED_STATE_UNKNOWN);
+ int widgetState = wimaxStateToFiveState(wimaxState);
+ setCurrentState(context, widgetState);
+ }
+
+ /**
+ * Converts WimaxController's state values into our
+ * WiMAX-common state values.
+ */
+ private static int wimaxStateToFiveState(int wimaxState) {
+ switch (wimaxState) {
+ case WimaxManagerConstants.WIMAX_ENABLED_STATE_DISABLED:
+ return STATE_DISABLED;
+ case WimaxManagerConstants.WIMAX_ENABLED_STATE_ENABLED:
+ return STATE_ENABLED;
+ case WimaxManagerConstants.WIMAX_ENABLED_STATE_ENABLING:
+ return STATE_TURNING_ON;
+ case WimaxManagerConstants.WIMAX_ENABLED_STATE_DISABLING:
+ return STATE_TURNING_OFF;
+ default:
+ return STATE_UNKNOWN;
+ }
+ }
+ }
+
+ public WimaxButton() { mType = BUTTON_WIMAX; }
+
+ @Override
+ protected void updateState() {
+ mState = sWimaxState.getTriState(mView.getContext());
+ switch (mState) {
+ case STATE_DISABLED:
+ mIcon = R.drawable.stat_wimax_off;
+ break;
+ case STATE_ENABLED:
+ mIcon = R.drawable.stat_wimax_on;
+ break;
+ case STATE_INTERMEDIATE:
+ // In the transitional state, the bottom green bar
+ // shows the tri-state (on, off, transitioning), but
+ // the top dark-gray-or-bright-white logo shows the
+ // user's intent. This is much easier to see in
+ // sunlight.
+ if (sWimaxState.isTurningOn()) {
+ mIcon = R.drawable.stat_wimax_on;
+ } else {
+ mIcon = R.drawable.stat_wimax_off;
+ }
+ break;
+ }
+ }
+
+ @Override
+ protected void toggleState() {
+ sWimaxState.toggleState(mView.getContext());
+ }
+
+ @Override
+ protected boolean handleLongClick() {
+ Intent intent = new Intent("android.settings.WIMAX_SETTINGS");
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mView.getContext().startActivity(intent);
+ return true;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ sWimaxState.onActualStateChange(context, intent);
+ }
+
+ @Override
+ protected IntentFilter getBroadcastIntentFilter() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(WimaxManagerConstants.WIMAX_ENABLED_CHANGED_ACTION);
+ return filter;
+ }
+}