summaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/DefaultContainerService/res/values-ar/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-bg/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-ca/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-en-rGB/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-fa/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-fi/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-he/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-hr/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-hu/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-id/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-lt/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-lv/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-rm/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-ro/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-sk/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-sl/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-sr/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-th/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-tl/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-uk/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-vi/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values/strings.xml2
-rw-r--r--packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java2
-rw-r--r--packages/SettingsProvider/res/values-ar/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-bg/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-ca/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-en-rGB/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-fa/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-fi/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-he/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-hr/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-hu/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-id/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-lt/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-lv/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-rm/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-ro/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-sk/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-sl/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-sr/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-th/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-tl/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-uk/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-vi/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values/defaults.xml59
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java127
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java19
-rw-r--r--packages/SystemUI/Android.mk7
-rw-r--r--packages/SystemUI/AndroidManifest.xml21
-rw-r--r--packages/SystemUI/assets/fonts/AndroidClock.ttfbin0 -> 2336 bytes
-rw-r--r--packages/SystemUI/assets/fonts/AndroidClock2.ttfbin0 -> 2212 bytes
-rw-r--r--packages/SystemUI/proguard.flags6
-rw-r--r--packages/SystemUI/res/anim/hydraulic_brake_interpolator.xml23
-rw-r--r--packages/SystemUI/res/anim/lights_out_in.xml26
-rw-r--r--packages/SystemUI/res/anim/lights_out_out.xml26
-rw-r--r--packages/SystemUI/res/anim/notification_buttons_in.xml22
-rw-r--r--packages/SystemUI/res/anim/notification_buttons_out.xml22
-rw-r--r--packages/SystemUI/res/anim/notification_dnd_off.xml23
-rw-r--r--packages/SystemUI/res/anim/notification_dnd_on.xml23
-rw-r--r--packages/SystemUI/res/anim/notification_icons_in.xml22
-rw-r--r--packages/SystemUI/res/anim/notification_icons_out.xml22
-rw-r--r--packages/SystemUI/res/anim/recent_app_enter.xml30
-rw-r--r--packages/SystemUI/res/anim/recent_app_leave.xml30
-rw-r--r--packages/SystemUI/res/anim/status_bar_in.xml26
-rw-r--r--packages/SystemUI/res/anim/status_bar_out.xml26
-rw-r--r--packages/SystemUI/res/anim/system_in.xml22
-rw-r--r--packages/SystemUI/res/anim/system_out.xml22
-rw-r--r--packages/SystemUI/res/drawable-hdpi/alert_bar_background_normal.9.pngbin0 -> 1078 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/alert_bar_background_pressed.9.pngbin0 -> 1093 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/battery_0.pngbin0 -> 4189 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/battery_100.pngbin0 -> 5931 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/battery_20.pngbin0 -> 4766 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/battery_40.pngbin0 -> 5632 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/battery_60.pngbin0 -> 5937 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/battery_80.pngbin0 -> 6075 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/battery_low_battery.pngbin4264 -> 4060 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/button_frame_default.9.pngbin0 -> 2878 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/button_frame_pressed.9.pngbin0 -> 5583 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.pngbin2747 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/divider_horizontal_light_opaque.9.pngbin128 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/dots_empty.pngbin0 -> 1584 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/dots_full.pngbin0 -> 2256 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_notification_open.pngbin0 -> 508 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_notification_veto.pngbin0 -> 602 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_airplane_off.pngbin0 -> 1804 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_airplane_on.pngbin0 -> 1772 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_back.pngbin0 -> 2295 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_battery_mini.pngbin0 -> 712 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_battery_on.pngbin0 -> 1169 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_bluetooth_off.pngbin0 -> 1912 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_bluetooth_on.pngbin0 -> 1885 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness.pngbin0 -> 1975 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness_auto.pngbin0 -> 2664 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness_low.pngbin0 -> 1985 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_close.pngbin0 -> 1010 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_default_bg.pngbin0 -> 248 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_gps_off.pngbin0 -> 2154 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_gps_on.pngbin0 -> 2135 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.pngbin0 -> 2132 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_default.pngbin0 -> 1165 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_lightsout.pngbin0 -> 879 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu.pngbin0 -> 516 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_avail.pngbin0 -> 833 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_avail_open.pngbin0 -> 1287 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_dnd.pngbin0 -> 841 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_none.pngbin0 -> 479 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_none_open.pngbin0 -> 843 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_notification_dnd.pngbin0 -> 1224 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_notification_dnd_off.pngbin0 -> 1238 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_open.pngbin0 -> 1012 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket.pngbin0 -> 1602 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_drag.pngbin0 -> 2972 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_hidden.pngbin0 -> 2012 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_holding.pngbin0 -> 2805 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_press_bg.pngbin0 -> 4632 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_quicksettings.pngbin0 -> 1414 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent.pngbin0 -> 1370 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off.pngbin0 -> 1498 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off_lanscape.pngbin0 -> 911 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off_portrait.pngbin0 -> 871 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_on.pngbin0 -> 2136 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_shadow.9.pngbin0 -> 300 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_sound_off.pngbin0 -> 2172 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_sound_on.pngbin0 -> 2067 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_mini.pngbin0 -> 817 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_off.pngbin0 -> 1595 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_on.pngbin0 -> 1589 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/recent_overlay.pngbin0 -> 302563 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/recent_rez_border.pngbin0 -> 28494 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/signal_0.pngbin0 -> 4187 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/signal_100.pngbin0 -> 6102 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/signal_20.pngbin0 -> 5082 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/signal_40.pngbin0 -> 5803 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/signal_60.pngbin0 -> 6091 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/signal_80.pngbin0 -> 6281 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.pngbin1692 -> 1793 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.pngbin1406 -> 1246 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.pngbin1544 -> 1405 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.pngbin1699 -> 4181 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.pngbin1732 -> 4228 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.pngbin1581 -> 3897 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.pngbin1599 -> 3866 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.pngbin1557 -> 843 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.pngbin1680 -> 4186 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.pngbin1711 -> 4240 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.pngbin1579 -> 3917 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.pngbin1567 -> 3891 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.pngbin1552 -> 880 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.pngbin1864 -> 4373 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.pngbin1845 -> 4458 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_e.pngbin1739 -> 1822 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_g.pngbin1729 -> 4067 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.pngbin1732 -> 1059 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.pngbin1931 -> 4425 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_3g.pngbin1910 -> 4534 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_e.pngbin1822 -> 4132 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_g.pngbin1811 -> 4115 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_h.pngbin1806 -> 1141 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.pngbin1877 -> 4340 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_3g.pngbin1893 -> 4454 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_e.pngbin1778 -> 4075 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.pngbin1769 -> 4066 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_h.pngbin1752 -> 1120 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.pngbin1804 -> 4352 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.pngbin1861 -> 4423 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.pngbin1752 -> 4078 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.pngbin1760 -> 4049 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.pngbin1742 -> 1017 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.pngbin1901 -> 4418 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.pngbin1911 -> 4515 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.pngbin1863 -> 4130 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.pngbin1874 -> 4104 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.pngbin1858 -> 1106 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.pngbin1786 -> 4350 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.pngbin1891 -> 4429 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.pngbin1772 -> 4053 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.pngbin1781 -> 4033 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.pngbin1758 -> 1078 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.pngbin500 -> 884 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.pngbin1276 -> 1223 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully.pngbin1276 -> 1223 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1.pngbin1657 -> 1239 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully.pngbin1730 -> 1239 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.pngbin1890 -> 1231 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully.pngbin1930 -> 1231 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.pngbin2013 -> 1206 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully.pngbin2038 -> 1206 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.pngbin2089 -> 1151 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully.pngbin2069 -> 1151 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.pngbin1378 -> 1300 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.pngbin1936 -> 4980 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.pngbin1081 -> 1492 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.pngbin489 -> 1304 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_back_default.pngbin0 -> 4276 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_back_pressed.pngbin0 -> 8409 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.pngbin380 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_expand_default.pngbin0 -> 1790 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_expand_pressed.pngbin0 -> 4328 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_home_default.pngbin0 -> 4384 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_home_pressed.pngbin0 -> 8855 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_icon_tray.9.pngbin0 -> 5030 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_item_app_background_normal.9.pngbin0 -> 322 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_menu_default.pngbin0 -> 5931 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_menu_pressed.pngbin0 -> 9439 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_recent_default.pngbin0 -> 434 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_recent_pressed.pngbin0 -> 434 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_veto_normal.pngbin0 -> 1221 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_veto_pressed.pngbin0 -> 1874 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_hidenotification_handle.pngbin0 -> 435 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_minimeter_bg.pngbin0 -> 332 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_panel_bg.9.pngbin0 -> 34533 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_panel_recents_bg.9.pngbin0 -> 16935 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_0.pngbin0 -> 3458 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_10.pngbin0 -> 8098 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_100.pngbin0 -> 17095 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_20.pngbin0 -> 9783 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_30.pngbin0 -> 11267 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_40.pngbin0 -> 12583 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_50.pngbin0 -> 13860 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_60.pngbin0 -> 14971 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_70.pngbin0 -> 15994 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_80.pngbin0 -> 16854 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signal_90.pngbin0 -> 17643 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_signalmini_100.pngbin0 -> 2472 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_toggle_bg_off.9.pngbin0 -> 152 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/sysbar_toggle_bg_on.9.pngbin0 -> 146 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/system_panel_airplane_default.pngbin0 -> 4960 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/system_panel_brightness_default.pngbin0 -> 6073 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/system_panel_orientation_default.pngbin0 -> 5144 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/system_panel_orientation_locked.pngbin0 -> 4923 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/system_panel_sound_default.pngbin0 -> 3294 bytes
-rw-r--r--packages/SystemUI/res/drawable-land-hdpi/ic_sysbar_rotate_off.pngbin0 -> 1451 bytes
-rw-r--r--packages/SystemUI/res/drawable-land-mdpi/ic_sysbar_rotate_off.pngbin0 -> 595 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/alert_bar_background_normal.9.png (renamed from packages/SystemUI/res/drawable-mdpi/divider_horizontal_dark_opaque.9.png)bin2805 -> 2896 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/alert_bar_background_pressed.9.png (renamed from packages/SystemUI/res/drawable-mdpi/statusbar_background.9.png)bin2849 -> 2896 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/battery_0.pngbin0 -> 1453 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/battery_100.pngbin0 -> 3775 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/battery_20.pngbin0 -> 3266 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/battery_40.pngbin0 -> 3687 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/battery_60.pngbin0 -> 3739 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/battery_80.pngbin0 -> 3843 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/battery_low_battery.pngbin2774 -> 4060 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/button_frame_default.9.pngbin0 -> 1550 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/button_frame_pressed.9.pngbin0 -> 2842 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/divider_horizontal_light_opaque.9.pngbin128 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/dots_empty.pngbin0 -> 811 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/dots_full.pngbin0 -> 1257 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_notification_open.pngbin0 -> 445 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.pngbin623 -> 3201 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_notification_veto.pngbin0 -> 551 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_airplane_off.pngbin0 -> 688 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_airplane_on.pngbin0 -> 684 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_default.pngbin0 -> 1108 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.pngbin0 -> 738 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_pressed.pngbin0 -> 1630 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_pressed.pngbin0 -> 2223 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_battery_on.pngbin0 -> 531 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_bluetooth_off.pngbin0 -> 734 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_bluetooth_on.pngbin0 -> 734 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness.pngbin0 -> 765 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness_auto.pngbin0 -> 1272 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness_low.pngbin0 -> 768 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_close.pngbin0 -> 472 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_default_bg.pngbin0 -> 161 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_gps_off.pngbin0 -> 863 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_gps_on.pngbin0 -> 863 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_default.pngbin0 -> 958 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_pressed.pngbin0 -> 1787 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_default.pngbin0 -> 633 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_pressed.pngbin0 -> 1950 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_lightsout.pngbin0 -> 500 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_default.pngbin0 -> 456 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_pressed.pngbin0 -> 1306 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.pngbin0 -> 247 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.pngbin0 -> 503 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.pngbin0 -> 393 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.pngbin0 -> 185 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.pngbin0 -> 393 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_notification_dnd.pngbin0 -> 853 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_notification_dnd_off.pngbin0 -> 850 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_open.pngbin0 -> 456 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.pngbin0 -> 509 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_drag.pngbin0 -> 627 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.pngbin0 -> 696 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_holding.pngbin0 -> 606 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_press_bg.pngbin0 -> 1912 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_quicksettings.pngbin0 -> 954 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_default.pngbin0 -> 416 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_pressed.pngbin0 -> 1114 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off.pngbin0 -> 548 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off_lanscape.pngbin0 -> 700 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off_portrait.pngbin0 -> 697 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_on.pngbin0 -> 792 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.pngbin0 -> 247 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_sound_off.pngbin0 -> 861 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_sound_on.pngbin0 -> 816 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_off.pngbin0 -> 660 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_on.pngbin0 -> 660 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/recent_overlay.pngbin0 -> 162325 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/recent_rez_border.pngbin0 -> 21739 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/signal_0.pngbin0 -> 1453 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/signal_100.pngbin0 -> 4027 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/signal_20.pngbin0 -> 3433 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/signal_40.pngbin0 -> 3659 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/signal_60.pngbin0 -> 3815 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/signal_80.pngbin0 -> 3947 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_notify_alarm.pngbin632 -> 1035 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_notify_more.pngbin670 -> 786 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.pngbin477 -> 685 bytes
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth_connected.pngbin526 -> 967 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.pngbin719 -> 3497 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.pngbin765 -> 3563 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.pngbin673 -> 3372 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.pngbin688 -> 3363 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.pngbin649 -> 764 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.pngbin712 -> 3489 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.pngbin743 -> 3538 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.pngbin660 -> 3375 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.pngbin663 -> 3364 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.pngbin650 -> 771 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_1x.pngbin792 -> 3572 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_3g.pngbin809 -> 3614 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_e.pngbin736 -> 773 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_g.pngbin736 -> 3408 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_h.pngbin731 -> 856 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_1x.pngbin795 -> 3586 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_3g.pngbin830 -> 3640 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_e.pngbin746 -> 3430 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_g.pngbin753 -> 3416 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_h.pngbin739 -> 871 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_1x.pngbin799 -> 3571 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_3g.pngbin836 -> 3616 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_e.pngbin759 -> 3421 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_g.pngbin765 -> 3409 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_h.pngbin747 -> 873 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_1x.pngbin767 -> 3575 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_3g.pngbin809 -> 3642 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_e.pngbin753 -> 3427 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_g.pngbin748 -> 3410 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_h.pngbin736 -> 844 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_1x.pngbin773 -> 3604 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_3g.pngbin832 -> 3686 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_e.pngbin781 -> 3450 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_g.pngbin776 -> 3437 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_h.pngbin761 -> 870 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_1x.pngbin754 -> 3576 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_3g.pngbin832 -> 3636 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_e.pngbin746 -> 3443 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_g.pngbin757 -> 3427 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_h.pngbin733 -> 868 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.pngbin500 -> 595 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0.pngbin449 -> 677 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully.pngbin449 -> 677 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1.pngbin746 -> 682 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully.pngbin749 -> 682 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2.pngbin855 -> 684 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully.pngbin847 -> 684 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3.pngbin949 -> 667 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully.pngbin914 -> 667 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4.pngbin963 -> 648 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully.pngbin937 -> 648 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.pngbin472 -> 767 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.pngbin701 -> 1255 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.pngbin381 -> 409 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.pngbin381 -> 409 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.pngbin654 -> 431 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.pngbin639 -> 431 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1x.pngbin0 -> 234 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.pngbin741 -> 458 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.pngbin734 -> 458 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.pngbin789 -> 450 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.pngbin763 -> 450 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3g.pngbin0 -> 258 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.pngbin794 -> 424 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.pngbin806 -> 424 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_edge.pngbin0 -> 237 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_flightmode.pngbin827 -> 517 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_gprs.pngbin0 -> 234 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_hsdpa.pngbin0 -> 234 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.pngbin465 -> 711 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_roam.pngbin0 -> 236 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.pngbin3343 -> 554 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0_fully.pngbin0 -> 554 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.pngbin771 -> 492 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.pngbin1096 -> 492 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.pngbin3734 -> 554 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.pngbin3744 -> 554 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.pngbin3827 -> 616 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.pngbin3814 -> 616 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.pngbin3967 -> 497 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.pngbin3922 -> 497 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_back_default.pngbin0 -> 48936 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_back_pressed.pngbin0 -> 49157 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.pngbin300 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_expand_default.pngbin0 -> 344 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_expand_pressed.pngbin0 -> 2807 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_home_default.pngbin0 -> 646 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_home_pressed.pngbin0 -> 646 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_icon_tray.9.png (renamed from packages/SystemUI/res/drawable-hdpi/statusbar_background.9.png)bin2846 -> 2952 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_item_app_background_normal.9.pngbin0 -> 3013 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_menu_default.pngbin0 -> 3172 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_menu_pressed.pngbin0 -> 4532 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_recent_default.pngbin0 -> 331 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_recent_pressed.pngbin0 -> 331 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_veto_normal.pngbin0 -> 1139 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_veto_pressed.pngbin0 -> 1139 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_hidenotification_handle.pngbin0 -> 289 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_minimeter_bg.pngbin0 -> 233 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_panel_bg.9.pngbin0 -> 22034 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_panel_recents_bg.9.pngbin0 -> 11109 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_0.pngbin0 -> 2585 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_10.pngbin0 -> 5134 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_100.pngbin0 -> 10128 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_20.pngbin0 -> 5958 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_30.pngbin0 -> 6780 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_40.pngbin0 -> 7537 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_50.pngbin0 -> 8164 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_60.pngbin0 -> 8703 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_70.pngbin0 -> 9377 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_80.pngbin0 -> 9827 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signal_90.pngbin0 -> 10446 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_signalmini_100.pngbin0 -> 1639 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_toggle_bg_off.9.pngbin0 -> 228 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/sysbar_toggle_bg_on.9.pngbin0 -> 226 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/system_panel_airplane_default.pngbin0 -> 3028 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/system_panel_brightness_default.pngbin0 -> 3683 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/system_panel_orientation_default.pngbin0 -> 3829 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/system_panel_orientation_locked.pngbin0 -> 3447 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/system_panel_sound_default.pngbin0 -> 2040 bytes
-rw-r--r--packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.pngbin0 -> 60874 bytes
-rw-r--r--packages/SystemUI/res/drawable-nodpi/panel_notification.pngbin0 -> 152 bytes
-rw-r--r--packages/SystemUI/res/drawable-port-hdpi/ic_sysbar_rotate_off.pngbin0 -> 1517 bytes
-rw-r--r--packages/SystemUI/res/drawable-port-mdpi/ic_sysbar_rotate_off.pngbin0 -> 616 bytes
-rw-r--r--packages/SystemUI/res/drawable-xlarge-hdpi/app_icon.pngbin0 -> 7310 bytes
-rw-r--r--packages/SystemUI/res/drawable-xlarge-mdpi/app_icon.pngbin0 -> 5167 bytes
-rw-r--r--packages/SystemUI/res/drawable/alert_bar_background.xml23
-rw-r--r--packages/SystemUI/res/drawable/button_frame.xml21
-rw-r--r--packages/SystemUI/res/drawable/ic_sysbar_back.xml21
-rw-r--r--packages/SystemUI/res/drawable/ic_sysbar_back_ime.xml21
-rw-r--r--packages/SystemUI/res/drawable/ic_sysbar_home.xml21
-rw-r--r--packages/SystemUI/res/drawable/ic_sysbar_ime.xml21
-rw-r--r--packages/SystemUI/res/drawable/ic_sysbar_menu.xml21
-rwxr-xr-xpackages/SystemUI/res/drawable/ic_sysbar_recent.xml21
-rw-r--r--packages/SystemUI/res/drawable/status_bar_expand.xml21
-rw-r--r--packages/SystemUI/res/drawable/status_bar_item_background.xml26
-rw-r--r--packages/SystemUI/res/drawable/status_bar_ticker_background.xml27
-rw-r--r--packages/SystemUI/res/drawable/status_bar_veto.xml21
-rw-r--r--packages/SystemUI/res/drawable/ticker_background.xml27
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar.xml261
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_notification_panel.xml177
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_notification_peek.xml43
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_notification_row.xml48
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_pocket_panel.xml61
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_recent_item.xml59
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml53
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_settings_view.xml170
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_ticker_compat.xml58
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_ticker_panel.xml39
-rw-r--r--packages/SystemUI/res/layout/intruder_alert.xml58
-rw-r--r--packages/SystemUI/res/layout/recent_apps_activity.xml55
-rw-r--r--packages/SystemUI/res/layout/recents_detail_view.xml40
-rw-r--r--packages/SystemUI/res/layout/status_bar.xml21
-rw-r--r--packages/SystemUI/res/layout/status_bar_expanded.xml22
-rw-r--r--packages/SystemUI/res/layout/status_bar_notification_row.xml (renamed from packages/SystemUI/res/layout/status_bar_latest_event.xml)4
-rw-r--r--packages/SystemUI/res/layout/status_bar_tracking.xml21
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml56
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml56
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml56
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml30
-rw-r--r--packages/SystemUI/res/values-da/strings.xml30
-rw-r--r--packages/SystemUI/res/values-de/strings.xml30
-rw-r--r--packages/SystemUI/res/values-el/strings.xml30
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml56
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml30
-rw-r--r--packages/SystemUI/res/values-es/strings.xml30
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml56
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml56
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml30
-rw-r--r--packages/SystemUI/res/values-he/strings.xml56
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml56
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml56
-rw-r--r--packages/SystemUI/res/values-id/strings.xml56
-rw-r--r--packages/SystemUI/res/values-it/strings.xml30
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml30
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml30
-rw-r--r--packages/SystemUI/res/values-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml56
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml56
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml30
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml30
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml30
-rw-r--r--packages/SystemUI/res/values-port/strings.xml23
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml30
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml30
-rw-r--r--packages/SystemUI/res/values-rm/strings.xml56
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml56
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml30
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml56
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml56
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml56
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml30
-rw-r--r--packages/SystemUI/res/values-th/strings.xml56
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml56
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml30
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml56
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml56
-rw-r--r--packages/SystemUI/res/values-xlarge/colors.xml5
-rw-r--r--packages/SystemUI/res/values-xlarge/config.xml33
-rw-r--r--packages/SystemUI/res/values-xlarge/dimens.xml29
-rw-r--r--packages/SystemUI/res/values-xlarge/strings.xml69
-rw-r--r--packages/SystemUI/res/values-xlarge/styles.xml50
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml30
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml30
-rw-r--r--packages/SystemUI/res/values/attrs.xml22
-rw-r--r--packages/SystemUI/res/values/colors.xml4
-rw-r--r--packages/SystemUI/res/values/config.xml18
-rw-r--r--packages/SystemUI/res/values/strings.xml78
-rw-r--r--packages/SystemUI/res/values/styles.xml29
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUI.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/NotificationLinearLayout.java)18
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIService.java116
-rw-r--r--packages/SystemUI/src/com/android/systemui/power/PowerUI.java289
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java531
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsCarouselView.java39
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java41
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java60
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java81
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java135
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/CarrierLabel.java)2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CloseDragHandle.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java)4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ExpandedView.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java)8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java)4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java)433
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java)268
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java)66
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java)20
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/TickerView.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java)6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/TrackingPatternView.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/TrackingPatternView.java)2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/TrackingView.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java)4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java92
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/AutoRotateController.java73
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java74
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/Clock.java)2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/DateView.java)46
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java77
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/FixedSizeDrawable.java)6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java147
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java711
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java115
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java34
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java169
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java190
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java55
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java142
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPeekPanel.java43
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java95
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java73
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java267
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java104
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java249
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/StatusBarPanel.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java1265
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java90
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java272
-rwxr-xr-xpackages/TtsService/jni/Android.mk1
-rw-r--r--packages/TtsService/jni/android_tts_SynthProxy.cpp202
-rwxr-xr-xpackages/TtsService/src/android/tts/TtsService.java50
-rw-r--r--packages/VpnServices/res/drawable/vpn_connected.pngbin213 -> 757 bytes
-rw-r--r--packages/VpnServices/res/drawable/vpn_disconnected.pngbin213 -> 717 bytes
-rw-r--r--packages/VpnServices/res/values-ar/strings.xml8
-rw-r--r--packages/VpnServices/res/values-bg/strings.xml8
-rw-r--r--packages/VpnServices/res/values-ca/strings.xml8
-rw-r--r--packages/VpnServices/res/values-en-rGB/strings.xml8
-rw-r--r--packages/VpnServices/res/values-fa/strings.xml8
-rw-r--r--packages/VpnServices/res/values-fi/strings.xml8
-rw-r--r--packages/VpnServices/res/values-he/strings.xml8
-rw-r--r--packages/VpnServices/res/values-hr/strings.xml8
-rw-r--r--packages/VpnServices/res/values-hu/strings.xml8
-rw-r--r--packages/VpnServices/res/values-id/strings.xml8
-rw-r--r--packages/VpnServices/res/values-lt/strings.xml8
-rw-r--r--packages/VpnServices/res/values-lv/strings.xml8
-rw-r--r--packages/VpnServices/res/values-rm/strings.xml8
-rw-r--r--packages/VpnServices/res/values-ro/strings.xml8
-rw-r--r--packages/VpnServices/res/values-sk/strings.xml8
-rw-r--r--packages/VpnServices/res/values-sl/strings.xml8
-rw-r--r--packages/VpnServices/res/values-sr/strings.xml8
-rw-r--r--packages/VpnServices/res/values-th/strings.xml8
-rw-r--r--packages/VpnServices/res/values-tl/strings.xml8
-rw-r--r--packages/VpnServices/res/values-uk/strings.xml8
-rw-r--r--packages/VpnServices/res/values-vi/strings.xml8
592 files changed, 11462 insertions, 784 deletions
diff --git a/packages/DefaultContainerService/res/values-ar/strings.xml b/packages/DefaultContainerService/res/values-ar/strings.xml
new file mode 100644
index 0000000..b9c27b7
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-ar/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"خدمة حاوية الوسائط"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-bg/strings.xml b/packages/DefaultContainerService/res/values-bg/strings.xml
new file mode 100644
index 0000000..3546c03
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-bg/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Услуга за контейнер за мултимедия"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-ca/strings.xml b/packages/DefaultContainerService/res/values-ca/strings.xml
new file mode 100644
index 0000000..218de71
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-ca/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Servei de contenidor multimèdia"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-en-rGB/strings.xml b/packages/DefaultContainerService/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..a84e111
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-en-rGB/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-fa/strings.xml b/packages/DefaultContainerService/res/values-fa/strings.xml
new file mode 100644
index 0000000..ac70971
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-fa/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"سرویس محفظه رسانه"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-fi/strings.xml b/packages/DefaultContainerService/res/values-fi/strings.xml
new file mode 100644
index 0000000..a012b61
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-fi/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Media Container -palvelu"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-he/strings.xml b/packages/DefaultContainerService/res/values-he/strings.xml
new file mode 100644
index 0000000..ede8178
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-he/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"שירות גורם מכיל של מדיה"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-hr/strings.xml b/packages/DefaultContainerService/res/values-hr/strings.xml
new file mode 100644
index 0000000..1ed69b4
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-hr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Usluga spremnika za medije"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-hu/strings.xml b/packages/DefaultContainerService/res/values-hu/strings.xml
new file mode 100644
index 0000000..0446603
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-hu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Médiatároló szolgáltatás"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-id/strings.xml b/packages/DefaultContainerService/res/values-id/strings.xml
new file mode 100644
index 0000000..2f830b1
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-id/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Layanan Kontainer Media"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-lt/strings.xml b/packages/DefaultContainerService/res/values-lt/strings.xml
new file mode 100644
index 0000000..0ba10a4
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-lt/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Medijos konteinerio paslauga"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-lv/strings.xml b/packages/DefaultContainerService/res/values-lv/strings.xml
new file mode 100644
index 0000000..a84e111
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-lv/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-rm/strings.xml b/packages/DefaultContainerService/res/values-rm/strings.xml
new file mode 100644
index 0000000..216d715
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-rm/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-ro/strings.xml b/packages/DefaultContainerService/res/values-ro/strings.xml
new file mode 100644
index 0000000..a84e111
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-ro/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-sk/strings.xml b/packages/DefaultContainerService/res/values-sk/strings.xml
new file mode 100644
index 0000000..a84e111
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-sk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-sl/strings.xml b/packages/DefaultContainerService/res/values-sl/strings.xml
new file mode 100644
index 0000000..a84e111
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-sl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-sr/strings.xml b/packages/DefaultContainerService/res/values-sr/strings.xml
new file mode 100644
index 0000000..7400eab
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-sr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Услуга контејнера за медије"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-th/strings.xml b/packages/DefaultContainerService/res/values-th/strings.xml
new file mode 100644
index 0000000..fac3585
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-th/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"บริการพื้นที่จัดเก็บสื่อ"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-tl/strings.xml b/packages/DefaultContainerService/res/values-tl/strings.xml
new file mode 100644
index 0000000..e080364
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-tl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Serbisyo ng Media Container"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-uk/strings.xml b/packages/DefaultContainerService/res/values-uk/strings.xml
new file mode 100644
index 0000000..7becba1
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-uk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Служба зберіг. медіа"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-vi/strings.xml b/packages/DefaultContainerService/res/values-vi/strings.xml
new file mode 100644
index 0000000..a22d61d
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-vi/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- outdated translation 2260781993795858516 --> <string name="service_name" msgid="4841491635055379553">"Dịch vụ Bộ chứa Phương tiện"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values/strings.xml b/packages/DefaultContainerService/res/values/strings.xml
index 37f5b61..ffd6b59 100644
--- a/packages/DefaultContainerService/res/values/strings.xml
+++ b/packages/DefaultContainerService/res/values/strings.xml
@@ -18,6 +18,6 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- service name -->
+ <!-- service name [CHAR LIMIT=25] -->
<string name="service_name">Package Access Helper</string>
</resources>
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
index ce10f5b..e6624ae 100644
--- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
+++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
@@ -440,7 +440,7 @@ public class DefaultContainerService extends IntentService {
String status = Environment.getExternalStorageState();
long availSDSize = -1;
boolean mediaAvailable = false;
- if (status.equals(Environment.MEDIA_MOUNTED)) {
+ if (!Environment.isExternalStorageEmulated() && status.equals(Environment.MEDIA_MOUNTED)) {
StatFs sdStats = new StatFs(
Environment.getExternalStorageDirectory().getPath());
availSDSize = (long)sdStats.getAvailableBlocks() *
diff --git a/packages/SettingsProvider/res/values-ar/strings.xml b/packages/SettingsProvider/res/values-ar/strings.xml
new file mode 100644
index 0000000..ab1b808
--- /dev/null
+++ b/packages/SettingsProvider/res/values-ar/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"تخزين الإعدادات"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-bg/strings.xml b/packages/SettingsProvider/res/values-bg/strings.xml
new file mode 100644
index 0000000..f3d21d8
--- /dev/null
+++ b/packages/SettingsProvider/res/values-bg/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Настройки за хранилище"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-ca/strings.xml b/packages/SettingsProvider/res/values-ca/strings.xml
new file mode 100644
index 0000000..9d6ac7a
--- /dev/null
+++ b/packages/SettingsProvider/res/values-ca/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Configuració de l\'emmagatzematge"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-en-rGB/strings.xml b/packages/SettingsProvider/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..c19fdd7
--- /dev/null
+++ b/packages/SettingsProvider/res/values-en-rGB/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Settings Storage"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-fa/strings.xml b/packages/SettingsProvider/res/values-fa/strings.xml
new file mode 100644
index 0000000..97fe0ab
--- /dev/null
+++ b/packages/SettingsProvider/res/values-fa/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"تنظیم محل ذخیره"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-fi/strings.xml b/packages/SettingsProvider/res/values-fi/strings.xml
new file mode 100644
index 0000000..83c7f66
--- /dev/null
+++ b/packages/SettingsProvider/res/values-fi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Asetuksien tallennus"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-he/strings.xml b/packages/SettingsProvider/res/values-he/strings.xml
new file mode 100644
index 0000000..ad2eaf4
--- /dev/null
+++ b/packages/SettingsProvider/res/values-he/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"אחסון הגדרות"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-hr/strings.xml b/packages/SettingsProvider/res/values-hr/strings.xml
new file mode 100644
index 0000000..87f1270
--- /dev/null
+++ b/packages/SettingsProvider/res/values-hr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Postavke pohrane"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-hu/strings.xml b/packages/SettingsProvider/res/values-hu/strings.xml
new file mode 100644
index 0000000..dab1b17
--- /dev/null
+++ b/packages/SettingsProvider/res/values-hu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Beállítástároló"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-id/strings.xml b/packages/SettingsProvider/res/values-id/strings.xml
new file mode 100644
index 0000000..bed20eb
--- /dev/null
+++ b/packages/SettingsProvider/res/values-id/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Setelan Penyimpanan"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-lt/strings.xml b/packages/SettingsProvider/res/values-lt/strings.xml
new file mode 100644
index 0000000..5b4432f
--- /dev/null
+++ b/packages/SettingsProvider/res/values-lt/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Nustatymų saugykla"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-lv/strings.xml b/packages/SettingsProvider/res/values-lv/strings.xml
new file mode 100644
index 0000000..c83580c
--- /dev/null
+++ b/packages/SettingsProvider/res/values-lv/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Iestatījumu krātuve"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-rm/strings.xml b/packages/SettingsProvider/res/values-rm/strings.xml
new file mode 100644
index 0000000..861e625
--- /dev/null
+++ b/packages/SettingsProvider/res/values-rm/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Memoria dals parameters"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-ro/strings.xml b/packages/SettingsProvider/res/values-ro/strings.xml
new file mode 100644
index 0000000..53e9429
--- /dev/null
+++ b/packages/SettingsProvider/res/values-ro/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Stocare setări"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-sk/strings.xml b/packages/SettingsProvider/res/values-sk/strings.xml
new file mode 100644
index 0000000..955c834
--- /dev/null
+++ b/packages/SettingsProvider/res/values-sk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Ukladací priestor nastavení"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-sl/strings.xml b/packages/SettingsProvider/res/values-sl/strings.xml
new file mode 100644
index 0000000..3d7768d
--- /dev/null
+++ b/packages/SettingsProvider/res/values-sl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Shramba nastavitev"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-sr/strings.xml b/packages/SettingsProvider/res/values-sr/strings.xml
new file mode 100644
index 0000000..7082761
--- /dev/null
+++ b/packages/SettingsProvider/res/values-sr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Подешавања складишта"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-th/strings.xml b/packages/SettingsProvider/res/values-th/strings.xml
new file mode 100644
index 0000000..ae8ba6a
--- /dev/null
+++ b/packages/SettingsProvider/res/values-th/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"ที่เก็บข้อมูลการตั้งค่า"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-tl/strings.xml b/packages/SettingsProvider/res/values-tl/strings.xml
new file mode 100644
index 0000000..19219ec
--- /dev/null
+++ b/packages/SettingsProvider/res/values-tl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Imbakan ng Mga Setting"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-uk/strings.xml b/packages/SettingsProvider/res/values-uk/strings.xml
new file mode 100644
index 0000000..900dd07
--- /dev/null
+++ b/packages/SettingsProvider/res/values-uk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Сховище налаштувань"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-vi/strings.xml b/packages/SettingsProvider/res/values-vi/strings.xml
new file mode 100644
index 0000000..113d7ad
--- /dev/null
+++ b/packages/SettingsProvider/res/values-vi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Bộ nhớ Cài đặt"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 52e04d7..8a6e82d 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -3,16 +3,16 @@
/**
* 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
+ * 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
+ * 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
+ * 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.
*/
-->
@@ -24,6 +24,7 @@
<string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi</string>
<string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi</string>
<bool name="def_auto_time">true</bool>
+ <bool name="def_auto_time_zone">true</bool>
<bool name="def_accelerometer_rotation">true</bool>
<!-- Default screen brightness, from 0 to 255. 102 is 40%. -->
<integer name="def_screen_brightness">102</integer>
@@ -31,12 +32,12 @@
<fraction name="def_window_animation_scale">100%</fraction>
<fraction name="def_window_transition_scale">100%</fraction>
<bool name="def_haptic_feedback">true</bool>
-
+
<bool name="def_bluetooth_on">false</bool>
<bool name="def_install_non_market_apps">false</bool>
- <!-- Comma-separated list of location providers.
+ <!-- Comma-separated list of location providers.
Network location is off by default because it requires
- user opt-in via Setup Wizard or Settings.
+ user opt-in via Setup Wizard or Settings.
-->
<string name="def_location_providers_allowed" translatable="false">gps</string>
<bool name="assisted_gps_enabled">true</bool>
@@ -45,11 +46,11 @@
<bool name="def_usb_mass_storage_enabled">true</bool>
<bool name="def_wifi_on">false</bool>
<bool name="def_networks_available_notification_on">true</bool>
-
+
<bool name="def_backup_enabled">false</bool>
<string name="def_backup_transport" translatable="false">android/com.android.internal.backup.LocalTransport</string>
- <!-- Default value for whether or not to pulse the notification LED when there is a
+ <!-- Default value for whether or not to pulse the notification LED when there is a
pending notification -->
<bool name="def_notification_pulse">true</bool>
@@ -72,4 +73,36 @@
<!-- Default for Settings.System.VIBRATE_IN_SILENT -->
<bool name="def_vibrate_in_silent">true</bool>
+
+ <bool name="def_use_ptp_interface">false</bool>
+
+ <!-- Default for Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION -->
+ <bool name="def_accessibility_script_injection">false</bool>
+
+ <!-- Default for Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS -->
+ <string name="def_accessibility_web_content_key_bindings" translatable="false">
+ <!-- DPAD/Trackball UP maps to traverse previous on current axis and send an event. -->
+ 0x13=0x01000100;
+ <!-- DPAD/Trackball DOWN maps to traverse next on current axis and send an event. -->
+ 0x14=0x01010100;
+ <!-- DPAD/Trackball LEFT maps to action in non-android default navigation axis. -->
+ 0x15=0x04000000;
+ <!-- DPAD/Trackball RIGHT maps to no action in non-android default navigation axis. -->
+ 0x16=0x04000000;
+ <!-- Left Alt+DPAD/Trackball UP transitions from an axis to another and sends an event. -->
+ <!-- Axis transitions: 2 -> 7; 1 -> 2; 0 -> 1; 3 -> 0; 4 -> 0; 5 -> 0; 6 -> 0; -->
+ 0x120013=0x03020701:0x03010201:0x03000101:0x03030001:0x03040001:0x03050001:0x03060001;
+ <!-- Left Alt+DPAD/Trackball DOWN transitions from an axis to another and sends an event. -->
+ <!-- Axis transitions: 1 -> 0; 2 -> 1; 7 -> 2; 3 -> 7; 4 -> 7; 5 -> 7; 6 -> 7; -->
+ 0x120014=0x03010001:0x03020101:0x03070201:0x03030701:0x03040701:0x03050701:0x03060701;
+ <!-- Left Alt+DPAD/Trackball LEFT transitions from an axis to another and sends an event. -->
+ <!-- Axis transitions: 4 -> 3; 5 -> 4; 6 -> 5; 0 -> 6; 1 -> 6; 2 -> 6; 7 -> 6; -->
+ 0x120015=0x03040301:0x03050401:0x03060501:0x03000601:0x03010601:0x03020601:0x03070601;
+ <!-- Left Alt+DPAD/Trackball RIGHT transitions from an axis to another and sends an event. -->
+ <!-- Axis transitions: 5 -> 6; 4 -> 5; 3 -> 4; 2 -> 3; 7 -> 3; 1 -> 3; 0 -> 3; -->
+ 0x120016=0x03050601:0x03040501:0x03030401:0x03020301:0x03070301:0x03010301:0x03000301;
+ </string>
+
+ <!-- Default for Settings.System.USER_ROTATION -->
+ <integer name="def_user_rotation">0</integer>
</resources>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index ad04bb4..d11a18e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -16,12 +16,20 @@
package com.android.providers.settings;
+import com.android.internal.content.PackageHelper;
+import com.android.internal.telephony.RILConstants;
+import com.android.internal.util.XmlUtils;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockPatternView;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
-import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.XmlResourceParser;
import android.database.Cursor;
@@ -35,18 +43,7 @@ import android.os.SystemProperties;
import android.provider.Settings;
import android.provider.Settings.Secure;
import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Config;
import android.util.Log;
-import android.util.Xml;
-
-import com.android.internal.content.PackageHelper;
-import com.android.internal.telephony.RILConstants;
-import com.android.internal.util.XmlUtils;
-import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.LockPatternView;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.HashSet;
@@ -64,7 +61,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
// database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
// is properly propagated through your change. Not doing so will result in a loss of user
// settings.
- private static final int DATABASE_VERSION = 57;
+ private static final int DATABASE_VERSION = 62;
private Context mContext;
@@ -734,6 +731,77 @@ public class DatabaseHelper extends SQLiteOpenHelper {
}
upgradeVersion = 57;
}
+
+ if (upgradeVersion == 57) {
+ /*
+ * New settings to:
+ * 1. Enable injection of accessibility scripts in WebViews.
+ * 2. Define the key bindings for traversing web content in WebViews.
+ */
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ stmt = db.compileStatement("INSERT INTO secure(name,value)"
+ + " VALUES(?,?);");
+ loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
+ R.bool.def_accessibility_script_injection);
+ stmt.close();
+ stmt = db.compileStatement("INSERT INTO secure(name,value)"
+ + " VALUES(?,?);");
+ loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
+ R.string.def_accessibility_web_content_key_bindings);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null) stmt.close();
+ }
+ upgradeVersion = 58;
+ }
+
+ if (upgradeVersion == 58) {
+ /* Add default for new Auto Time Zone */
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ stmt = db.compileStatement("INSERT INTO secure(name,value)"
+ + " VALUES(?,?);");
+ loadBooleanSetting(stmt, Settings.System.AUTO_TIME_ZONE,
+ R.bool.def_auto_time_zone); // Sync timezone to NITZ
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null) stmt.close();
+ }
+ upgradeVersion = 59;
+ }
+
+ if (upgradeVersion == 59) {
+ // Persistence for the rotation lock feature.
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ stmt = db.compileStatement("INSERT INTO system(name,value)"
+ + " VALUES(?,?);");
+ loadBooleanSetting(stmt, Settings.System.USER_ROTATION,
+ R.integer.def_user_rotation); // should be zero degrees
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null) stmt.close();
+ }
+ upgradeVersion = 60;
+ }
+
+ if (upgradeVersion == 60) {
+ upgradeScreenTimeout(db);
+ upgradeVersion = 61;
+ }
+
+ if (upgradeVersion == 61) {
+ upgradeScreenTimeout(db);
+ upgradeVersion = 62;
+ }
+
// *** Remember to update DATABASE_VERSION above!
if (upgradeVersion != currentVersion) {
@@ -839,6 +907,23 @@ public class DatabaseHelper extends SQLiteOpenHelper {
}
}
+ private void upgradeScreenTimeout(SQLiteDatabase db) {
+ // Change screen timeout to current default
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
+ + " VALUES(?,?);");
+ loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
+ R.integer.def_screen_off_timeout);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null)
+ stmt.close();
+ }
+ }
+
/**
* Loads the default set of bookmarked shortcuts from an xml file.
*
@@ -876,7 +961,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
String cls = parser.getAttributeValue(null, "class");
String shortcutStr = parser.getAttributeValue(null, "shortcut");
- int shortcutValue = (int) shortcutStr.charAt(0);
+ int shortcutValue = shortcutStr.charAt(0);
if (TextUtils.isEmpty(shortcutStr)) {
Log.w(TAG, "Unable to get shortcut for: " + pkg + "/" + cls);
}
@@ -1044,7 +1129,10 @@ public class DatabaseHelper extends SQLiteOpenHelper {
loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
R.bool.def_auto_time); // Sync time to NITZ
-
+
+ loadBooleanSetting(stmt, Settings.System.AUTO_TIME_ZONE,
+ R.bool.def_auto_time_zone); // Sync timezone to NITZ
+
loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
R.integer.def_screen_brightness);
@@ -1068,6 +1156,9 @@ public class DatabaseHelper extends SQLiteOpenHelper {
loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT,
R.bool.def_vibrate_in_silent);
+
+ loadBooleanSetting(stmt, Settings.System.USE_PTP_INTERFACE,
+ R.bool.def_use_ptp_interface);
} finally {
if (stmt != null) stmt.close();
}
@@ -1184,6 +1275,12 @@ public class DatabaseHelper extends SQLiteOpenHelper {
loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED,
R.bool.def_mount_ums_notify_enabled);
+
+ loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
+ R.bool.def_accessibility_script_injection);
+
+ loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
+ R.string.def_accessibility_web_content_key_bindings);
} finally {
if (stmt != null) stmt.close();
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index b98071e..fa63edb 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -16,6 +16,7 @@
package com.android.providers.settings;
+import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
@@ -27,6 +28,7 @@ import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.OutputStream;
import java.util.Arrays;
import java.util.zip.CRC32;
@@ -352,10 +354,11 @@ public class SettingsBackupAgent extends BackupAgentHelper {
}
private byte[] getWifiSupplicant(String filename) {
+ BufferedReader br = null;
try {
File file = new File(filename);
if (file.exists()) {
- BufferedReader br = new BufferedReader(new FileReader(file));
+ br = new BufferedReader(new FileReader(file));
StringBuffer relevantLines = new StringBuffer();
boolean started = false;
String line;
@@ -378,6 +381,13 @@ public class SettingsBackupAgent extends BackupAgentHelper {
} catch (IOException ioe) {
Log.w(TAG, "Couldn't backup " + filename);
return EMPTY_DATA;
+ } finally {
+ if (br != null) {
+ try {
+ br.close();
+ } catch (IOException e) {
+ }
+ }
}
}
@@ -390,9 +400,10 @@ public class SettingsBackupAgent extends BackupAgentHelper {
if (supplicantFile.exists()) supplicantFile.delete();
copyWifiSupplicantTemplate();
- FileOutputStream fos = new FileOutputStream(filename, true);
- fos.write("\n".getBytes());
- fos.write(bytes);
+ OutputStream os = new BufferedOutputStream(new FileOutputStream(filename, true));
+ os.write("\n".getBytes());
+ os.write(bytes);
+ os.close();
} catch (IOException ioe) {
Log.w(TAG, "Couldn't restore " + filename);
}
diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk
index 4c83768..2c13069 100644
--- a/packages/SystemUI/Android.mk
+++ b/packages/SystemUI/Android.mk
@@ -3,11 +3,16 @@ include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
+LOCAL_SRC_FILES := $(call all-subdir-java-files) \
+ ../../../ex/carousel/java/com/android/ex/carousel/carousel.rs
LOCAL_JAVA_LIBRARIES := services
+LOCAL_STATIC_JAVA_LIBRARIES := android-common-carousel
+
LOCAL_PACKAGE_NAME := SystemUI
LOCAL_CERTIFICATE := platform
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+
include $(BUILD_PACKAGE)
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 7995869..d824f30 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -5,16 +5,22 @@
>
<uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
+ <uses-permission android:name="android.permission.BLUETOOTH" />
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+ <uses-permission android:name="android.permission.GET_TASKS" />
<application
android:persistent="true"
android:allowClearUserData="false"
android:label="@string/app_label"
android:icon="@drawable/ic_launcher_settings">
-
- <service
- android:name=".statusbar.StatusBarService"
- android:exported="false"
+
+ <!-- Broadcast receiver that gets the broadcast at boot time and starts
+ up everything else.
+ TODO: Should have an android:permission attribute
+ -->
+ <service android:name="SystemUIService"
+ android:exported="true"
/>
<activity android:name=".usb.UsbStorageActivity"
@@ -25,5 +31,12 @@
android:excludeFromRecents="true">
</activity>
+ <activity android:name=".recent.RecentApplicationsActivity"
+ android:theme="@android:style/Theme.NoTitleBar"
+ android:excludeFromRecents="true"
+ android:launchMode="singleInstance"
+ android:exported="true">
+ </activity>
+
</application>
</manifest>
diff --git a/packages/SystemUI/assets/fonts/AndroidClock.ttf b/packages/SystemUI/assets/fonts/AndroidClock.ttf
new file mode 100644
index 0000000..3945183
--- /dev/null
+++ b/packages/SystemUI/assets/fonts/AndroidClock.ttf
Binary files differ
diff --git a/packages/SystemUI/assets/fonts/AndroidClock2.ttf b/packages/SystemUI/assets/fonts/AndroidClock2.ttf
new file mode 100644
index 0000000..fa0221e
--- /dev/null
+++ b/packages/SystemUI/assets/fonts/AndroidClock2.ttf
Binary files differ
diff --git a/packages/SystemUI/proguard.flags b/packages/SystemUI/proguard.flags
new file mode 100644
index 0000000..5e48461
--- /dev/null
+++ b/packages/SystemUI/proguard.flags
@@ -0,0 +1,6 @@
+-keep class com.android.systemui.statusbar.tablet.TabletStatusBarService {
+ public void notificationIconsClicked(android.view.View);
+ public void systemInfoClicked(android.view.View);
+ public void recentButtonClicked(android.view.View);
+ public void toggleLightsOut(android.view.View);
+}
diff --git a/packages/SystemUI/res/anim/hydraulic_brake_interpolator.xml b/packages/SystemUI/res/anim/hydraulic_brake_interpolator.xml
new file mode 100644
index 0000000..5b6778e
--- /dev/null
+++ b/packages/SystemUI/res/anim/hydraulic_brake_interpolator.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/res/anim/ease_out_interpolator.xml
+**
+** Copyright 2007, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<decelerateInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:factor="10.0" />
diff --git a/packages/SystemUI/res/anim/lights_out_in.xml b/packages/SystemUI/res/anim/lights_out_in.xml
new file mode 100644
index 0000000..f76a452
--- /dev/null
+++ b/packages/SystemUI/res/anim/lights_out_in.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <translate android:fromYDelta="-100%p" android:toYDelta="0"
+ android:duration="@android:integer/config_mediumAnimTime"
+ android:interpolator="@anim/hydraulic_brake_interpolator"
+ />
+ <alpha android:fromAlpha="0.5" android:toAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/lights_out_out.xml b/packages/SystemUI/res/anim/lights_out_out.xml
new file mode 100644
index 0000000..610ac7a
--- /dev/null
+++ b/packages/SystemUI/res/anim/lights_out_out.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <translate android:toYDelta="-100%p" android:fromYDelta="0"
+ android:duration="@android:integer/config_mediumAnimTime"
+ android:interpolator="@anim/hydraulic_brake_interpolator"
+ />
+ <alpha android:toAlpha="0.5" android:fromAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/notification_buttons_in.xml b/packages/SystemUI/res/anim/notification_buttons_in.xml
new file mode 100644
index 0000000..630fd72
--- /dev/null
+++ b/packages/SystemUI/res/anim/notification_buttons_in.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/notification_buttons_out.xml b/packages/SystemUI/res/anim/notification_buttons_out.xml
new file mode 100644
index 0000000..4717e47
--- /dev/null
+++ b/packages/SystemUI/res/anim/notification_buttons_out.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <alpha android:toAlpha="0.0" android:fromAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/notification_dnd_off.xml b/packages/SystemUI/res/anim/notification_dnd_off.xml
new file mode 100644
index 0000000..4e88855
--- /dev/null
+++ b/packages/SystemUI/res/anim/notification_dnd_off.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <translate android:fromXDelta="100%p" android:toXDelta="0"
+ android:duration="@android:integer/config_longAnimTime"
+ android:interpolator="@anim/hydraulic_brake_interpolator"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/notification_dnd_on.xml b/packages/SystemUI/res/anim/notification_dnd_on.xml
new file mode 100644
index 0000000..309943b
--- /dev/null
+++ b/packages/SystemUI/res/anim/notification_dnd_on.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <translate android:toXDelta="100%p" android:fromXDelta="0"
+ android:duration="@android:integer/config_longAnimTime"
+ android:interpolator="@anim/hydraulic_brake_interpolator"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/notification_icons_in.xml b/packages/SystemUI/res/anim/notification_icons_in.xml
new file mode 100644
index 0000000..630fd72
--- /dev/null
+++ b/packages/SystemUI/res/anim/notification_icons_in.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/notification_icons_out.xml b/packages/SystemUI/res/anim/notification_icons_out.xml
new file mode 100644
index 0000000..4717e47
--- /dev/null
+++ b/packages/SystemUI/res/anim/notification_icons_out.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <alpha android:toAlpha="0.0" android:fromAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/recent_app_enter.xml b/packages/SystemUI/res/anim/recent_app_enter.xml
new file mode 100644
index 0000000..4947eee
--- /dev/null
+++ b/packages/SystemUI/res/anim/recent_app_enter.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+-->
+
+<!-- Special window zoom animation: this is the element that enters the screen,
+ it starts at 200% and scales down. Goes with zoom_exit.xml. -->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/decelerate_interpolator">
+ <scale android:fromXScale="0.25" android:toXScale="1.0"
+ android:fromYScale="0.25" android:toYScale="1.0"
+ android:pivotX="0%p" android:pivotY="0%p"
+ android:duration="500" />
+ <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:duration="500"/>
+</set>
diff --git a/packages/SystemUI/res/anim/recent_app_leave.xml b/packages/SystemUI/res/anim/recent_app_leave.xml
new file mode 100644
index 0000000..3d83988
--- /dev/null
+++ b/packages/SystemUI/res/anim/recent_app_leave.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+-->
+
+<!-- Special window zoom animation: this is the element that enters the screen,
+ it starts at 200% and scales down. Goes with zoom_exit.xml. -->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/decelerate_interpolator">
+ <scale android:fromXScale="1.0" android:toXScale="0.25"
+ android:fromYScale="1.0" android:toYScale="0.25"
+ android:pivotX="0%p" android:pivotY="0%p"
+ android:duration="500" />
+ <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
+ android:duration="500"/>
+</set>
diff --git a/packages/SystemUI/res/anim/status_bar_in.xml b/packages/SystemUI/res/anim/status_bar_in.xml
new file mode 100644
index 0000000..79fe5f1
--- /dev/null
+++ b/packages/SystemUI/res/anim/status_bar_in.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <translate android:fromYDelta="100%p" android:toYDelta="0"
+ android:duration="@android:integer/config_longAnimTime"
+ android:interpolator="@anim/hydraulic_brake_interpolator"
+ />
+ <alpha android:fromAlpha="0.5" android:toAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/status_bar_out.xml b/packages/SystemUI/res/anim/status_bar_out.xml
new file mode 100644
index 0000000..80863cf
--- /dev/null
+++ b/packages/SystemUI/res/anim/status_bar_out.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <translate android:toYDelta="100%p" android:fromYDelta="0"
+ android:duration="@android:integer/config_longAnimTime"
+ android:interpolator="@anim/hydraulic_brake_interpolator"
+ />
+ <alpha android:toAlpha="0.5" android:fromAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/system_in.xml b/packages/SystemUI/res/anim/system_in.xml
new file mode 100644
index 0000000..630fd72
--- /dev/null
+++ b/packages/SystemUI/res/anim/system_in.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/anim/system_out.xml b/packages/SystemUI/res/anim/system_out.xml
new file mode 100644
index 0000000..4717e47
--- /dev/null
+++ b/packages/SystemUI/res/anim/system_out.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <alpha android:toAlpha="0.0" android:fromAlpha="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ />
+</set>
diff --git a/packages/SystemUI/res/drawable-hdpi/alert_bar_background_normal.9.png b/packages/SystemUI/res/drawable-hdpi/alert_bar_background_normal.9.png
new file mode 100644
index 0000000..bc127bd
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/alert_bar_background_normal.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/alert_bar_background_pressed.9.png b/packages/SystemUI/res/drawable-hdpi/alert_bar_background_pressed.9.png
new file mode 100644
index 0000000..59af804
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/alert_bar_background_pressed.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/battery_0.png b/packages/SystemUI/res/drawable-hdpi/battery_0.png
new file mode 100644
index 0000000..f4103a8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/battery_100.png b/packages/SystemUI/res/drawable-hdpi/battery_100.png
new file mode 100644
index 0000000..061cbe5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/battery_20.png b/packages/SystemUI/res/drawable-hdpi/battery_20.png
new file mode 100644
index 0000000..0064027
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/battery_20.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/battery_40.png b/packages/SystemUI/res/drawable-hdpi/battery_40.png
new file mode 100644
index 0000000..10de0e7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/battery_40.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/battery_60.png b/packages/SystemUI/res/drawable-hdpi/battery_60.png
new file mode 100644
index 0000000..aa2b8ef
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/battery_60.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/battery_80.png b/packages/SystemUI/res/drawable-hdpi/battery_80.png
new file mode 100644
index 0000000..fe231f0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/battery_80.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png b/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png
index 2c7a0d4..e74c22f 100644
--- a/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png
+++ b/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/button_frame_default.9.png b/packages/SystemUI/res/drawable-hdpi/button_frame_default.9.png
new file mode 100644
index 0000000..d809b84
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/button_frame_default.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/button_frame_pressed.9.png b/packages/SystemUI/res/drawable-hdpi/button_frame_pressed.9.png
new file mode 100644
index 0000000..5cc007c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/button_frame_pressed.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.png b/packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.png
deleted file mode 100644
index d21aad2..0000000
--- a/packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/divider_horizontal_light_opaque.9.png b/packages/SystemUI/res/drawable-hdpi/divider_horizontal_light_opaque.9.png
deleted file mode 100644
index f70f079..0000000
--- a/packages/SystemUI/res/drawable-hdpi/divider_horizontal_light_opaque.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/dots_empty.png b/packages/SystemUI/res/drawable-hdpi/dots_empty.png
new file mode 100644
index 0000000..31e7654
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/dots_empty.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/dots_full.png b/packages/SystemUI/res/drawable-hdpi/dots_full.png
new file mode 100644
index 0000000..8c5c604
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/dots_full.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notification_open.png b/packages/SystemUI/res/drawable-hdpi/ic_notification_open.png
new file mode 100644
index 0000000..d083396
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_notification_open.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notification_veto.png b/packages/SystemUI/res/drawable-hdpi/ic_notification_veto.png
new file mode 100644
index 0000000..395604f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_notification_veto.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_airplane_off.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_airplane_off.png
new file mode 100644
index 0000000..c7578f1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_airplane_on.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_airplane_on.png
new file mode 100644
index 0000000..b76c366
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_airplane_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back.png
new file mode 100644
index 0000000..7f96b03
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_battery_mini.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_battery_mini.png
new file mode 100644
index 0000000..c541c7c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_battery_mini.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_battery_on.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_battery_on.png
new file mode 100644
index 0000000..1e55c88
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_battery_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_bluetooth_off.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_bluetooth_off.png
new file mode 100644
index 0000000..8045e96
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_bluetooth_on.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_bluetooth_on.png
new file mode 100644
index 0000000..858a191
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_bluetooth_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness.png
new file mode 100644
index 0000000..6e8995e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness_auto.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness_auto.png
new file mode 100644
index 0000000..35d9425e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness_auto.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness_low.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness_low.png
new file mode 100644
index 0000000..808af5c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_brightness_low.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_close.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_close.png
new file mode 100644
index 0000000..0ae98d6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_close.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_default_bg.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_default_bg.png
new file mode 100644
index 0000000..4272f32
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_default_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_gps_off.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_gps_off.png
new file mode 100644
index 0000000..8a4932b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_gps_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_gps_on.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_gps_on.png
new file mode 100644
index 0000000..029ea22
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_gps_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
new file mode 100644
index 0000000..c43a019
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_default.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_default.png
new file mode 100644
index 0000000..499244b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_lightsout.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_lightsout.png
new file mode 100644
index 0000000..97897b9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_lightsout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu.png
new file mode 100644
index 0000000..7af5454
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_avail.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_avail.png
new file mode 100644
index 0000000..1a2af70
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_avail.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_avail_open.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_avail_open.png
new file mode 100644
index 0000000..cdeadb8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_avail_open.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_dnd.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_dnd.png
new file mode 100644
index 0000000..2bccff0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_dnd.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_none.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_none.png
new file mode 100644
index 0000000..5417216
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_none.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_none_open.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_none_open.png
new file mode 100644
index 0000000..544e6ba
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_noti_none_open.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_notification_dnd.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_notification_dnd.png
new file mode 100644
index 0000000..51b5809
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_notification_dnd.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_notification_dnd_off.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_notification_dnd_off.png
new file mode 100644
index 0000000..37ef7e1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_notification_dnd_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_open.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_open.png
new file mode 100644
index 0000000..5813a34
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_open.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket.png
new file mode 100644
index 0000000..12b6cea
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_drag.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_drag.png
new file mode 100644
index 0000000..28590bc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_drag.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_hidden.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_hidden.png
new file mode 100644
index 0000000..c66ad77
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_hidden.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_holding.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_holding.png
new file mode 100644
index 0000000..6416969
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_holding.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_press_bg.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_press_bg.png
new file mode 100644
index 0000000..513f2a2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_press_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_quicksettings.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_quicksettings.png
new file mode 100644
index 0000000..d9b4eca
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_quicksettings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent.png
new file mode 100644
index 0000000..2d80bb9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off.png
new file mode 100644
index 0000000..cf5174a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off_lanscape.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off_lanscape.png
new file mode 100644
index 0000000..c091489
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off_lanscape.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off_portrait.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off_portrait.png
new file mode 100644
index 0000000..73a9897
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_off_portrait.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_on.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_on.png
new file mode 100644
index 0000000..9acd6f4
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_shadow.9.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_shadow.9.png
new file mode 100644
index 0000000..7cb2643
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_shadow.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_sound_off.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_sound_off.png
new file mode 100644
index 0000000..efdf566
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_sound_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_sound_on.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_sound_on.png
new file mode 100644
index 0000000..a1d5a2d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_sound_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_mini.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_mini.png
new file mode 100644
index 0000000..2475eb1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_mini.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_off.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_off.png
new file mode 100644
index 0000000..fd747a1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_on.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_on.png
new file mode 100644
index 0000000..7c88935
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recent_overlay.png b/packages/SystemUI/res/drawable-hdpi/recent_overlay.png
new file mode 100644
index 0000000..fcf4417
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/recent_overlay.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recent_rez_border.png b/packages/SystemUI/res/drawable-hdpi/recent_rez_border.png
new file mode 100644
index 0000000..af36ac7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/recent_rez_border.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/signal_0.png b/packages/SystemUI/res/drawable-hdpi/signal_0.png
new file mode 100644
index 0000000..00e36c4
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/signal_100.png b/packages/SystemUI/res/drawable-hdpi/signal_100.png
new file mode 100644
index 0000000..96e52ff
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/signal_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/signal_20.png b/packages/SystemUI/res/drawable-hdpi/signal_20.png
new file mode 100644
index 0000000..c0f652a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/signal_20.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/signal_40.png b/packages/SystemUI/res/drawable-hdpi/signal_40.png
new file mode 100644
index 0000000..995dd8e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/signal_40.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/signal_60.png b/packages/SystemUI/res/drawable-hdpi/signal_60.png
new file mode 100644
index 0000000..51e31ba
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/signal_60.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/signal_80.png b/packages/SystemUI/res/drawable-hdpi/signal_80.png
new file mode 100644
index 0000000..afa656e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/signal_80.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.png b/packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.png
index 2d3eb30..89daee1 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
index e8fbc9e..96dc085 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png
index 18c77df..1e4bbf5 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png
index 818e292..bdc8c27 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png
index 95866b1..d0d1345 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png
index 016b30b..4211b8c 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png
index ec672eb..d5ece7a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png
index 27bab73..6687b40 100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png
index 0e6849b..ba24082 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png
index a86a324..5af2b05 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png
index 24902d6..9909b09 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png
index 4160a95..0e02b8d 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png
index d459ee3..f84ad32 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png
index 7b64751..d80a8ce 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png
index d82930c..31c976a 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_e.png
index 8096846..ae90cc8 100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_g.png
index e94e146..a487f29 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png
index 8805a40..816085b 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png
index 07545d5..0132019 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_3g.png
index 7629cef..3903545 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_e.png
index 28578c6..ed099ff 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_g.png
index d9f7a30..c930e4c 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_h.png
index 505ccd4..407a06c 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png
index 783c2b6..6141f72 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_3g.png
index 001eaea..d44a4cf 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_e.png
index cbae7dc..54ebd9b 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png
index 11f3a5c..2fe0bbf 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_h.png
index eb42294..e58e019 100644..100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png
index 66fb60e..00a29a4 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png
index 07ea499..11ee0f2 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png
index e39767a..fc135fc 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png
index 47c1fca..3d33a62 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png
index ac80dce..f36e1eb 100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.png
index f88091b..ef5dbf4 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png
index 95bb3cd..dba9675 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png
index 0ef4701..2e5d82e 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png
index 31b926b..0985a09 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png
index ed02984..7a32c43 100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png
index 0ee5b08..b622556 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png
index cac7802..04ec59e 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png
index df6e195..a47b982 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png
index 4a2f867..9d90e71 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png
index 2b4628f..920f290 100755
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png
index 150c9fc..9003d67 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.png
index 1ef75d3..95ba181 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully.png
index 1ef75d3..95ba181 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1.png
index a7dc07e..adf668d 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully.png
index f1f4c4e..adf668d 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.png
index 918a476..7bf6b51 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully.png
index 6e34e66..7bf6b51 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.png
index 5b2acc6..78738ac 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully.png
index 3664ab4..78738ac 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.png
index f1ff548..ac88143 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully.png
index b4fa481..ac88143 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png
index 5a741bb..bdd37e1 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png
index 7ff375a..21c1c08 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png
index 01c7e2a..7a419f1 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
index 03d2147..1adc05a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_back_default.png b/packages/SystemUI/res/drawable-hdpi/status_bar_back_default.png
new file mode 100644
index 0000000..a9f9540
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_back_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_back_pressed.png b/packages/SystemUI/res/drawable-hdpi/status_bar_back_pressed.png
new file mode 100644
index 0000000..b8aa190
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_back_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
deleted file mode 100644
index 1d0192c..0000000
--- a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_expand_default.png b/packages/SystemUI/res/drawable-hdpi/status_bar_expand_default.png
new file mode 100644
index 0000000..92fc7f8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_expand_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_expand_pressed.png b/packages/SystemUI/res/drawable-hdpi/status_bar_expand_pressed.png
new file mode 100644
index 0000000..77f09ac
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_expand_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_home_default.png b/packages/SystemUI/res/drawable-hdpi/status_bar_home_default.png
new file mode 100644
index 0000000..cb951dd
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_home_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_home_pressed.png b/packages/SystemUI/res/drawable-hdpi/status_bar_home_pressed.png
new file mode 100644
index 0000000..a835ad5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_home_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_icon_tray.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_icon_tray.9.png
new file mode 100644
index 0000000..e1f041c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_icon_tray.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_item_app_background_normal.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_item_app_background_normal.9.png
new file mode 100644
index 0000000..4fbfa4f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_item_app_background_normal.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_menu_default.png b/packages/SystemUI/res/drawable-hdpi/status_bar_menu_default.png
new file mode 100644
index 0000000..14779cf
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_menu_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_menu_pressed.png b/packages/SystemUI/res/drawable-hdpi/status_bar_menu_pressed.png
new file mode 100644
index 0000000..6c3d4c9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_menu_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_recent_default.png b/packages/SystemUI/res/drawable-hdpi/status_bar_recent_default.png
new file mode 100644
index 0000000..dc4cb51
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_recent_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_recent_pressed.png b/packages/SystemUI/res/drawable-hdpi/status_bar_recent_pressed.png
new file mode 100644
index 0000000..dc4cb51
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_recent_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_veto_normal.png b/packages/SystemUI/res/drawable-hdpi/status_bar_veto_normal.png
new file mode 100644
index 0000000..df532b8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_veto_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_veto_pressed.png b/packages/SystemUI/res/drawable-hdpi/status_bar_veto_pressed.png
new file mode 100644
index 0000000..118c01b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_veto_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_hidenotification_handle.png b/packages/SystemUI/res/drawable-hdpi/sysbar_hidenotification_handle.png
new file mode 100644
index 0000000..64945d4
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_hidenotification_handle.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_minimeter_bg.png b/packages/SystemUI/res/drawable-hdpi/sysbar_minimeter_bg.png
new file mode 100644
index 0000000..b59bf1d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_minimeter_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_panel_bg.9.png b/packages/SystemUI/res/drawable-hdpi/sysbar_panel_bg.9.png
new file mode 100644
index 0000000..2d5ccfa
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_panel_recents_bg.9.png b/packages/SystemUI/res/drawable-hdpi/sysbar_panel_recents_bg.9.png
new file mode 100644
index 0000000..cd8120b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_panel_recents_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_0.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_0.png
new file mode 100644
index 0000000..8811252
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_10.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_10.png
new file mode 100644
index 0000000..9c6d641
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_10.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_100.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_100.png
new file mode 100644
index 0000000..58f0129
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_20.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_20.png
new file mode 100644
index 0000000..440bd50
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_20.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_30.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_30.png
new file mode 100644
index 0000000..cc17a9f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_30.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_40.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_40.png
new file mode 100644
index 0000000..87537f7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_40.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_50.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_50.png
new file mode 100644
index 0000000..2aa5967
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_50.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_60.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_60.png
new file mode 100644
index 0000000..bedb646
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_60.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_70.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_70.png
new file mode 100644
index 0000000..9b4a966
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_70.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_80.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_80.png
new file mode 100644
index 0000000..73ed185
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_80.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signal_90.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_90.png
new file mode 100644
index 0000000..8e0c706
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signal_90.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_signalmini_100.png b/packages/SystemUI/res/drawable-hdpi/sysbar_signalmini_100.png
new file mode 100644
index 0000000..d89f889
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_signalmini_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_toggle_bg_off.9.png b/packages/SystemUI/res/drawable-hdpi/sysbar_toggle_bg_off.9.png
new file mode 100644
index 0000000..9dc0390
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_toggle_bg_off.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/sysbar_toggle_bg_on.9.png b/packages/SystemUI/res/drawable-hdpi/sysbar_toggle_bg_on.9.png
new file mode 100644
index 0000000..08fe94f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/sysbar_toggle_bg_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/system_panel_airplane_default.png b/packages/SystemUI/res/drawable-hdpi/system_panel_airplane_default.png
new file mode 100644
index 0000000..e375ee9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/system_panel_airplane_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/system_panel_brightness_default.png b/packages/SystemUI/res/drawable-hdpi/system_panel_brightness_default.png
new file mode 100644
index 0000000..f62502b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/system_panel_brightness_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/system_panel_orientation_default.png b/packages/SystemUI/res/drawable-hdpi/system_panel_orientation_default.png
new file mode 100644
index 0000000..e887fb8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/system_panel_orientation_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/system_panel_orientation_locked.png b/packages/SystemUI/res/drawable-hdpi/system_panel_orientation_locked.png
new file mode 100644
index 0000000..58159d5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/system_panel_orientation_locked.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/system_panel_sound_default.png b/packages/SystemUI/res/drawable-hdpi/system_panel_sound_default.png
new file mode 100644
index 0000000..6e857b5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/system_panel_sound_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-land-hdpi/ic_sysbar_rotate_off.png b/packages/SystemUI/res/drawable-land-hdpi/ic_sysbar_rotate_off.png
new file mode 100644
index 0000000..66f299c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-land-hdpi/ic_sysbar_rotate_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-land-mdpi/ic_sysbar_rotate_off.png b/packages/SystemUI/res/drawable-land-mdpi/ic_sysbar_rotate_off.png
new file mode 100644
index 0000000..adaadf7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-land-mdpi/ic_sysbar_rotate_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/divider_horizontal_dark_opaque.9.png b/packages/SystemUI/res/drawable-mdpi/alert_bar_background_normal.9.png
index 9444f0d..258de13 100644
--- a/packages/SystemUI/res/drawable-mdpi/divider_horizontal_dark_opaque.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/alert_bar_background_normal.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/statusbar_background.9.png b/packages/SystemUI/res/drawable-mdpi/alert_bar_background_pressed.9.png
index 6c588f7..258de13 100644
--- a/packages/SystemUI/res/drawable-mdpi/statusbar_background.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/alert_bar_background_pressed.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/battery_0.png b/packages/SystemUI/res/drawable-mdpi/battery_0.png
new file mode 100644
index 0000000..00fb261
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/battery_100.png b/packages/SystemUI/res/drawable-mdpi/battery_100.png
new file mode 100644
index 0000000..600da18
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/battery_20.png b/packages/SystemUI/res/drawable-mdpi/battery_20.png
new file mode 100644
index 0000000..5545cdb
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/battery_20.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/battery_40.png b/packages/SystemUI/res/drawable-mdpi/battery_40.png
new file mode 100644
index 0000000..f57ce03
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/battery_40.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/battery_60.png b/packages/SystemUI/res/drawable-mdpi/battery_60.png
new file mode 100644
index 0000000..c8affe2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/battery_60.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/battery_80.png b/packages/SystemUI/res/drawable-mdpi/battery_80.png
new file mode 100644
index 0000000..d877fe1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/battery_80.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/battery_low_battery.png b/packages/SystemUI/res/drawable-mdpi/battery_low_battery.png
index 7417afc..e74c22f 100644
--- a/packages/SystemUI/res/drawable-mdpi/battery_low_battery.png
+++ b/packages/SystemUI/res/drawable-mdpi/battery_low_battery.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/button_frame_default.9.png b/packages/SystemUI/res/drawable-mdpi/button_frame_default.9.png
new file mode 100644
index 0000000..7ab1f26
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/button_frame_default.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/button_frame_pressed.9.png b/packages/SystemUI/res/drawable-mdpi/button_frame_pressed.9.png
new file mode 100644
index 0000000..08f7a4d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/button_frame_pressed.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/divider_horizontal_light_opaque.9.png b/packages/SystemUI/res/drawable-mdpi/divider_horizontal_light_opaque.9.png
deleted file mode 100644
index f70f079..0000000
--- a/packages/SystemUI/res/drawable-mdpi/divider_horizontal_light_opaque.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/dots_empty.png b/packages/SystemUI/res/drawable-mdpi/dots_empty.png
new file mode 100644
index 0000000..22ada41
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/dots_empty.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/dots_full.png b/packages/SystemUI/res/drawable-mdpi/dots_full.png
new file mode 100644
index 0000000..2a346d6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/dots_full.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notification_open.png b/packages/SystemUI/res/drawable-mdpi/ic_notification_open.png
new file mode 100644
index 0000000..17fd52e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_notification_open.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png
index 8ed5e5c..1a3063c 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notification_veto.png b/packages/SystemUI/res/drawable-mdpi/ic_notification_veto.png
new file mode 100644
index 0000000..f6299e9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_notification_veto.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_airplane_off.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_airplane_off.png
new file mode 100644
index 0000000..d897ba6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_airplane_on.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_airplane_on.png
new file mode 100644
index 0000000..0296b5b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_airplane_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_default.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_default.png
new file mode 100644
index 0000000..615c8b6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.png
new file mode 100644
index 0000000..0122025
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_pressed.png
new file mode 100644
index 0000000..0786916
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_pressed.png
new file mode 100644
index 0000000..35f9240
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_battery_on.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_battery_on.png
new file mode 100644
index 0000000..668b472
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_battery_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_bluetooth_off.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_bluetooth_off.png
new file mode 100644
index 0000000..e463ba4
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_bluetooth_on.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_bluetooth_on.png
new file mode 100644
index 0000000..1239d50
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_bluetooth_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness.png
new file mode 100644
index 0000000..97fa5fc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness_auto.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness_auto.png
new file mode 100644
index 0000000..37a1533
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness_auto.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness_low.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness_low.png
new file mode 100644
index 0000000..8a55e3a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_brightness_low.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_close.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_close.png
new file mode 100644
index 0000000..53abcbc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_close.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_default_bg.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_default_bg.png
new file mode 100644
index 0000000..3e82d4e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_default_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_gps_off.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_gps_off.png
new file mode 100644
index 0000000..dc2ed34
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_gps_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_gps_on.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_gps_on.png
new file mode 100644
index 0000000..1e39fdc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_gps_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_default.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_default.png
new file mode 100644
index 0000000..3eb22df
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_pressed.png
new file mode 100644
index 0000000..1ce9bd1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_default.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_default.png
new file mode 100644
index 0000000..259db7a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_pressed.png
new file mode 100644
index 0000000..993ea55
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_lightsout.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_lightsout.png
new file mode 100644
index 0000000..8a07acc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_lightsout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_default.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_default.png
new file mode 100644
index 0000000..fef2cf9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_pressed.png
new file mode 100644
index 0000000..05593bc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.png
new file mode 100644
index 0000000..9123fef
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.png
new file mode 100644
index 0000000..8e56f2a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.png
new file mode 100644
index 0000000..80cf99c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.png
new file mode 100644
index 0000000..e0d018b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.png
new file mode 100644
index 0000000..5db8c9c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_notification_dnd.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_notification_dnd.png
new file mode 100644
index 0000000..fe44063
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_notification_dnd.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_notification_dnd_off.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_notification_dnd_off.png
new file mode 100644
index 0000000..8088a2f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_notification_dnd_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_open.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_open.png
new file mode 100644
index 0000000..b7d624e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_open.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.png
new file mode 100644
index 0000000..90dffa9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_drag.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_drag.png
new file mode 100644
index 0000000..dcce495
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_drag.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.png
new file mode 100644
index 0000000..93b0d23
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_holding.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_holding.png
new file mode 100644
index 0000000..9eb9dc6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_holding.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_press_bg.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_press_bg.png
new file mode 100644
index 0000000..0958393
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_press_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_quicksettings.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_quicksettings.png
new file mode 100644
index 0000000..4434b5c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_quicksettings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_default.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_default.png
new file mode 100644
index 0000000..32c2c79
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_pressed.png
new file mode 100644
index 0000000..142c413
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off.png
new file mode 100644
index 0000000..9e6793a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off_lanscape.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off_lanscape.png
new file mode 100644
index 0000000..96bf2ec
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off_lanscape.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off_portrait.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off_portrait.png
new file mode 100644
index 0000000..cc56778
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_off_portrait.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_on.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_on.png
new file mode 100644
index 0000000..4517d1b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.png
new file mode 100644
index 0000000..c888c21
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_sound_off.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_sound_off.png
new file mode 100644
index 0000000..bd11e86
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_sound_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_sound_on.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_sound_on.png
new file mode 100644
index 0000000..1b3ba2f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_sound_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_off.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_off.png
new file mode 100644
index 0000000..87acc14
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_on.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_on.png
new file mode 100644
index 0000000..bbb1c74
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recent_overlay.png b/packages/SystemUI/res/drawable-mdpi/recent_overlay.png
new file mode 100644
index 0000000..4dfa3d9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/recent_overlay.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recent_rez_border.png b/packages/SystemUI/res/drawable-mdpi/recent_rez_border.png
new file mode 100644
index 0000000..ad025f5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/recent_rez_border.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/signal_0.png b/packages/SystemUI/res/drawable-mdpi/signal_0.png
new file mode 100644
index 0000000..00fb261
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/signal_100.png b/packages/SystemUI/res/drawable-mdpi/signal_100.png
new file mode 100644
index 0000000..59df547
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/signal_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/signal_20.png b/packages/SystemUI/res/drawable-mdpi/signal_20.png
new file mode 100644
index 0000000..3bce724
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/signal_20.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/signal_40.png b/packages/SystemUI/res/drawable-mdpi/signal_40.png
new file mode 100644
index 0000000..570069c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/signal_40.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/signal_60.png b/packages/SystemUI/res/drawable-mdpi/signal_60.png
new file mode 100644
index 0000000..0cfc7a6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/signal_60.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/signal_80.png b/packages/SystemUI/res/drawable-mdpi/signal_80.png
new file mode 100644
index 0000000..66201d0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/signal_80.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_notify_alarm.png b/packages/SystemUI/res/drawable-mdpi/stat_notify_alarm.png
index bd04206..1b01b85 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_notify_alarm.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_notify_alarm.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_notify_more.png b/packages/SystemUI/res/drawable-mdpi/stat_notify_more.png
index 63e3985..e129ba9 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_notify_more.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_notify_more.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
index 640d612..3ddf728 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png
index a9a5385..f09b83b 100644..100755
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png
index 78ece9e..f8b6f11 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png
index 31fc1b0..3198abc 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png
index 19adb4b..16e3b0b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png
index fd419ea..91db8e8 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png
index 94e77ae..44ab1ec 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png
index 91328c0..c9d6719 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png
index 2fee692..e0a39cf 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png
index d0968aa..93b8f94 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png
index 991228b..5561011 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png
index ae03e38..697b908 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_1x.png
index 97b011e..4cced10 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_3g.png
index a826866..6f2f058 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_e.png
index f6a6891..b523d64 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_g.png
index 19b9816..c9bbf6c 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_h.png
index f8c0961..6bc637a 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_in_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_1x.png
index 22deb70..6e47d43 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_3g.png
index c7c1b49..a20e5bf 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_e.png
index d9a0702..8f135a5 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_g.png
index 6beed8a..cecf2c6 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_h.png
index e4179c1..3f86741 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_inandout_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_1x.png
index 4b2f86d..4740b9f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_3g.png
index 6779604..5d0ac29 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_e.png
index 1309a97..768eac6 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_g.png
index 2fc1e8e..49d6279 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_h.png
index 0eef2c1..4d7df96 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_out_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_1x.png
index f8904e2..3045a57 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_3g.png
index 3ef306e..661eccc 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_e.png
index 2ff6d90..401cb55 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_g.png
index 8ff49b0..cc4e26f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_h.png
index f416203..a000da2 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_1x.png
index 24b7daa..32c547e 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_3g.png
index 5ea9142..d769174 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_e.png
index 5bf6aca..c895aeb 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_g.png
index 002bf46..c201350 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_h.png
index 924b84f..df2aa30 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_1x.png
index bd0d1ca..6b1a914 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_3g.png
index f583eec..5edc35a 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_e.png
index 66940ea..c94c001 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_g.png
index 0381f52..16c3d6b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_h.png
index 0b84fe8..7daf6af 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png
index e5e98f9..31bc94e 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0.png
index 7f6fa9c..8f5b3ef 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully.png
index 7f6fa9c..8f5b3ef 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1.png
index ca20839..960c0e2 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully.png
index 1ad5d8b..960c0e2 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2.png
index 6eba560..a115a23 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully.png
index f2358dd..a115a23 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3.png
index 1ebe23e..0ef34df 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully.png
index 468ad7d..0ef34df 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4.png
index d9f2a0d..648599b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully.png
index 290822a..648599b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png
index e0a3141..d62f32d 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png
index 116b8e2..665ca38 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
index 168cbf8..9216030 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
index 168cbf8..9216030 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png
index 8ce41ab..e529f6f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
index 3736d58..e529f6f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1x.png
new file mode 100644
index 0000000..02c27ee
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png
index a6fb566..57558ad 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
index 3469149..57558ad 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png
index fe0e93f..e4425b2 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
index 36cd50c..e4425b2 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3g.png
new file mode 100644
index 0000000..84ac927
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png
index 4ca603f..09de6b0 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
index 993216a..09de6b0 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_edge.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_edge.png
new file mode 100644
index 0000000..13cae40
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_edge.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_flightmode.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_flightmode.png
index 4f0d1f1..690b5f6 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_flightmode.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_flightmode.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_gprs.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_gprs.png
new file mode 100644
index 0000000..d0a4fd0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_gprs.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_hsdpa.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_hsdpa.png
new file mode 100644
index 0000000..05976bd
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_hsdpa.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
index 5d9957a..cf13c79 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_roam.png
new file mode 100644
index 0000000..2cc3cd6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
index c8b82b5..1c59b2a 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0_fully.png
new file mode 100644
index 0000000..1c59b2a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png
index d049baa..32e9165 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
index 1b3b164..32e9165 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png
index 28b7af6..ea71298 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
index b0a6bf9..ea71298 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png
index e39061c..869a497 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
index d63f1ed..869a497 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png
index cfd01ab..1711c82 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
index 19165ab..1711c82 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_back_default.png b/packages/SystemUI/res/drawable-mdpi/status_bar_back_default.png
new file mode 100644
index 0000000..f99a66d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_back_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_back_pressed.png b/packages/SystemUI/res/drawable-mdpi/status_bar_back_pressed.png
new file mode 100644
index 0000000..94a0649
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_back_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
deleted file mode 100644
index 833ec10..0000000
--- a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_expand_default.png b/packages/SystemUI/res/drawable-mdpi/status_bar_expand_default.png
new file mode 100644
index 0000000..ce64926
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_expand_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_expand_pressed.png b/packages/SystemUI/res/drawable-mdpi/status_bar_expand_pressed.png
new file mode 100644
index 0000000..c63c426
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_expand_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_home_default.png b/packages/SystemUI/res/drawable-mdpi/status_bar_home_default.png
new file mode 100644
index 0000000..7e8ade5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_home_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_home_pressed.png b/packages/SystemUI/res/drawable-mdpi/status_bar_home_pressed.png
new file mode 100644
index 0000000..7e8ade5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_home_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/statusbar_background.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_icon_tray.9.png
index a933833..502acce 100644
--- a/packages/SystemUI/res/drawable-hdpi/statusbar_background.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_icon_tray.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_item_app_background_normal.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_item_app_background_normal.9.png
new file mode 100644
index 0000000..c079615
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_item_app_background_normal.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_menu_default.png b/packages/SystemUI/res/drawable-mdpi/status_bar_menu_default.png
new file mode 100644
index 0000000..bf3a755
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_menu_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_menu_pressed.png b/packages/SystemUI/res/drawable-mdpi/status_bar_menu_pressed.png
new file mode 100644
index 0000000..15e21d73
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_menu_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_recent_default.png b/packages/SystemUI/res/drawable-mdpi/status_bar_recent_default.png
new file mode 100644
index 0000000..7de67b0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_recent_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_recent_pressed.png b/packages/SystemUI/res/drawable-mdpi/status_bar_recent_pressed.png
new file mode 100644
index 0000000..7de67b0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_recent_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_veto_normal.png b/packages/SystemUI/res/drawable-mdpi/status_bar_veto_normal.png
new file mode 100644
index 0000000..3b7c9c7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_veto_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_veto_pressed.png b/packages/SystemUI/res/drawable-mdpi/status_bar_veto_pressed.png
new file mode 100644
index 0000000..3b7c9c7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_veto_pressed.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_hidenotification_handle.png b/packages/SystemUI/res/drawable-mdpi/sysbar_hidenotification_handle.png
new file mode 100644
index 0000000..e43edd7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_hidenotification_handle.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_minimeter_bg.png b/packages/SystemUI/res/drawable-mdpi/sysbar_minimeter_bg.png
new file mode 100644
index 0000000..0d265fc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_minimeter_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_panel_bg.9.png b/packages/SystemUI/res/drawable-mdpi/sysbar_panel_bg.9.png
new file mode 100644
index 0000000..77e034b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_panel_recents_bg.9.png b/packages/SystemUI/res/drawable-mdpi/sysbar_panel_recents_bg.9.png
new file mode 100644
index 0000000..85726d2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_panel_recents_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_0.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_0.png
new file mode 100644
index 0000000..7371571
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_10.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_10.png
new file mode 100644
index 0000000..5781e9a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_10.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_100.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_100.png
new file mode 100644
index 0000000..c65728c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_20.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_20.png
new file mode 100644
index 0000000..a249fa2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_20.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_30.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_30.png
new file mode 100644
index 0000000..289c088
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_30.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_40.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_40.png
new file mode 100644
index 0000000..f49dbd6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_40.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_50.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_50.png
new file mode 100644
index 0000000..2f83e68
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_50.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_60.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_60.png
new file mode 100644
index 0000000..bedc021
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_60.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_70.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_70.png
new file mode 100644
index 0000000..edd8c05
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_70.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_80.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_80.png
new file mode 100644
index 0000000..148e20c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_80.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signal_90.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_90.png
new file mode 100644
index 0000000..5a90ccb
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signal_90.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_signalmini_100.png b/packages/SystemUI/res/drawable-mdpi/sysbar_signalmini_100.png
new file mode 100644
index 0000000..a5eaa63
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_signalmini_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_toggle_bg_off.9.png b/packages/SystemUI/res/drawable-mdpi/sysbar_toggle_bg_off.9.png
new file mode 100644
index 0000000..94849d8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_toggle_bg_off.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_toggle_bg_on.9.png b/packages/SystemUI/res/drawable-mdpi/sysbar_toggle_bg_on.9.png
new file mode 100644
index 0000000..f11058c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/sysbar_toggle_bg_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/system_panel_airplane_default.png b/packages/SystemUI/res/drawable-mdpi/system_panel_airplane_default.png
new file mode 100644
index 0000000..eb87532
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/system_panel_airplane_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/system_panel_brightness_default.png b/packages/SystemUI/res/drawable-mdpi/system_panel_brightness_default.png
new file mode 100644
index 0000000..3bfc83e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/system_panel_brightness_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/system_panel_orientation_default.png b/packages/SystemUI/res/drawable-mdpi/system_panel_orientation_default.png
new file mode 100644
index 0000000..0d8479c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/system_panel_orientation_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/system_panel_orientation_locked.png b/packages/SystemUI/res/drawable-mdpi/system_panel_orientation_locked.png
new file mode 100644
index 0000000..8f1d26c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/system_panel_orientation_locked.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/system_panel_sound_default.png b/packages/SystemUI/res/drawable-mdpi/system_panel_sound_default.png
new file mode 100644
index 0000000..22636d6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/system_panel_sound_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.png b/packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.png
new file mode 100644
index 0000000..6e13ebe
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/panel_notification.png b/packages/SystemUI/res/drawable-nodpi/panel_notification.png
new file mode 100644
index 0000000..b0d9c18
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/panel_notification.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-port-hdpi/ic_sysbar_rotate_off.png b/packages/SystemUI/res/drawable-port-hdpi/ic_sysbar_rotate_off.png
new file mode 100644
index 0000000..fcdda31
--- /dev/null
+++ b/packages/SystemUI/res/drawable-port-hdpi/ic_sysbar_rotate_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-port-mdpi/ic_sysbar_rotate_off.png b/packages/SystemUI/res/drawable-port-mdpi/ic_sysbar_rotate_off.png
new file mode 100644
index 0000000..fdc0ac7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-port-mdpi/ic_sysbar_rotate_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/app_icon.png b/packages/SystemUI/res/drawable-xlarge-hdpi/app_icon.png
new file mode 100644
index 0000000..aedf7e7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xlarge-hdpi/app_icon.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/app_icon.png b/packages/SystemUI/res/drawable-xlarge-mdpi/app_icon.png
new file mode 100644
index 0000000..50a8ac8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xlarge-mdpi/app_icon.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/alert_bar_background.xml b/packages/SystemUI/res/drawable/alert_bar_background.xml
new file mode 100644
index 0000000..24b6aa3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/alert_bar_background.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true"
+ android:drawable="@drawable/alert_bar_background_pressed" />
+ <item
+ android:drawable="@drawable/alert_bar_background_normal" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/button_frame.xml b/packages/SystemUI/res/drawable/button_frame.xml
new file mode 100644
index 0000000..5db39a5
--- /dev/null
+++ b/packages/SystemUI/res/drawable/button_frame.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/button_frame_pressed" />
+ <item android:drawable="@drawable/button_frame_default" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_back.xml b/packages/SystemUI/res/drawable/ic_sysbar_back.xml
new file mode 100644
index 0000000..327ccd8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_back.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/ic_sysbar_back_pressed" />
+ <item android:drawable="@drawable/ic_sysbar_back_default" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_back_ime.xml b/packages/SystemUI/res/drawable/ic_sysbar_back_ime.xml
new file mode 100644
index 0000000..248496d
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_back_ime.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/ic_sysbar_back_ime_pressed" />
+ <item android:drawable="@drawable/ic_sysbar_back_ime_default" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_home.xml b/packages/SystemUI/res/drawable/ic_sysbar_home.xml
new file mode 100644
index 0000000..f4e585e
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_home.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/ic_sysbar_home_pressed" />
+ <item android:drawable="@drawable/ic_sysbar_home_default" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_ime.xml b/packages/SystemUI/res/drawable/ic_sysbar_ime.xml
new file mode 100644
index 0000000..1accf00
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_ime.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/ic_sysbar_ime_pressed" />
+ <item android:drawable="@drawable/ic_sysbar_ime_default" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_menu.xml b/packages/SystemUI/res/drawable/ic_sysbar_menu.xml
new file mode 100644
index 0000000..7a10607
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_menu.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/ic_sysbar_menu_pressed" />
+ <item android:drawable="@drawable/ic_sysbar_menu_default" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_recent.xml b/packages/SystemUI/res/drawable/ic_sysbar_recent.xml
new file mode 100755
index 0000000..39a324b
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_recent.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/ic_sysbar_recent_pressed" />
+ <item android:drawable="@drawable/ic_sysbar_recent_default" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/status_bar_expand.xml b/packages/SystemUI/res/drawable/status_bar_expand.xml
new file mode 100644
index 0000000..f966920
--- /dev/null
+++ b/packages/SystemUI/res/drawable/status_bar_expand.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/status_bar_expand_pressed" />
+ <item android:drawable="@drawable/status_bar_expand_default" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/status_bar_item_background.xml b/packages/SystemUI/res/drawable/status_bar_item_background.xml
new file mode 100644
index 0000000..9da92a7
--- /dev/null
+++ b/packages/SystemUI/res/drawable/status_bar_item_background.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 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.
+-->
+
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:opacity="translucent"
+ >
+ <item
+ android:drawable="@drawable/notification_item_background_color"
+ android:left="16dp"
+ />
+</layer-list>
+
diff --git a/packages/SystemUI/res/drawable/status_bar_ticker_background.xml b/packages/SystemUI/res/drawable/status_bar_ticker_background.xml
new file mode 100644
index 0000000..c230358
--- /dev/null
+++ b/packages/SystemUI/res/drawable/status_bar_ticker_background.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:opacity="translucent"
+ >
+ <item
+ android:drawable="@drawable/ticker_background_color"
+ android:top="12dp"
+ />
+</layer-list>
+
+
diff --git a/packages/SystemUI/res/drawable/status_bar_veto.xml b/packages/SystemUI/res/drawable/status_bar_veto.xml
new file mode 100644
index 0000000..6e1b681
--- /dev/null
+++ b/packages/SystemUI/res/drawable/status_bar_veto.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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/status_bar_veto_pressed" />
+ <item android:drawable="@drawable/status_bar_veto_normal" />
+</selector>
+
diff --git a/packages/SystemUI/res/drawable/ticker_background.xml b/packages/SystemUI/res/drawable/ticker_background.xml
new file mode 100644
index 0000000..7320fa0
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ticker_background.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 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.
+-->
+
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:opacity="translucent"
+ >
+ <!-- the large icon extends 12dp beyond the edge of the status bar -->
+ <item
+ android:drawable="@drawable/notification_item_background_color"
+ android:top="12dp"
+ />
+</layer-list>
+
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml
new file mode 100644
index 0000000..758377b
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2010 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.
+-->
+
+<!-- android:background="@drawable/status_bar_closed_default_background" -->
+<com.android.systemui.statusbar.tablet.TabletStatusBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
+ android:background="@drawable/status_bar_background"
+ >
+ <RelativeLayout
+ android:id="@+id/bar_contents"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+
+ <!-- notification icons & panel access -->
+ <LinearLayout
+ android:id="@+id/notificationArea"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentRight="true"
+ android:orientation="horizontal"
+ >
+ <com.android.systemui.statusbar.tablet.NotificationIconArea
+ android:id="@+id/notificationIcons"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ >
+ <view
+ class="com.android.systemui.statusbar.tablet.NotificationIconArea$IconLayout"
+ android:id="@+id/icons"
+ android:layout_width="wrap_content"
+ android:layout_height="@*android:dimen/status_bar_icon_size"
+ android:layout_gravity="top"
+ android:layout_marginTop="5dp"
+ android:layout_marginLeft="8dp"
+ />
+ </com.android.systemui.statusbar.tablet.NotificationIconArea>
+
+ <LinearLayout
+ android:id="@+id/notificationTrigger"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ >
+ <com.android.systemui.statusbar.tablet.HoloClock
+ android:id="@+id/clock"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ >
+ <TextView android:id="@+id/time_bg"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:singleLine="true"
+ android:textSize="72dip"
+ android:textColor="#1f1f1f" />
+ <TextView android:id="@+id/time_fg"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:singleLine="true"
+ android:textSize="72dip"
+ android:textColor="#2e2e2e" />
+ </com.android.systemui.statusbar.tablet.HoloClock>
+
+ <LinearLayout
+ android:layout_width="48dip"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:gravity="center"
+ >
+ <FrameLayout
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_gravity="top"
+ android:layout_marginTop="19dp"
+ android:layout_marginRight="4dp"
+ >
+ <ImageView
+ android:id="@+id/network_signal"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ />
+ <ImageView
+ android:id="@+id/network_type"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ />
+ </FrameLayout>
+ <ImageView
+ android:id="@+id/battery"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_gravity="top"
+ android:layout_marginTop="19dp"
+ android:layout_marginLeft="2dp"
+ android:layout_marginRight="2dp"
+ />
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+
+ <!-- navigation controls -->
+ <LinearLayout
+ android:id="@+id/navigationArea"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentLeft="true"
+ android:orientation="horizontal"
+ >
+
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:src="@drawable/ic_sysbar_back"
+ systemui:keyCode="4"
+ />
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:src="@drawable/ic_sysbar_home"
+ systemui:keyCode="3"
+ />
+ <ImageButton android:id="@+id/recent_apps"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_sysbar_recent"
+ android:background="@null"
+ android:paddingLeft="18dip"
+ android:clickable="true"
+ android:paddingRight="18dip"
+ />
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:src="@drawable/ic_sysbar_menu"
+ systemui:keyCode="82"
+ android:visibility="invisible"
+ />
+ <com.android.systemui.statusbar.tablet.ShirtPocket
+ android:id="@+id/pocket"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:animateLayoutChanges="true"
+ android:clickable="true"
+ android:descendantFocusability="blocksDescendants"
+ android:gravity="center"
+ >
+ <ImageView
+ android:id="@+id/pocket_icon"
+ android:src="@drawable/ic_sysbar_pocket"
+ android:visibility="invisible"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ />
+ </com.android.systemui.statusbar.tablet.ShirtPocket>
+ <com.android.systemui.statusbar.tablet.InputMethodButton
+ android:id="@+id/imeSwitchButton"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="8dip"
+ android:src="@drawable/ic_sysbar_ime_default"
+ android:visibility="invisible"
+ />
+ <com.android.systemui.statusbar.tablet.InputMethodButton
+ android:id="@+id/imeShortcutButton"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="8dip"
+ android:src="@drawable/ic_sysbar_ime_default"
+ android:visibility="invisible"
+ />
+ </LinearLayout>
+
+ <!-- lights out mode: "shadow" views -->
+ <RelativeLayout
+ android:id="@+id/shadows"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+ <ImageView
+ android:id="@+id/notification_shadow"
+ android:layout_width="176dip"
+ android:layout_height="match_parent"
+ android:paddingRight="48dip"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ android:scaleType="fitXY"
+ />
+
+ <ImageView
+ android:id="@+id/back_shadow"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ />
+ <ImageView
+ android:id="@+id/home_shadow"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:layout_toRightOf="@id/back_shadow"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ />
+ <ImageView
+ android:id="@+id/recent_shadow"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:layout_toRightOf="@id/home_shadow"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ />
+ <ImageView
+ android:id="@+id/menu_shadow"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:layout_toRightOf="@id/recent_shadow"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ />
+ </RelativeLayout>
+ </RelativeLayout>
+</com.android.systemui.statusbar.tablet.TabletStatusBarView>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel.xml b/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel.xml
new file mode 100644
index 0000000..1d98458
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel.xml
@@ -0,0 +1,177 @@
+<!--
+ Copyright (C) 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.
+-->
+
+<!-- android:background="@drawable/status_bar_closed_default_background" -->
+<com.android.systemui.statusbar.tablet.NotificationPanel
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:animateLayoutChanges="true"
+ android:paddingTop="32dp"
+ android:paddingBottom="@dimen/status_bar_panel_bottom_offset"
+ android:orientation="vertical"
+ android:gravity="right"
+ >
+
+ <com.android.systemui.statusbar.tablet.NotificationTitleArea
+ android:id="@+id/title_area"
+ android:layout_height="160dp"
+ android:layout_width="384dp"
+ android:layout_marginLeft="24dp"
+ android:paddingTop="20dp"
+ android:orientation="vertical"
+ android:animateLayoutChanges="true"
+ >
+
+ <com.android.systemui.statusbar.tablet.HoloClock
+ android:id="@+id/clock"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_alignParentTop="true"
+ android:layout_marginRight="40dip"
+ android:layout_marginBottom="4dip"
+ >
+ <TextView android:id="@+id/time_bg"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="right"
+ android:singleLine="true"
+ android:textSize="90dip"
+ android:textColor="#999999" />
+ <TextView android:id="@+id/time_fg"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="right"
+ android:singleLine="true"
+ android:textSize="90dip"
+ android:textColor="#666666" />
+ </com.android.systemui.statusbar.tablet.HoloClock>
+
+ <com.android.systemui.statusbar.policy.DateView
+ android:id="@+id/date"
+ style="@style/StatusBarNotificationText"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_below="@id/clock"
+ android:layout_marginTop="4dp"
+ android:layout_marginRight="48dp"
+ android:gravity="right"
+ />
+
+ <ImageView
+ android:id="@+id/battery"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_below="@id/date"
+ android:layout_marginLeft="48dp"
+ android:layout_marginTop="18dp"
+ android:layout_marginRight="8dp"
+ android:baseline="15dp"
+ />
+
+ <TextView
+ android:id="@+id/battery_text"
+ style="@style/StatusBarNotificationText"
+ android:layout_width="56dp"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/battery"
+ android:layout_alignBaseline="@id/battery"
+ android:singleLine="true"
+ android:text="@string/status_bar_settings_settings_button"
+ />
+
+ <ImageView
+ android:id="@+id/network_signal"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_toRightOf="@id/battery_text"
+ android:layout_alignBaseline="@id/battery"
+ android:layout_marginRight="8dp"
+ android:baseline="15dp"
+ />
+
+ <ImageView
+ android:id="@+id/network_type"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_toRightOf="@id/battery_text"
+ android:layout_alignBaseline="@id/battery"
+ android:layout_marginRight="8dp"
+ android:baseline="15dp"
+ />
+
+ <TextView
+ android:id="@+id/network_text"
+ style="@style/StatusBarNotificationText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/network_signal"
+ android:layout_alignBaseline="@id/battery"
+ android:singleLine="true"
+ android:text="@string/status_bar_settings_settings_button"
+ />
+
+ <ImageView
+ android:id="@+id/settings_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignBaseline="@id/battery"
+ android:layout_alignParentRight="true"
+ android:paddingRight="16dp"
+ android:src="@drawable/ic_notification_open"
+ android:baseline="21dp"
+ />
+
+ <ImageView
+ android:id="@+id/notification_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignBaseline="@id/battery"
+ android:paddingRight="16dp"
+ android:visibility="invisible"
+ android:src="@drawable/status_bar_veto"
+ android:baseline="21dp"
+ />
+ </com.android.systemui.statusbar.tablet.NotificationTitleArea>
+
+ <FrameLayout
+ android:id="@+id/content_frame"
+ android:layout_height="wrap_content"
+ android:layout_width="408dp"
+ >
+ <ScrollView
+ android:id="@+id/notificationScroller"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ >
+ <LinearLayout
+ android:id="@+id/content"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal|bottom"
+ android:animateLayoutChanges="true"
+ android:animationCache="false"
+ android:orientation="vertical"
+ android:clickable="true"
+ android:focusable="true"
+ android:descendantFocusability="afterDescendants"
+ >
+ </LinearLayout>
+ </ScrollView>
+ </FrameLayout>
+</com.android.systemui.statusbar.tablet.NotificationPanel>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_notification_peek.xml b/packages/SystemUI/res/layout-xlarge/status_bar_notification_peek.xml
new file mode 100644
index 0000000..02f9a90
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_notification_peek.xml
@@ -0,0 +1,43 @@
+<?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.
+*/
+-->
+
+<!-- android:background="@drawable/status_bar_closed_default_background" -->
+<com.android.systemui.statusbar.tablet.NotificationPeekPanel
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:background="@*android:drawable/dialog_full_holo_dark"
+ android:orientation="vertical"
+ >
+
+ <FrameLayout
+ android:id="@+id/content"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal|bottom"
+ android:animationCache="false"
+ android:orientation="vertical"
+ android:background="@drawable/status_bar_background"
+ android:clickable="true"
+ android:focusable="true"
+ android:descendantFocusability="afterDescendants"
+ >
+ </FrameLayout>
+</com.android.systemui.statusbar.tablet.NotificationPeekPanel>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_notification_row.xml b/packages/SystemUI/res/layout-xlarge/status_bar_notification_row.xml
new file mode 100644
index 0000000..6b12d29
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_notification_row.xml
@@ -0,0 +1,48 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="65dp"
+ android:background="@drawable/status_bar_item_background"
+ >
+
+ <ImageButton
+ android:id="@+id/veto"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_centerVertical="true"
+ android:layout_alignParentRight="true"
+ android:src="@drawable/status_bar_veto"
+ android:scaleType="center"
+ android:background="#ff000000"
+ android:paddingRight="8dp"
+ />
+
+ <ImageView
+ android:id="@+id/large_icon"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentLeft="true"
+ android:scaleType="center"
+ />
+ <!-- TODO: scaleType should be top-left but ImageView doesn't support that. -->
+
+ <com.android.systemui.statusbar.LatestItemView android:id="@+id/content"
+ android:layout_width="wrap_content"
+ android:layout_height="64sp"
+ android:layout_alignParentTop="true"
+ android:layout_toRightOf="@id/large_icon"
+ android:layout_toLeftOf="@id/veto"
+ android:layout_marginLeft="16dp"
+ android:focusable="true"
+ android:clickable="true"
+ />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginLeft="16dp"
+ android:layout_alignParentBottom="true"
+ android:background="@android:drawable/divider_horizontal_dark"
+ />
+
+</RelativeLayout>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_pocket_panel.xml b/packages/SystemUI/res/layout-xlarge/status_bar_pocket_panel.xml
new file mode 100644
index 0000000..e4a6da4
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_pocket_panel.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* apps/common/assets/default/default/skins/StatusBar.xml
+**
+** Copyright 2010, 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.
+*/
+-->
+
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:background="@*android:drawable/dialog_full_holo_dark"
+ >
+ <TextView
+ android:id="@+id/description"
+ android:textAppearance="@android:style/TextAppearance.Small"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:textStyle="bold"
+ android:maxLines="1"
+ android:layout_alignParentBottom="true"
+ />
+
+ <FrameLayout
+ android:id="@+id/preview"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_above="@+id/description"
+ android:descendantFocusability="blocksDescendants"
+ >
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerInside"
+ android:visibility="gone"
+ />
+ <TextView
+ android:id="@+id/alt"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:textAppearance="@android:style/TextAppearance.Large"
+ android:gravity="center"
+ android:visibility="gone"
+ />
+ </FrameLayout>
+</RelativeLayout>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_recent_item.xml b/packages/SystemUI/res/layout-xlarge/status_bar_recent_item.xml
new file mode 100644
index 0000000..e7a3a61
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_recent_item.xml
@@ -0,0 +1,59 @@
+<?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.
+*/
+-->
+
+<!-- android:background="@drawable/status_bar_closed_default_background" -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:orientation="horizontal"
+ android:layout_margin="10dip">
+
+ <ImageView android:id="@+id/app_thumbnail"
+ android:layout_width="88dip"
+ android:layout_height="56dip"
+ android:layout_margin="10dip"
+ android:background="#80808080">
+ </ImageView>
+
+ <LinearLayout
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:orientation="horizontal"
+ android:layout_marginTop="10dip"
+ android:layout_marginBottom="10dip"
+ android:layout_marginRight="10dip">
+
+ <ImageView android:id="@+id/app_icon"
+ android:layout_width="23dip"
+ android:layout_height="23dip"
+ android:gravity="bottom"
+ android:layout_margin="5dip"
+ />
+
+ <TextView android:id="@+id/app_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="22dip"
+ />
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml
new file mode 100644
index 0000000..ac038a7
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* apps/common/assets/default/default/skins/StatusBar.xml
+**
+** Copyright 2010, 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.
+*/
+-->
+
+<com.android.systemui.statusbar.tablet.RecentAppsPanel
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:background="@drawable/sysbar_panel_recents_bg"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/recent_tasks_app_label"
+ android:textSize="22dip"
+ android:drawableLeft="@drawable/app_icon"
+ android:layout_margin="10dip"
+ />
+
+ <TextView android:id="@+id/recents_no_recents"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:text="@string/recent_tasks_empty"
+ android:textSize="22dip"
+ android:gravity="center_horizontal|center_vertical"
+ android:visibility="gone"
+ android:layout_margin="10dip">
+ </TextView>
+
+ <LinearLayout android:id="@+id/recents_container"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ />
+
+</com.android.systemui.statusbar.tablet.RecentAppsPanel>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_settings_view.xml b/packages/SystemUI/res/layout-xlarge/status_bar_settings_view.xml
new file mode 100644
index 0000000..6dd97c3
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_settings_view.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2010 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.
+-->
+
+<com.android.systemui.statusbar.tablet.SettingsView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:background="@drawable/status_bar_item_background"
+ android:paddingLeft="16dp"
+ >
+
+ <!-- Airplane mode -->
+ <LinearLayout
+ android:id="@+id/airplane"
+ style="@style/StatusBarPanelSettingsRow"
+ >
+ <ImageView
+ android:id="@+id/airplane_icon"
+ style="@style/StatusBarPanelSettingsIcon"
+ android:src="@drawable/ic_sysbar_airplane_on"
+ />
+ <TextView
+ android:id="@+id/airplane_label"
+ style="@style/StatusBarPanelSettingsContents"
+ android:text="@string/status_bar_settings_airplane"
+ />
+ <CheckBox
+ android:id="@+id/airplane_checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ />
+ </LinearLayout>
+ <View style="@style/StatusBarPanelSettingsPanelSeparator" />
+
+ <!-- Network -->
+ <LinearLayout
+ android:id="@+id/network"
+ style="@style/StatusBarPanelSettingsRow"
+ >
+ <ImageView
+ android:id="@+id/network_icon"
+ style="@style/StatusBarPanelSettingsIcon"
+ android:src="@drawable/ic_sysbar_wifi_on"
+ />
+ <TextView
+ android:id="@+id/network_label"
+ style="@style/StatusBarPanelSettingsContents"
+ />
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:layout_marginTop="16dp"
+ android:layout_marginRight="8dp"
+ android:src="@drawable/ic_notification_open"
+ />
+ </LinearLayout>
+ <View style="@style/StatusBarPanelSettingsPanelSeparator" />
+
+ <!-- Rotation lock -->
+ <LinearLayout
+ android:id="@+id/rotate"
+ style="@style/StatusBarPanelSettingsRow"
+ >
+ <ImageView
+ android:id="@+id/rotate_icon"
+ style="@style/StatusBarPanelSettingsIcon"
+ android:src="@drawable/ic_sysbar_rotate_on"
+ />
+ <TextView
+ android:id="@+id/rotate_label"
+ style="@style/StatusBarPanelSettingsContents"
+ android:text="@string/status_bar_settings_rotation_lock"
+ />
+ <CheckBox
+ android:id="@+id/rotate_checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ />
+ </LinearLayout>
+ <View style="@style/StatusBarPanelSettingsPanelSeparator" />
+
+ <!-- Brightness -->
+ <LinearLayout style="@style/StatusBarPanelSettingsRow" >
+ <ImageView
+ android:id="@+id/brightness_icon"
+ style="@style/StatusBarPanelSettingsIcon"
+ android:src="@drawable/ic_sysbar_brightness"
+ />
+ </LinearLayout>
+ <View style="@style/StatusBarPanelSettingsPanelSeparator" />
+
+ <!-- Volume -->
+ <LinearLayout style="@style/StatusBarPanelSettingsRow" >
+ <ImageView
+ android:id="@+id/volume_icon"
+ style="@style/StatusBarPanelSettingsIcon"
+ android:src="@drawable/ic_sysbar_sound_on"
+ />
+ </LinearLayout>
+ <View style="@style/StatusBarPanelSettingsPanelSeparator" />
+
+ <!-- Notifications / Do not disturb -->
+ <LinearLayout
+ android:id="@+id/do_not_disturb"
+ style="@style/StatusBarPanelSettingsRow"
+ >
+ <ImageView
+ android:id="@+id/do_not_disturb_icon"
+ style="@style/StatusBarPanelSettingsIcon"
+ android:src="@drawable/ic_sysbar_gps_on"
+ />
+ <TextView
+ style="@style/StatusBarPanelSettingsContents"
+ android:text="@string/status_bar_settings_notifications"
+ />
+ <CheckBox
+ android:id="@+id/do_not_disturb_checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ />
+ </LinearLayout>
+ <View style="@style/StatusBarPanelSettingsPanelSeparator" />
+
+ <!-- Link to settings -->
+ <LinearLayout
+ android:id="@+id/settings"
+ style="@style/StatusBarPanelSettingsRow"
+ >
+
+ <ImageView
+ android:id="@+id/settings"
+ style="@style/StatusBarPanelSettingsIcon"
+ android:src="@drawable/ic_sysbar_quicksettings"
+ />
+ <TextView
+ style="@style/StatusBarPanelSettingsContents"
+ android:text="@string/status_bar_settings_settings_button"
+ />
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:layout_marginTop="16dp"
+ android:layout_marginRight="8dp"
+ android:src="@drawable/ic_notification_open"
+ />
+ </LinearLayout>
+ <View style="@style/StatusBarPanelSettingsPanelSeparator" />
+
+</com.android.systemui.statusbar.tablet.SettingsView>
+
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_ticker_compat.xml b/packages/SystemUI/res/layout-xlarge/status_bar_ticker_compat.xml
new file mode 100644
index 0000000..5d9a680
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_ticker_compat.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2010 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:layout_width="match_parent"
+ android:layout_height="@*android:dimen/status_bar_height"
+ android:orientation="horizontal"
+ android:background="@drawable/status_bar_ticker_background"
+ >
+
+ <ImageView
+ android:id="@+id/large_icon"
+ android:layout_width="@dimen/notification_large_icon_width"
+ android:layout_height="@dimen/notification_large_icon_height"
+ android:scaleType="center"
+ android:visibility="gone"
+ />
+
+ <ImageView android:id="@+id/left_icon"
+ android:layout_width="64dp"
+ android:layout_height="match_parent"
+ android:scaleType="center"
+ android:visibility="gone"
+ />
+
+ <TextView android:id="@+id/text"
+ android:textAppearance="@*android:style/TextAppearance.StatusBar.Ticker"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="12dp"
+ android:gravity="center_vertical"
+ android:maxLines="2"
+ />
+
+ <ImageView android:id="@+id/right_icon"
+ android:layout_width="64dp"
+ android:layout_height="match_parent"
+ android:scaleType="center"
+ android:visibility="gone"
+ />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_ticker_panel.xml b/packages/SystemUI/res/layout-xlarge/status_bar_ticker_panel.xml
new file mode 100644
index 0000000..cae6a77
--- /dev/null
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_ticker_panel.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2010 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:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:background="@drawable/status_bar_ticker_background"
+ android:gravity="bottom"
+ >
+ <!--
+ android:background="@drawable/ticker_background"
+ -->
+
+ <ImageView
+ android:id="@+id/large_icon"
+ android:layout_width="@dimen/notification_large_icon_height"
+ android:layout_height="@dimen/notification_large_icon_width"
+ android:scaleType="center"
+ android:visibility="gone"
+ />
+ <!-- TODO: scaleType should be top-left but ImageView doesn't support that. -->
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/intruder_alert.xml b/packages/SystemUI/res/layout/intruder_alert.xml
new file mode 100644
index 0000000..ba4a774
--- /dev/null
+++ b/packages/SystemUI/res/layout/intruder_alert.xml
@@ -0,0 +1,58 @@
+<?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.
+*/
+-->
+
+<!-- android:background="@drawable/status_bar_closed_default_background" -->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="32dip"
+ android:layout_width="match_parent"
+ android:paddingLeft="8dip"
+ android:paddingRight="8dip"
+ >
+
+ <LinearLayout
+ android:id="@+id/intruder_alert_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:animationCache="false"
+ android:orientation="horizontal"
+ android:background="@drawable/alert_bar_background"
+ android:clickable="true"
+ android:focusable="true"
+ android:descendantFocusability="afterDescendants"
+ >
+
+ <ImageView
+ android:id="@+id/alertIcon"
+ android:layout_width="25dip"
+ android:layout_height="25dip"
+ android:layout_marginLeft="6dip"
+ android:layout_marginRight="8dip"
+ />
+ <TextView
+ android:id="@+id/alertText"
+ android:textAppearance="@style/TextAppearance.StatusBar.IntruderAlert"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ />
+ </LinearLayout>
+</FrameLayout>
diff --git a/packages/SystemUI/res/layout/recent_apps_activity.xml b/packages/SystemUI/res/layout/recent_apps_activity.xml
new file mode 100644
index 0000000..ec661e8
--- /dev/null
+++ b/packages/SystemUI/res/layout/recent_apps_activity.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <!-- Title -->
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="#80FFFFFF"
+ android:textStyle="bold"
+ android:singleLine="true"
+ android:text="@string/recent_tasks_title"
+ android:visibility="gone"/>
+
+ <!-- This is only intended to be visible when carousel is invisible -->
+ <TextView
+ android:id="@+id/no_applications_message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:text="@string/recent_tasks_empty"
+ android:visibility="gone"/>
+
+ <com.android.systemui.recent.RecentApplicationsCarouselView
+ android:id="@+id/carousel"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1">
+ </com.android.systemui.recent.RecentApplicationsCarouselView>
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/recents_detail_view.xml b/packages/SystemUI/res/layout/recents_detail_view.xml
new file mode 100644
index 0000000..879d0f2
--- /dev/null
+++ b/packages/SystemUI/res/layout/recents_detail_view.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <!-- Application Title -->
+ <TextView android:id="@+id/app_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true"/>
+
+ <!-- Application Details -->
+ <TextView
+ android:id="@+id/app_description"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"/>
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index a5d6885..c8f5772 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -19,9 +19,10 @@
-->
<!-- android:background="@drawable/status_bar_closed_default_background" -->
-<com.android.systemui.statusbar.StatusBarView
+<com.android.systemui.statusbar.phone.PhoneStatusBarView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:background="@drawable/statusbar_background"
+ xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
+ android:background="@drawable/status_bar_background"
android:orientation="vertical"
android:focusable="true"
android:descendantFocusability="afterDescendants"
@@ -32,7 +33,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
- <com.android.systemui.statusbar.IconMerger android:id="@+id/notificationIcons"
+ <com.android.systemui.statusbar.phone.IconMerger android:id="@+id/notificationIcons"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="match_parent"
@@ -49,12 +50,14 @@
android:gravity="center_vertical"
android:orientation="horizontal"/>
- <com.android.systemui.statusbar.Clock
+ <com.android.systemui.statusbar.policy.Clock
android:textAppearance="@*android:style/TextAppearance.StatusBar.Icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:singleLine="true"
android:paddingRight="6dip"
+ android:textSize="16sp"
+ android:textStyle="bold"
android:gravity="center_vertical|left"
/>
</LinearLayout>
@@ -79,7 +82,7 @@
android:layout_height="25dip"
/>
</ImageSwitcher>
- <com.android.systemui.statusbar.TickerView android:id="@+id/tickerText"
+ <com.android.systemui.statusbar.phone.TickerView android:id="@+id/tickerText"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
@@ -97,10 +100,10 @@
android:layout_height="wrap_content"
android:singleLine="true"
/>
- </com.android.systemui.statusbar.TickerView>
+ </com.android.systemui.statusbar.phone.TickerView>
</LinearLayout>
- <com.android.systemui.statusbar.DateView android:id="@+id/date"
+ <com.android.systemui.statusbar.policy.DateView android:id="@+id/date"
android:textAppearance="@*android:style/TextAppearance.StatusBar.Icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@@ -108,6 +111,6 @@
android:gravity="center_vertical|left"
android:paddingLeft="6px"
android:paddingRight="6px"
- android:background="@drawable/statusbar_background"
+ android:background="@drawable/status_bar_background"
/>
-</com.android.systemui.statusbar.StatusBarView>
+</com.android.systemui.statusbar.phone.PhoneStatusBarView>
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index c744e4b..18e8273 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -18,7 +18,7 @@
*/
-->
-<com.android.systemui.statusbar.ExpandedView xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.systemui.statusbar.phone.ExpandedView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:focusable="true"
android:descendantFocusability="afterDescendants"
@@ -31,9 +31,9 @@
android:paddingTop="3dp"
android:paddingBottom="5dp"
android:paddingRight="3dp"
- android:background="@drawable/title_bar_portrait"
+ android:background="@drawable/shade_header_background"
>
- <com.android.systemui.statusbar.CarrierLabel
+ <com.android.systemui.statusbar.phone.CarrierLabel
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@@ -43,7 +43,7 @@
android:paddingBottom="1dp"
android:paddingLeft="4dp"
android:textAppearance="?android:attr/textAppearanceLarge"
- android:textColor="#ffdfdfdf"
+ android:textColor="?android:attr/textColorSecondary"
/>
<TextView android:id="@+id/clear_all_button"
android:layout_width="wrap_content"
@@ -57,7 +57,7 @@
style="?android:attr/buttonStyle"
android:paddingLeft="15dp"
android:paddingRight="15dp"
- android:background="@android:drawable/btn_default_small"
+ android:background="@drawable/btn_default_small"
/>
</LinearLayout>
@@ -73,7 +73,7 @@
android:fadingEdge="none"
android:overScrollMode="ifContentScrolls"
>
- <com.android.systemui.statusbar.NotificationLinearLayout
+ <LinearLayout
android:id="@+id/notificationLinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -83,7 +83,7 @@
<TextView android:id="@+id/noNotificationsTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/shade_bgcolor"
+ android:background="@drawable/title_bar_portrait"
android:paddingLeft="5dp"
android:textAppearance="@style/TextAppearance.StatusBar.Title"
android:text="@string/status_bar_no_notifications_title"
@@ -92,7 +92,7 @@
<TextView android:id="@+id/ongoingTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/shade_bgcolor"
+ android:background="@drawable/title_bar_portrait"
android:paddingLeft="5dp"
android:textAppearance="@style/TextAppearance.StatusBar.Title"
android:text="@string/status_bar_ongoing_events_title"
@@ -106,7 +106,7 @@
<TextView android:id="@+id/latestTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/shade_bgcolor"
+ android:background="@drawable/title_bar_portrait"
android:paddingLeft="5dp"
android:textAppearance="@style/TextAppearance.StatusBar.Title"
android:text="@string/status_bar_latest_events_title"
@@ -116,7 +116,7 @@
android:layout_height="wrap_content"
android:orientation="vertical"
/>
- </com.android.systemui.statusbar.NotificationLinearLayout>
+ </LinearLayout>
</ScrollView>
<ImageView
@@ -127,4 +127,4 @@
/>
</FrameLayout>
-</com.android.systemui.statusbar.ExpandedView>
+</com.android.systemui.statusbar.phone.ExpandedView>
diff --git a/packages/SystemUI/res/layout/status_bar_latest_event.xml b/packages/SystemUI/res/layout/status_bar_notification_row.xml
index b8a1cbe..88d9739 100644
--- a/packages/SystemUI/res/layout/status_bar_latest_event.xml
+++ b/packages/SystemUI/res/layout/status_bar_notification_row.xml
@@ -16,8 +16,8 @@
<View
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/divider_horizontal_light_opaque"
+ android:layout_height="1sp"
+ android:background="@android:drawable/divider_horizontal_bright"
/>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/status_bar_tracking.xml b/packages/SystemUI/res/layout/status_bar_tracking.xml
index 3b9b775..a0ddab5 100644
--- a/packages/SystemUI/res/layout/status_bar_tracking.xml
+++ b/packages/SystemUI/res/layout/status_bar_tracking.xml
@@ -15,7 +15,7 @@
limitations under the License.
-->
-<com.android.systemui.statusbar.TrackingView
+<com.android.systemui.statusbar.phone.TrackingView
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:visibility="gone"
@@ -26,14 +26,13 @@
android:paddingRight="0px"
>
- <View
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:background="#ff212121"
- />
+ <com.android.systemui.statusbar.phone.TrackingPatternView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ />
- <com.android.systemui.statusbar.CloseDragHandle android:id="@+id/close"
+ <com.android.systemui.statusbar.phone.CloseDragHandle android:id="@+id/close"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
@@ -43,9 +42,9 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:scaleType="fitXY"
- android:src="@drawable/status_bar_close_on"
+ android:src="@drawable/shade_handlebar"
/>
- </com.android.systemui.statusbar.CloseDragHandle>
+ </com.android.systemui.statusbar.phone.CloseDragHandle>
-</com.android.systemui.statusbar.TrackingView>
+</com.android.systemui.statusbar.phone.TrackingView>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
new file mode 100644
index 0000000..8a18d55
--- /dev/null
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"محو"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي تنبيهات"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"التنبيهات"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"الرجاء توصيل الشاحن"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"البطارية منخفضة:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"استخدام البطارية"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"حديثة"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
new file mode 100644
index 0000000..9270997
--- /dev/null
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Изчистване"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Няма известия"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"В момента"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Известия"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Моля, включете зарядно устройство"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Батерията се изтощава:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Използване на батерията"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Скорошни"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
new file mode 100644
index 0000000..70f3ee1
--- /dev/null
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Esborra"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Cap notificació"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continu"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacions"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Connecteu el carregador"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Comença a quedar poca bateria:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Ús de la bateria"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Recents"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index ff59db0..cfdf0dd 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazat"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žádná oznámení"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Probíhající"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Oznámení"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Prosím připojte dobíjecí zařízení"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Baterie je vybitá:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"Zbývá <xliff:g id="NUMBER">%d%%</xliff:g> nebo méně."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterie je vybitá:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Využití baterie"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Nejnovější"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 9389617..e4fc728 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ryd"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen meddelelser"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"I gang"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meddelelser"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Forbind oplader"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Batteriet er ved at være fladt:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> eller mindre tilbage."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batteriet er ved at være fladt:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Batteriforbrug"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Seneste"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 3ea65d9..edb1bef 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Löschen"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Keine Benachrichtigungen"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktuell"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Benachrichtigungen"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Ladegerät anschließen"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Akku ist fast leer."</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> oder weniger verbleiben."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akku ist fast leer."</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Akkuverbrauch"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Zuletzt verwendet"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index cba1047..21ea803 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Εκκαθάριση"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Δεν υπάρχουν ειδοποιήσεις"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Εν εξελίξει"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ειδοποιήσεις"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Συνδέστε τον φορτιστή"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Η στάθμη της μπαταρίας είναι χαμηλή:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"Απομένει <xliff:g id="NUMBER">%d%%</xliff:g> ή λιγότερο."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Η στάθμη της μπαταρίας είναι χαμηλή:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Χρήση μπαταρίας"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Πρόσφατα"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..c9d4b76
--- /dev/null
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Clear"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No notifications"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Please connect charger"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"The battery is getting low:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Battery use"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 56dead5..b6d3618 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No hay notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continuo"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Conecta el cargador"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Hay poca batería:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"Restan <xliff:g id="NUMBER">%d%%</xliff:g> o menos."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Hay poca batería:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Uso de la batería"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 4ebe492..77773af 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No tienes notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Entrante"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Conecta el cargador"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Se está agotando la batería:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> o menos disponible"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Se está agotando la batería:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Uso de la batería"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
new file mode 100644
index 0000000..015b87c
--- /dev/null
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"پاک کردن"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"اعلانی موجود نیست"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"در حال انجام"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"اعلان ها"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"لطفاً شارژر را وصل کنید"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"باتری در حال کم شدن است:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"استفاده از باتری"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"اخیر"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
new file mode 100644
index 0000000..d677afc
--- /dev/null
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Tyhjennä"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ei ilmoituksia"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Käynnissä olevat"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ilmoitukset"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Kytke laturi"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akun virta on vähissä:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Akun käyttö"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Viimeisimmät"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 7aff506..8877329 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Effacer"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Branchez le chargeur"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Le niveau de la batterie est bas :"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"Maximum <xliff:g id="NUMBER">%d%%</xliff:g> restants."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Le niveau de la batterie est bas :"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Utilisation de la batterie"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Récentes"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-he/strings.xml b/packages/SystemUI/res/values-he/strings.xml
new file mode 100644
index 0000000..ad1f755
--- /dev/null
+++ b/packages/SystemUI/res/values-he/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"נקה"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"אין התראות"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"מתבצע"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"התראות"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"חבר מטען"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"הסוללה נחלשת:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"צריכת סוללה"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"אחרונות"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
new file mode 100644
index 0000000..d601eb0
--- /dev/null
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Očisti"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bez obavijesti"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"U tijeku"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obavijesti"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Priključite punjač"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterija će uskoro biti potrošena:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Iskorištenost baterije"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavni"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
new file mode 100644
index 0000000..4188b6f
--- /dev/null
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Törlés"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nincs értesítés"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Folyamatban van"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Értesítések"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Kérjük, csatlakoztassa a töltőt"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akkufeszültség alacsony:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Akkumulátorhasználat"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Legutóbbiak"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-id/strings.xml b/packages/SystemUI/res/values-id/strings.xml
new file mode 100644
index 0000000..974498a
--- /dev/null
+++ b/packages/SystemUI/res/values-id/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Bersihkan"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tidak ada pemberitahuan"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Berkelanjutan"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Harap hubungkan ke pengisi daya"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterai kekurangan daya:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Penggunaan baterai"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Terbaru"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 496a82e..0507cf9 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Cancella"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nessuna notifica"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"In corso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifiche"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Collegare il caricabatterie"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Batteria quasi scarica:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> rimanente o meno."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batteria quasi scarica:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Utilizzo batteria"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Recenti"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 24c018b..782d03b 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"通知を消去"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"通知なし"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"実行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
<string name="battery_low_title" msgid="7923774589611311406">"充電してください"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"電池が残り少なくなっています:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"残り<xliff:g id="NUMBER">%d%%</xliff:g>未満です。"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"電池が残り少なくなっています:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"電池使用量"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"新着"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 0b6649d..5e9b9d5 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"지우기"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"알림 없음"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"진행 중"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"알림"</string>
<string name="battery_low_title" msgid="7923774589611311406">"충전기를 연결하세요."</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"배터리 전원이 부족합니다."</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"잔여 배터리가 <xliff:g id="NUMBER">%d%%</xliff:g> 이하입니다."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"배터리 전원이 부족합니다."</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"배터리 사용량"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"최근 사용한 앱"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-land/strings.xml b/packages/SystemUI/res/values-land/strings.xml
new file mode 100644
index 0000000..e05e36b
--- /dev/null
+++ b/packages/SystemUI/res/values-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2010, 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Rotation lock toast text: shown when rotation lock is turned on in landscape orientation.
+ -->
+ <string name="toast_rotation_locked">Screen is now locked in landscape orientation.</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
new file mode 100644
index 0000000..3d6d099
--- /dev/null
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Išvalyti"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nėra įspėjimų"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Vykstantys"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Įspėjimai"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Prijunkite kroviklį"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akumuliatorius senka:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Akumuliatoriaus naudojimas"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Naujos"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
new file mode 100644
index 0000000..74a7890
--- /dev/null
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Notīrīt"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nav paziņojumu"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Notiekošs"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Paziņojumi"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Lūdzu, pievienojiet uzlādes ierīci."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Akumulatora uzlādes līmenis kļūst zems:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Akumulatora lietojums"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Nesens"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 5684e57..147242f 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Fjern"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen varslinger"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktiviteter"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Varslinger"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Koble til en lader"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Batteriet er nesten tomt:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"mindre enn <xliff:g id="NUMBER">%d%%</xliff:g> igjen."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batteriet er nesten tomt:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Batteribruk"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Nylig"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index cd10b29..6067cca 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wissen"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Geen meldingen"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Actief"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meldingen"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Sluit de oplader aan"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"De accu raakt op:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> of minder resterend."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"De accu raakt op:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Accugebruik"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 70f3ad2..6b19a34 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wyczyść"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Brak powiadomień"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Bieżące"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Powiadomienia"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Podłącz ładowarkę"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Bateria się rozładowuje:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"Pozostało: <xliff:g id="NUMBER">%d%%</xliff:g> lub mniej."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Bateria się rozładowuje:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Użycie baterii"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Najnowsze"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-port/strings.xml b/packages/SystemUI/res/values-port/strings.xml
new file mode 100644
index 0000000..d3ab67b
--- /dev/null
+++ b/packages/SystemUI/res/values-port/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2010, 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Rotation lock toast text: shown when rotation lock is turned on in portrait orientation.
+ -->
+ <string name="toast_rotation_locked">Screen is now locked in portrait orientation.</string>
+</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 492063a..7bf6eb4 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em curso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Ligue o carregador"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"A bateria está a ficar fraca:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"Restam <xliff:g id="NUMBER">%d%%</xliff:g> ou menos."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"A bateria está a ficar fraca:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Utilização da bateria"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 08effa7..14b4b1f 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em andamento"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Conecte o carregador"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"A bateria está ficando baixa:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> ou menos restante(s)."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"A bateria está ficando baixa:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Uso da bateria"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml
new file mode 100644
index 0000000..95520db
--- /dev/null
+++ b/packages/SystemUI/res/values-rm/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Stizzar"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nagins avis"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Actual"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Avis"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Connectar il chargiabattarias"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"L\'accu è prest vid."</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Consum dad accu"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Utilisà sco ultim"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
new file mode 100644
index 0000000..b6cfe73
--- /dev/null
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ştergeţi"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nicio notificare"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"În desfăşurare"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificări"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Conectaţi încărcătorul"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Bateria se termină:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Utilizarea bateriei"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 7c5bcf7..0a15bcd 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очистить"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нет уведомлений"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текущие"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Уведомления"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Подключите зарядное устройство"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Батарея разряжена:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"Осталось <xliff:g id="NUMBER">%d%%</xliff:g> или меньше."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Батарея разряжена:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Расход заряда батареи"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Недавние"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
new file mode 100644
index 0000000..a55d3b7
--- /dev/null
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazať"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žiadne upozornenia"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Prebiehajúce"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Upozornenia"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Pripojte nabíjačku"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batéria je skoro vybitá:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Využitie batérie"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Najnovšie"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
new file mode 100644
index 0000000..a9e5c30
--- /dev/null
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Počisti"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ni obvestil"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Trenutno"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obvestila"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Priključite napajalnik"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterija je skoraj prazna:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Uporaba baterije"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavno"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
new file mode 100644
index 0000000..f7dca2a
--- /dev/null
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Обриши"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нема обавештења"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текуће"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Обавештења"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Прикључите пуњач"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Ниво напуњености батерије је низак:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Коришћење батерије"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Недавно"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 1127c9d..06188ab 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ta bort"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Inga aviseringar"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Pågående"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meddelanden"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Anslut laddaren"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Batteriet håller på att ta slut:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> eller mindre kvar."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Batteriet håller på att ta slut:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Batteriförbrukning"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Senaste"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
new file mode 100644
index 0000000..59b869d
--- /dev/null
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ล้างข้อมูล"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ไม่มีการแจ้งเตือน"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ดำเนินอยู่"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"การแจ้งเตือน"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"โปรดเสียบอุปกรณ์ชาร์จ"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"แบตเตอรี่เหลือน้อย"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"การใช้แบตเตอรี่"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"เมื่อเร็วๆ นี้"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
new file mode 100644
index 0000000..2a075a7
--- /dev/null
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"I-clear"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Walang mga notification"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Nagpapatuloy"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Mga Notification"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Pakikonekta ang charger"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Humihina ang baterya:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Paggamit ng baterya"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Kamakailan"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index dd66d82..253fbe0 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Temizle"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bildirim yok"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sürüyor"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirimler"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Lütfen şarj cihazını takın"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Pil tükeniyor:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> veya daha az kaldı."</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Pil tükeniyor:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"Pil kullanımı"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"En Son Görevler"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
new file mode 100644
index 0000000..63088d9
--- /dev/null
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очист."</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Немає сповіщень"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Поточні"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Сповіщення"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Підключ. заряд. пристрій"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Батарея виснажується:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Викор. батареї"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Останні"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
new file mode 100644
index 0000000..8f4927f
--- /dev/null
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -0,0 +1,56 @@
+<?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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_label (7164937344850004466) -->
+ <skip />
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Xoá"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Không có thông báo nào"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Đang diễn ra"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Thông báo"</string>
+ <string name="battery_low_title" msgid="7923774589611311406">"Vui lòng kết nối bộ sạc"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"Pin đang yếu:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
+ <string name="battery_low_why" msgid="7279169609518386372">"Sử dụng pin"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Gần đây"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-xlarge/colors.xml b/packages/SystemUI/res/values-xlarge/colors.xml
new file mode 100644
index 0000000..14161c3
--- /dev/null
+++ b/packages/SystemUI/res/values-xlarge/colors.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <drawable name="status_bar_background">#000000</drawable>
+</resources>
+
diff --git a/packages/SystemUI/res/values-xlarge/config.xml b/packages/SystemUI/res/values-xlarge/config.xml
new file mode 100644
index 0000000..e140914
--- /dev/null
+++ b/packages/SystemUI/res/values-xlarge/config.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2010, 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.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+<resources>
+ <integer name="config_status_bar_position">1</integer>
+
+ <!-- Component to be used as the status bar service. Must implement the IStatusBar
+ interface. This name is in the ComponentName flattened format (package/class) -->
+ <string name="config_statusBarComponent">com.android.systemui.statusbar.tablet.TabletStatusBar</string>
+
+ <!-- Whether or not we show the number in the bar. -->
+ <bool name="config_statusBarShowNumber">false</bool>
+
+</resources>
+
diff --git a/packages/SystemUI/res/values-xlarge/dimens.xml b/packages/SystemUI/res/values-xlarge/dimens.xml
new file mode 100644
index 0000000..5ae3982
--- /dev/null
+++ b/packages/SystemUI/res/values-xlarge/dimens.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 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.
+*/
+-->
+<resources>
+ <!-- The width of the big icons in notifications. -->
+ <dimen name="notification_large_icon_width">60dp</dimen>
+ <!-- The width of the big icons in notifications. -->
+ <dimen name="notification_large_icon_height">60dp</dimen>
+ <!-- The width of the ticker, including the icon -->
+ <dimen name="notification_ticker_width">360dp</dimen>
+ <!-- Status bar panel bottom offset (height of status bar - overlap) -->
+ <dimen name="status_bar_panel_bottom_offset">36dp</dimen>
+</resources>
+
+
diff --git a/packages/SystemUI/res/values-xlarge/strings.xml b/packages/SystemUI/res/values-xlarge/strings.xml
new file mode 100644
index 0000000..e3e5148
--- /dev/null
+++ b/packages/SystemUI/res/values-xlarge/strings.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2010, 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- The text for the button in the notification window-shade that clears
+ all of the currently visible notifications. -->
+ <string name="status_bar_clear_all_button">Clear all</string>
+
+ <!-- System panel ("Quick Settings") -->
+
+ <!-- Text to display underneath the graphical signal strength meter when
+ no connection is available. [CHAR LIMIT=20] -->
+ <string name="status_bar_settings_signal_meter_disconnected">
+ no internet connection
+ </string>
+
+ <!-- Text to display underneath the graphical signal strength meter when
+ it is displaying information about a connected, named Wi-Fi network.
+ [CHAR LIMIT=20] -->
+ <string name="status_bar_settings_signal_meter_wifi_ssid_format">
+ <xliff:g id="ssid">%s</xliff:g>
+ </string>
+
+ <!-- Text to display underneath the graphical signal strength meter when
+ it is displaying Wi-Fi status and Wi-Fi is connected to a network
+ whose SSID is not available.
+ [CHAR LIMIT=20] -->
+ <string name="status_bar_settings_signal_meter_wifi_nossid">
+ Wi-Fi: connected
+ </string>
+
+ <!-- Text to display underneath the graphical signal strength meter when
+ it is displaying Wi-Fi status and Wi-Fi is in the process of
+ connecting to a network. [CHAR LIMIT=20] -->
+ <string name="status_bar_settings_signal_meter_wifi_connecting">
+ Wi-Fi: connecting…
+ </string>
+
+ <!-- Text to display underneath the graphical signal strength meter when
+ it is displaying mobile data (3G) status and a network connection is
+ available.
+ [CHAR LIMIT=20] -->
+ <string name="status_bar_settings_signal_meter_data_connected">
+ Mobile data: connected
+ </string>
+
+ <!-- Text to display underneath the graphical signal strength meter when
+ it is displaying mobile data (3G) status and a network connection is
+ unavailable.
+ [CHAR LIMIT=20] -->
+ <string name="status_bar_settings_signal_meter_data_connecting">
+ Mobile data: connecting…
+ </string>
+</resources>
diff --git a/packages/SystemUI/res/values-xlarge/styles.xml b/packages/SystemUI/res/values-xlarge/styles.xml
new file mode 100644
index 0000000..fb10a24
--- /dev/null
+++ b/packages/SystemUI/res/values-xlarge/styles.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <style name="StatusBarNotificationText">
+ <item name="android:textSize">16sp</item>
+ <item name="android:textColor">#ff999999</item>
+ </style>
+
+ <style name="StatusBarPanelSettingsRow">
+ <item name="android:layout_height">64dp</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:orientation">horizontal</item>
+ </style>
+
+ <style name="StatusBarPanelSettingsIcon">
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:layout_width">64dp</item>
+ <item name="android:scaleType">center</item>
+ </style>
+
+ <style name="StatusBarPanelSettingsContents">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:layout_gravity">left|center_vertical</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ </style>
+
+ <style name="StatusBarPanelSettingsPanelSeparator">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">1dp</item>
+ <item name="android:background">@android:drawable/divider_horizontal_dark</item>
+ </style>
+
+</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index cda0317..161a085 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"无通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"正在进行的"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
<string name="battery_low_title" msgid="7923774589611311406">"请连接充电器"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"电量所剩不多:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"电量剩余 <xliff:g id="NUMBER">%d%%</xliff:g> 或更少。"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"电量所剩不多:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"电量使用情况"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"近期任务"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 503087b..eb9108d 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -19,14 +19,38 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
+ <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
+ <skip />
+ <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"沒有通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"進行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
<string name="battery_low_title" msgid="7923774589611311406">"請連接充電器"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"電池電量即將不足:"</string>
- <string name="battery_low_percent_format" msgid="696154104579022959">"還剩 <xliff:g id="NUMBER">%d%%</xliff:g> 以下。"</string>
+ <!-- outdated translation 7388781709819722764 --> <string name="battery_low_subtitle" msgid="1752040062087829196">"電池電量即將不足:"</string>
+ <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
+ <skip />
+ <!-- no translation found for invalid_charger (4549105996740522523) -->
+ <skip />
<string name="battery_low_why" msgid="7279169609518386372">"電池使用狀況"</string>
+ <!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_airplane (4879879698500955300) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_rotation_lock (8361452930058000609) -->
+ <skip />
+ <!-- no translation found for status_bar_settings_notifications (397146176280905137) -->
+ <skip />
+ <string name="recent_tasks_title" msgid="3691764623638127888">"最新的"</string>
+ <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
+ <skip />
+ <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
+ <skip />
+ <!-- no translation found for toast_rotation_free (2700542202836832631) -->
+ <skip />
+ <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
new file mode 100644
index 0000000..23bcf20
--- /dev/null
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<resources>
+ <declare-styleable name="KeyButtonView">
+ <attr name="keyCode" format="integer" />
+ </declare-styleable>
+</resources>
+
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 6550438..964e69b 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -17,7 +17,7 @@
*/
-->
<resources>
- <drawable name="shade_bgcolor">#ff282828</drawable>
- <drawable name="notification_header_text_color">#ff969696</drawable>
<drawable name="notification_number_text_color">#ffffffff</drawable>
+ <drawable name="notification_item_background_color">#ff000000</drawable>
+ <drawable name="ticker_background_color">#ff1d1d1d</drawable>
</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 8ea46e5..05ed089 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -20,7 +20,23 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. -->
<resources>
- <!-- Control whether status bar should distinguish HSPA data icon form UMTS data icon on devices -->
+
+ <!-- Control whether status bar should distinguish HSPA data icon form UMTS
+ data icon on devices -->
<bool name="config_hspa_data_distinguishable">false</bool>
+
+ <!-- The location of the status bar.
+ 0 - top
+ 1 - bottom
+ -->
+ <integer name="config_status_bar_position">0</integer>
+
+ <!-- Component to be used as the status bar service. Must implement the IStatusBar
+ interface. This name is in the ComponentName flattened format (package/class) -->
+ <string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.phone.PhoneStatusBar</string>
+
+ <!-- Whether or not we show the number in the bar. -->
+ <bool name="config_statusBarShowNumber">true</bool>
+
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index ba3a3d1..ed31a34 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -17,38 +17,90 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Name of the status bar as seen in the applications info settings page. -->
- <string name="app_label">Status Bar</string>
+ <!-- Name of the status bar as seen in the applications info settings page. [CHAR LIMIT=12] -->
+ <string name="app_label">System UI</string>
<!-- The text for the button in the notification window-shade that clears
- all of the currently visible notifications. -->
+ all of the currently visible notifications. [CHAR LIMIT=10]-->
<string name="status_bar_clear_all_button">Clear</string>
+ <!-- The text for the button in the notification window-shade that turns
+ on do not disturb mode, where notifications no longer show their ticker,
+ no sound plays, and no icons are visible. The windowshade continues to show
+ the notifications. [CHAR LIMIT=25]-->
+ <string name="status_bar_do_not_disturb_button">Do not disturb</string>
+
+ <!-- The text for the button in the notification window-shade that turns
+ off do not disturb mode. After clicking this, notifications will be
+ shown again. [CHAR LIMIT=25] -->
+ <string name="status_bar_please_disturb_button">Show notifications</string>
+
+
<!-- The label in the bar at the top of the status bar when there are no notifications
- showing. -->
+ showing. [CHAR LIMIT=40]-->
<string name="status_bar_no_notifications_title">No notifications</string>
<!-- The label for the group of notifications for ongoing events in the opened version of
the status bar. An ongoing call is the prime example of this. The MP3 music player
- might be another example. -->
+ might be another example. [CHAR LIMIT=40] -->
<string name="status_bar_ongoing_events_title">Ongoing</string>
<!-- The label for the group of notifications for recent events in the opened version of
- the status bar. Recently received text messsages (SMS), emails, calendar alerts, etc. -->
+ the status bar. Recently received text messsages (SMS), emails, calendar alerts, etc.
+ [CHAR LIMIT=40] -->
<string name="status_bar_latest_events_title">Notifications</string>
- <!-- When the battery is low, this is displayed to the user in a dialog. The title of the low battery alert. -->
+ <!-- When the battery is low, this is displayed to the user in a dialog. The title of the low battery alert. [CHAR LIMIT=NONE]-->
<string name="battery_low_title">Please connect charger</string>
- <!-- When the battery is low, this is displayed to the user in a dialog. The subtitle of the low battery alert. -->
- <string name="battery_low_subtitle">The battery is getting low:</string>
+ <!-- When the battery is low, this is displayed to the user in a dialog. The subtitle of the low battery alert. [CHAR LIMIT=NONE] -->
+ <string name="battery_low_subtitle">The battery is getting low.</string>
- <!-- A message that appears when the battery level is getting low in a dialog. This is appened to the subtitle of the low battery alert. -->
- <string name="battery_low_percent_format"><xliff:g id="number">%d%%</xliff:g>
- or less remaining.</string>
+ <!-- A message that appears when the battery level is getting low in a dialog. This is
+ appened to the subtitle of the low battery alert. "number" is the percentage of battery
+ remaining [CHAR LIMIT=none]-->
+ <string name="battery_low_percent_format"><xliff:g id="number">%d%%</xliff:g> remaining</string>
+
+ <!-- A message that appears when a USB charger is plugged in and the device does not
+ support charging on it. That is, a charger that fits into the USB port and goes into
+ a wall socket, not into a computer. (This happens because some devices require more
+ current than the USB spec allows. [CHAR LIMIT=NONE] -->
+ <string name="invalid_charger">USB charging not supported.\nUse only the supplied charger.</string>
<!-- When the battery is low, this is the label of the button to go to the
- power usage activity to find out what drained the battery. -->
+ power usage activity to find out what drained the battery. [CHAR LIMIT=30] -->
<string name="battery_low_why">Battery use</string>
+ <!-- Name of the button that links to the Settings app. [CHAR LIMIT=NONE] -->
+ <string name="status_bar_settings_settings_button">Settings</string>
+
+ <!-- Label in the system panel for airplane mode (all radios are turned off)[CHAR LIMIT=30] -->
+ <string name="status_bar_settings_airplane">Airplane mode</string>
+
+ <!-- Label in system panel saying the device will use the orientation sensor to rotate [CHAR LIMIT=30] -->
+ <string name="status_bar_settings_rotation_lock">Lock screen orientation</string>
+
+ <!-- Label in system panel saying the device will show notifications [CHAR LIMIT=30] -->
+ <string name="status_bar_settings_notifications">Notifications</string>
+
+ <!-- Text to display next to the graphical battery meter. [CHAR LIMIT=3] -->
+ <string name="status_bar_settings_battery_meter_format" translatable="false">
+ <xliff:g id="number">%d</xliff:g><xliff:g id="percent">%%</xliff:g>
+ </string>
+
+ <!-- Recent Tasks dialog: title [CHAR LIMIT=30] -->
+ <string name="recent_tasks_title">Recent</string>
+ <!-- Recent Tasks dialog: message when there are no recent applications [CHAR LIMIT=NONE]-->
+ <string name="recent_tasks_empty">No recent applications.</string>
+
+ <!-- Recent apps label. Shown as title on recent apps panel -->
+ <string name="recent_tasks_app_label">Apps</string>
+
+ <!-- Rotation lock toast text: shown when rotation lock is turned off (and the screen will
+ auto-rotate based on the accelerometer). [CHAR LIMIT=NONE]-->
+ <string name="toast_rotation_free">Screen will rotate automatically.</string>
+
+ <!-- Rotation lock toast text: shown when rotation lock is turned on and the orientation is
+ undefined. [CHAR LIMIT=NONE] -->
+ <string name="toast_rotation_locked">Screen rotation is now locked.</string>
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 86bcf3a..86ffb4d 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -19,10 +19,37 @@
<style name="TextAppearance.StatusBar.Title" parent="@android:style/TextAppearance.StatusBar">
<item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
<item name="android:textStyle">bold</item>
- <item name="android:textColor">@drawable/notification_header_text_color</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
</style>
<style name="TextAppearance.StatusBar.IntruderAlert"
parent="@android:style/TextAppearance.StatusBar">
</style>
+
+ <style name="TextAppearance.StatusBar.SystemPanel"
+ parent="@android:style/TextAppearance.StatusBar">
+ <item name="android:textAppearance">?android:attr/textAppearance</item>
+ <item name="android:textStyle">normal</item>
+ <item name="android:textColor">#FF808080</item>
+ </style>
+
+ <style name="TextAppearance.StatusBar.TextButton"
+ parent="@android:style/TextAppearance.StatusBar">
+ <item name="android:textAppearance">?android:attr/textAppearance</item>
+ <item name="android:textStyle">normal</item>
+ <item name="android:textColor">#FFFFFFFF</item>
+ </style>
+
+ <style name="Animation" />
+
+ <style name="Animation.ShirtPocketPanel">
+ <item name="android:windowEnterAnimation">@*android:anim/grow_fade_in_from_bottom</item>
+ <item name="android:windowExitAnimation">@*android:anim/shrink_fade_out_from_bottom</item>
+ </style>
+
+ <style name="Animation.RecentPanel">
+ <item name="android:windowEnterAnimation">@*android:anim/grow_fade_in_from_bottom</item>
+ <item name="android:windowExitAnimation">@*android:anim/shrink_fade_out_from_bottom</item>
+ </style>
+
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLinearLayout.java b/packages/SystemUI/src/com/android/systemui/SystemUI.java
index 8105352..53fe2ff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLinearLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUI.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2010 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.
@@ -14,16 +14,18 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.LinearLayout;
+public abstract class SystemUI {
+ public Context mContext;
+
+ public abstract void start();
-public class NotificationLinearLayout extends LinearLayout {
- public NotificationLinearLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
}
}
-
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIService.java b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
new file mode 100644
index 0000000..65990ad
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2010 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;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Binder;
+import android.os.IBinder;
+import android.util.Slog;
+
+public class SystemUIService extends Service {
+ static final String TAG = "SystemUIService";
+
+ /**
+ * The class names of the stuff to start.
+ */
+ final Object[] SERVICES = new Object[] {
+ R.string.config_statusBarComponent,
+ com.android.systemui.power.PowerUI.class,
+ };
+
+ /**
+ * Hold a reference on the stuff we start.
+ */
+ SystemUI[] mServices;
+
+ private Class chooseClass(Object o) {
+ if (o instanceof Integer) {
+ final String cl = getString((Integer)o);
+ try {
+ return getClassLoader().loadClass(cl);
+ } catch (ClassNotFoundException ex) {
+ throw new RuntimeException(ex);
+ }
+ } else if (o instanceof Class) {
+ return (Class)o;
+ } else {
+ throw new RuntimeException("Unknown system ui service: " + o);
+ }
+ }
+
+ @Override
+ public void onCreate() {
+ final int N = SERVICES.length;
+ mServices = new SystemUI[N];
+ for (int i=0; i<N; i++) {
+ Class cl = chooseClass(SERVICES[i]);
+ Slog.d(TAG, "loading: " + cl);
+ try {
+ mServices[i] = (SystemUI)cl.newInstance();
+ } catch (IllegalAccessException ex) {
+ throw new RuntimeException(ex);
+ } catch (InstantiationException ex) {
+ throw new RuntimeException(ex);
+ }
+ mServices[i].mContext = this;
+ Slog.d(TAG, "running: " + mServices[i]);
+ mServices[i].start();
+ }
+ }
+
+ /**
+ * Nobody binds to us.
+ */
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
+ != PackageManager.PERMISSION_GRANTED) {
+ pw.println("Permission Denial: can't dump StatusBar from from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid());
+ return;
+ }
+
+ if (args == null || args.length == 0) {
+ for (SystemUI ui: mServices) {
+ pw.println("dumping service: " + ui.getClass().getName());
+ ui.dump(fd, pw, args);
+ }
+ } else {
+ String svc = args[0];
+ for (SystemUI ui: mServices) {
+ String name = ui.getClass().getName();
+ if (name.endsWith(svc)) {
+ ui.dump(fd, pw, args);
+ }
+ }
+ }
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
new file mode 100644
index 0000000..9dfc9c3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -0,0 +1,289 @@
+/*
+ * 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.power;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.Arrays;
+
+import android.app.AlertDialog;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.Uri;
+import android.os.BatteryManager;
+import android.os.Handler;
+import android.media.AudioManager;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.provider.Settings;
+import android.util.Slog;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+import com.android.systemui.SystemUI;
+
+public class PowerUI extends SystemUI {
+ static final String TAG = "PowerUI";
+
+ Handler mHandler = new Handler();
+
+ int mBatteryLevel = 100;
+ int mBatteryStatus = BatteryManager.BATTERY_STATUS_UNKNOWN;
+ int mPlugType = 0;
+ int mInvalidCharger = 0;
+
+ int mLowBatteryAlertCloseLevel;
+ int[] mLowBatteryReminderLevels = new int[2];
+
+ AlertDialog mInvalidChargerDialog;
+ AlertDialog mLowBatteryDialog;
+ TextView mBatteryLevelTextView;
+
+ public void start() {
+
+ mLowBatteryAlertCloseLevel = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_lowBatteryCloseWarningLevel);
+ mLowBatteryReminderLevels[0] = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_lowBatteryWarningLevel);
+ mLowBatteryReminderLevels[1] = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_criticalBatteryWarningLevel);
+
+ // Register for Intent broadcasts for...
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_BATTERY_CHANGED);
+ filter.addAction(Intent.ACTION_POWER_CONNECTED);
+ mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
+ }
+
+ /**
+ * Buckets the battery level.
+ *
+ * The code in this function is a little weird because I couldn't comprehend
+ * the bucket going up when the battery level was going down. --joeo
+ *
+ * 1 means that the battery is "ok"
+ * 0 means that the battery is between "ok" and what we should warn about.
+ * less than 0 means that the battery is low
+ */
+ private int findBatteryLevelBucket(int level) {
+ if (level >= mLowBatteryAlertCloseLevel) {
+ return 1;
+ }
+ if (level >= mLowBatteryReminderLevels[0]) {
+ return 0;
+ }
+ final int N = mLowBatteryReminderLevels.length;
+ for (int i=N-1; i>=0; i--) {
+ if (level <= mLowBatteryReminderLevels[i]) {
+ return -1-i;
+ }
+ }
+ throw new RuntimeException("not possible!");
+ }
+
+ private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
+ final int oldBatteryLevel = mBatteryLevel;
+ mBatteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 100);
+ final int oldBatteryStatus = mBatteryStatus;
+ mBatteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS,
+ BatteryManager.BATTERY_STATUS_UNKNOWN);
+ final int oldPlugType = mPlugType;
+ mPlugType = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 1);
+ final int oldInvalidCharger = mInvalidCharger;
+ mInvalidCharger = intent.getIntExtra(BatteryManager.EXTRA_INVALID_CHARGER, 0);
+
+ final boolean plugged = mPlugType != 0;
+ final boolean oldPlugged = oldPlugType != 0;
+
+ int oldBucket = findBatteryLevelBucket(oldBatteryLevel);
+ int bucket = findBatteryLevelBucket(mBatteryLevel);
+
+ if (false) {
+ Slog.d(TAG, "buckets ....." + mLowBatteryAlertCloseLevel
+ + " .. " + mLowBatteryReminderLevels[0]
+ + " .. " + mLowBatteryReminderLevels[1]);
+ Slog.d(TAG, "level " + oldBatteryLevel + " --> " + mBatteryLevel);
+ Slog.d(TAG, "status " + oldBatteryStatus + " --> " + mBatteryStatus);
+ Slog.d(TAG, "plugType " + oldPlugType + " --> " + mPlugType);
+ Slog.d(TAG, "invalidCharger " + oldInvalidCharger + " --> " + mInvalidCharger);
+ Slog.d(TAG, "bucket " + oldBucket + " --> " + bucket);
+ Slog.d(TAG, "plugged " + oldPlugged + " --> " + plugged);
+ }
+
+ if (oldInvalidCharger == 0 && mInvalidCharger != 0) {
+ Slog.d(TAG, "showing invalid charger warning");
+ showInvalidChargerDialog();
+ return;
+ } else if (oldInvalidCharger != 0 && mInvalidCharger == 0) {
+ Slog.d(TAG, "closing invalid charger warning");
+ dismissInvalidChargerDialog();
+ } else if (mInvalidChargerDialog != null) {
+ // if invalid charger is showing, don't show low battery
+ return;
+ }
+
+ if (!plugged
+ && (bucket < oldBucket || oldPlugged)
+ && mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
+ && bucket < 0) {
+ Slog.d(TAG, "showing low battery warning: level=" + mBatteryLevel);
+ showLowBatteryWarning();
+ } else if (plugged || (bucket > oldBucket && bucket > 0)) {
+ Slog.d(TAG, "closing low battery warning: level=" + mBatteryLevel);
+ dismissLowBatteryWarning();
+ } else if (mBatteryLevelTextView != null) {
+ showLowBatteryWarning();
+ }
+ } else {
+ Slog.w(TAG, "unknown intent: " + intent);
+ }
+ }
+ };
+
+ void dismissLowBatteryWarning() {
+ if (mLowBatteryDialog != null) {
+ mLowBatteryDialog.dismiss();
+ }
+ }
+
+ void showLowBatteryWarning() {
+ CharSequence levelText = mContext.getString(
+ R.string.battery_low_percent_format, mBatteryLevel);
+
+ if (mBatteryLevelTextView != null) {
+ mBatteryLevelTextView.setText(levelText);
+ } else {
+ View v = View.inflate(mContext, R.layout.battery_low, null);
+ mBatteryLevelTextView = (TextView)v.findViewById(R.id.level_percent);
+
+ mBatteryLevelTextView.setText(levelText);
+
+ AlertDialog.Builder b = new AlertDialog.Builder(mContext);
+ b.setCancelable(true);
+ b.setTitle(R.string.battery_low_title);
+ b.setView(v);
+ b.setIcon(android.R.drawable.ic_dialog_alert);
+ b.setPositiveButton(android.R.string.ok, null);
+
+ final Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
+ | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
+ | Intent.FLAG_ACTIVITY_NO_HISTORY);
+ if (intent.resolveActivity(mContext.getPackageManager()) != null) {
+ b.setNegativeButton(R.string.battery_low_why,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ mContext.startActivity(intent);
+ if (mLowBatteryDialog != null) {
+ mLowBatteryDialog.dismiss();
+ }
+ }
+ });
+ }
+
+ AlertDialog d = b.create();
+ d.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ public void onDismiss(DialogInterface dialog) {
+ mLowBatteryDialog = null;
+ mBatteryLevelTextView = null;
+ }
+ });
+ d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+ d.show();
+ mLowBatteryDialog = d;
+ }
+
+if (false) { // getRingtone ANRs
+ final ContentResolver cr = mContext.getContentResolver();
+ if (Settings.System.getInt(cr, Settings.System.POWER_SOUNDS_ENABLED, 1) == 1) {
+ final String soundPath = Settings.System.getString(cr,
+ Settings.System.LOW_BATTERY_SOUND);
+ if (soundPath != null) {
+ final Uri soundUri = Uri.parse("file://" + soundPath);
+ if (soundUri != null) {
+ final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
+ if (sfx != null) {
+ sfx.setStreamType(AudioManager.STREAM_SYSTEM);
+ sfx.play();
+ }
+ }
+ }
+ }
+}
+ }
+
+ void dismissInvalidChargerDialog() {
+ if (mInvalidChargerDialog != null) {
+ mInvalidChargerDialog.dismiss();
+ }
+ }
+
+ void showInvalidChargerDialog() {
+ dismissLowBatteryWarning();
+
+ AlertDialog.Builder b = new AlertDialog.Builder(mContext);
+ b.setCancelable(true);
+ b.setMessage(R.string.invalid_charger);
+ b.setIcon(android.R.drawable.ic_dialog_alert);
+ b.setPositiveButton(android.R.string.ok, null);
+
+ AlertDialog d = b.create();
+ d.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ public void onDismiss(DialogInterface dialog) {
+ mInvalidChargerDialog = null;
+ mBatteryLevelTextView = null;
+ }
+ });
+
+ d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+ d.show();
+ mInvalidChargerDialog = d;
+ }
+
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.print("mLowBatteryAlertCloseLevel=");
+ pw.println(mLowBatteryAlertCloseLevel);
+ pw.print("mLowBatteryReminderLevels=");
+ pw.println(Arrays.toString(mLowBatteryReminderLevels));
+ pw.print("mInvalidChargerDialog=");
+ pw.println(mInvalidChargerDialog == null ? "null" : mInvalidChargerDialog.toString());
+ pw.print("mLowBatteryDialog=");
+ pw.println(mLowBatteryDialog == null ? "null" : mLowBatteryDialog.toString());
+ pw.print("mBatteryLevel=");
+ pw.println(Integer.toString(mBatteryLevel));
+ pw.print("mBatteryStatus=");
+ pw.println(Integer.toString(mBatteryStatus));
+ pw.print("mPlugType=");
+ pw.println(Integer.toString(mPlugType));
+ pw.print("mInvalidCharger=");
+ pw.println(Integer.toString(mInvalidCharger));
+ pw.print("bucket: ");
+ pw.println(Integer.toString(findBatteryLevelBucket(mBatteryLevel)));
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java
new file mode 100644
index 0000000..a98ef0b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java
@@ -0,0 +1,531 @@
+/*
+ * Copyright (C) 2010 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.recent;
+
+import com.android.systemui.R;
+
+import com.android.ex.carousel.CarouselView;
+import com.android.ex.carousel.CarouselViewHelper;
+import com.android.ex.carousel.CarouselRS.CarouselCallback;
+import com.android.ex.carousel.CarouselViewHelper.DetailTextureParameters;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
+import android.app.IActivityManager;
+import android.app.IThumbnailReceiver;
+import android.app.ActivityManager.RunningTaskInfo;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.PaintFlagsDrawFilter;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.PorterDuff;
+import android.graphics.Bitmap.Config;
+import android.graphics.drawable.Drawable;
+import android.graphics.PixelFormat;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.View;
+import android.view.View.MeasureSpec;
+import android.widget.TextView;
+
+public class RecentApplicationsActivity extends Activity {
+ private static final String TAG = "RecentApplicationsActivity";
+ private static boolean DBG = false;
+ private static final int CARD_SLOTS = 56;
+ private static final int VISIBLE_SLOTS = 7;
+ private static final int MAX_TASKS = VISIBLE_SLOTS * 2;
+
+ // TODO: these should be configurable
+ private static final int DETAIL_TEXTURE_MAX_WIDTH = 200;
+ private static final int DETAIL_TEXTURE_MAX_HEIGHT = 80;
+ private static final int TEXTURE_WIDTH = 256;
+ private static final int TEXTURE_HEIGHT = 256;
+
+ private ActivityManager mActivityManager;
+ private List<RunningTaskInfo> mRunningTaskList;
+ private boolean mPortraitMode = true;
+ private ArrayList<ActivityDescription> mActivityDescriptions
+ = new ArrayList<ActivityDescription>();
+ private CarouselView mCarouselView;
+ private LocalCarouselViewHelper mHelper;
+ private View mNoRecentsView;
+ private Bitmap mLoadingBitmap;
+ private Bitmap mRecentOverlay;
+ private boolean mHidden = false;
+ private boolean mHiding = false;
+ private DetailInfo mDetailInfo;
+
+ /**
+ * This class is a container for all items associated with the DetailView we'll
+ * be drawing to a bitmap and sending to Carousel.
+ *
+ */
+ static final class DetailInfo {
+ public DetailInfo(View _view, TextView _title, TextView _desc) {
+ view = _view;
+ title = _title;
+ description = _desc;
+ }
+
+ /**
+ * Draws view into the given bitmap, if provided
+ * @param bitmap
+ */
+ public Bitmap draw(Bitmap bitmap) {
+ resizeView(view, DETAIL_TEXTURE_MAX_WIDTH, DETAIL_TEXTURE_MAX_HEIGHT);
+ int desiredWidth = view.getWidth();
+ int desiredHeight = view.getHeight();
+ if (bitmap == null || desiredWidth != bitmap.getWidth()
+ || desiredHeight != bitmap.getHeight()) {
+ bitmap = Bitmap.createBitmap(desiredWidth, desiredHeight, Config.ARGB_8888);
+ }
+ Canvas canvas = new Canvas(bitmap);
+ view.draw(canvas);
+ return bitmap;
+ }
+
+ /**
+ * Force a layout pass on the given view.
+ */
+ private void resizeView(View view, int maxWidth, int maxHeight) {
+ int widthSpec = MeasureSpec.getMode(MeasureSpec.AT_MOST)
+ | MeasureSpec.getSize(maxWidth);
+ int heightSpec = MeasureSpec.getMode(MeasureSpec.AT_MOST)
+ | MeasureSpec.getSize(maxHeight);
+ view.measure(widthSpec, heightSpec);
+ view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
+ Log.v(TAG, "RESIZED VIEW: " + view.getWidth() + ", " + view.getHeight());
+ }
+
+ public View view;
+ public TextView title;
+ public TextView description;
+ }
+
+ static class ActivityDescription {
+ int id;
+ Bitmap thumbnail; // generated by Activity.onCreateThumbnail()
+ Drawable icon; // application package icon
+ String label; // application package label
+ CharSequence description; // generated by Activity.onCreateDescription()
+ Intent intent; // launch intent for application
+ Matrix matrix; // arbitrary rotation matrix to correct orientation
+ int position; // position in list
+
+ public ActivityDescription(Bitmap _thumbnail,
+ Drawable _icon, String _label, String _desc, int _id, int _pos)
+ {
+ thumbnail = _thumbnail;
+ icon = _icon;
+ label = _label;
+ description = _desc;
+ id = _id;
+ position = _pos;
+ }
+
+ public void clear() {
+ icon = null;
+ thumbnail = null;
+ label = null;
+ description = null;
+ intent = null;
+ matrix = null;
+ id = -1;
+ position = -1;
+ }
+ };
+
+ private ActivityDescription findActivityDescription(int id) {
+ for (int i = 0; i < mActivityDescriptions.size(); i++) {
+ ActivityDescription item = mActivityDescriptions.get(i);
+ if (item != null && item.id == id) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ private class LocalCarouselViewHelper extends CarouselViewHelper {
+ private DetailTextureParameters mDetailParams = new DetailTextureParameters(10.0f, 20.0f);
+
+ public LocalCarouselViewHelper(Context context) {
+ super(context);
+ }
+
+ @Override
+ public DetailTextureParameters getDetailTextureParameters(int id) {
+ return mDetailParams;
+ }
+
+ public void onCardSelected(int n) {
+ if (n < mActivityDescriptions.size()) {
+ ActivityDescription item = mActivityDescriptions.get(n);
+ if (item.id >= 0) {
+ // This is an active task; it should just go to the foreground.
+ final ActivityManager am = (ActivityManager)
+ getSystemService(Context.ACTIVITY_SERVICE);
+ am.moveTaskToFront(item.id, ActivityManager.MOVE_TASK_WITH_HOME);
+ } else if (item.intent != null) {
+ // prepare a launch intent and send it
+ item.intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
+ | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
+ try {
+ if (DBG) Log.v(TAG, "Starting intent " + item.intent);
+ startActivity(item.intent);
+ overridePendingTransition(R.anim.recent_app_enter, R.anim.recent_app_leave);
+ } catch (ActivityNotFoundException e) {
+ if (DBG) Log.w("Recent", "Unable to launch recent task", e);
+ }
+ finish();
+ }
+ }
+ }
+
+ @Override
+ public Bitmap getTexture(final int id) {
+ if (DBG) Log.v(TAG, "onRequestTexture(" + id + ")");
+ ActivityDescription info;
+ synchronized(mActivityDescriptions) {
+ info = mActivityDescriptions.get(id);
+ }
+ Bitmap bitmap = null;
+ if (info != null) {
+ bitmap = compositeBitmap(info);
+ }
+ return bitmap;
+ }
+
+ @Override
+ public Bitmap getDetailTexture(int n) {
+ Bitmap bitmap = null;
+ if (n < mActivityDescriptions.size()) {
+ ActivityDescription item = mActivityDescriptions.get(n);
+ mDetailInfo.title.setText(item.label);
+ mDetailInfo.description.setText(item.description);
+ bitmap = mDetailInfo.draw(null);
+ }
+ return bitmap;
+ }
+ };
+
+ private Bitmap compositeBitmap(ActivityDescription info) {
+ final int targetWidth = TEXTURE_WIDTH;
+ final int targetHeight = TEXTURE_HEIGHT;
+ final int border = 3; // inset along the edge for thumnnail content
+ final int overlap = 1; // how many pixels of overlap between border and thumbnail
+ final Resources res = getResources();
+ if (mRecentOverlay == null) {
+ mRecentOverlay = BitmapFactory.decodeResource(res, R.drawable.recent_overlay);
+ }
+
+ // Create a bitmap of the proper size/format and set the canvas to draw to it
+ final Bitmap result = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888);
+ final Canvas canvas = new Canvas(result);
+ canvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, Paint.FILTER_BITMAP_FLAG));
+ Paint paint = new Paint();
+ paint.setFilterBitmap(false);
+
+ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
+ canvas.save();
+ if (info.thumbnail != null) {
+ // Draw the thumbnail
+ int sourceWidth = targetWidth - 2 * (border - overlap);
+ int sourceHeight = targetHeight - 2 * (border - overlap);
+ final float scaleX = (float) sourceWidth / info.thumbnail.getWidth();
+ final float scaleY = (float) sourceHeight / info.thumbnail.getHeight();
+ canvas.translate(border * 0.5f, border * 0.5f);
+ canvas.scale(scaleX, scaleY);
+ canvas.drawBitmap(info.thumbnail, 0, 0, paint);
+ } else {
+ // Draw the Loading bitmap placeholder, TODO: Remove when RS handles blending
+ final float scaleX = (float) targetWidth / mLoadingBitmap.getWidth();
+ final float scaleY = (float) targetHeight / mLoadingBitmap.getHeight();
+ canvas.scale(scaleX, scaleY);
+ canvas.drawBitmap(mLoadingBitmap, 0, 0, paint);
+ }
+ canvas.restore();
+
+ // Draw overlay
+ canvas.save();
+ final float scaleOverlayX = (float) targetWidth / mRecentOverlay.getWidth();
+ final float scaleOverlayY = (float) targetHeight / mRecentOverlay.getHeight();
+ canvas.scale(scaleOverlayX, scaleOverlayY);
+ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD));
+ canvas.drawBitmap(mRecentOverlay, 0, 0, paint);
+ canvas.restore();
+
+ // Draw icon
+ if (info.icon != null) {
+ canvas.save();
+ info.icon.draw(canvas);
+ canvas.restore();
+ }
+
+ return result;
+ }
+
+ private final IThumbnailReceiver mThumbnailReceiver = new IThumbnailReceiver.Stub() {
+
+ public void finished() throws RemoteException {
+
+ }
+
+ public void newThumbnail(final int id, final Bitmap bitmap, CharSequence description)
+ throws RemoteException {
+ int w = bitmap.getWidth();
+ int h = bitmap.getHeight();
+ if (DBG) Log.v(TAG, "New thumbnail for id=" + id + ", dimensions=" + w + "x" + h
+ + " description '" + description + "'");
+ ActivityDescription info = findActivityDescription(id);
+ if (info != null) {
+ info.thumbnail = bitmap;
+ info.description = description;
+ final int thumbWidth = bitmap.getWidth();
+ final int thumbHeight = bitmap.getHeight();
+ if ((mPortraitMode && thumbWidth > thumbHeight)
+ || (!mPortraitMode && thumbWidth < thumbHeight)) {
+ Matrix matrix = new Matrix();
+ matrix.setRotate(90.0f, (float) thumbWidth / 2, (float) thumbHeight / 2);
+ info.matrix = matrix;
+ } else {
+ info.matrix = null;
+ }
+ // Force Carousel to request new textures for this item.
+ mCarouselView.setTextureForItem(info.position, null);
+ mCarouselView.setDetailTextureForItem(info.position, 0, 0, 0, 0, null);
+ } else {
+ if (DBG) Log.v(TAG, "Can't find view for id " + id);
+ }
+ }
+ };
+
+ /**
+ * We never really finish() RecentApplicationsActivity, since we don't want to
+ * get destroyed and pay the start-up cost to restart it.
+ */
+ @Override
+ public void finish() {
+ moveTaskToBack(true);
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ mHidden = !mHidden;
+ if (mHidden) {
+ mHiding = true;
+ moveTaskToBack(true);
+ } else {
+ mHiding = false;
+ }
+ super.onNewIntent(intent);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final Resources res = getResources();
+ final View decorView = getWindow().getDecorView();
+
+ getWindow().getDecorView().setBackgroundColor(0x80000000);
+
+ if (mCarouselView == null) {
+ long t = System.currentTimeMillis();
+ setContentView(R.layout.recent_apps_activity);
+ long elapsed = System.currentTimeMillis() - t;
+ Log.v(TAG, "Recents layout took " + elapsed + "ms to load");
+ mLoadingBitmap = BitmapFactory.decodeResource(res, R.drawable.recent_rez_border);
+ mCarouselView = (CarouselView)findViewById(R.id.carousel);
+ mHelper = new LocalCarouselViewHelper(this);
+ mHelper.setCarouselView(mCarouselView);
+
+ mCarouselView.setSlotCount(CARD_SLOTS);
+ mCarouselView.setVisibleSlots(VISIBLE_SLOTS);
+ mCarouselView.createCards(0);
+ mCarouselView.setStartAngle((float) -(2.0f*Math.PI * 5 / CARD_SLOTS));
+ mCarouselView.setDefaultBitmap(mLoadingBitmap);
+ mCarouselView.setLoadingBitmap(mLoadingBitmap);
+ mCarouselView.setRezInCardCount(3.0f);
+ mCarouselView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
+
+ mNoRecentsView = (View) findViewById(R.id.no_applications_message);
+
+ mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+ mPortraitMode = decorView.getHeight() > decorView.getWidth();
+
+ // Load detail view which will be used to render text
+ View detail = getLayoutInflater().inflate(R.layout.recents_detail_view, null);
+ TextView title = (TextView) detail.findViewById(R.id.app_title);
+ TextView description = (TextView) detail.findViewById(R.id.app_description);
+ mDetailInfo = new DetailInfo(detail, title, description);
+
+ refresh();
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ refresh();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mPortraitMode = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT;
+ if (DBG) Log.v(TAG, "CONFIG CHANGE, mPortraitMode = " + mPortraitMode);
+ refresh();
+ }
+
+ void updateRunningTasks() {
+ mRunningTaskList = mActivityManager.getRunningTasks(MAX_TASKS, 0, mThumbnailReceiver);
+ if (DBG) Log.v(TAG, "Portrait: " + mPortraitMode);
+ for (RunningTaskInfo r : mRunningTaskList) {
+ if (r.thumbnail != null) {
+ int thumbWidth = r.thumbnail.getWidth();
+ int thumbHeight = r.thumbnail.getHeight();
+ if (DBG) Log.v(TAG, "Got thumbnail " + thumbWidth + "x" + thumbHeight);
+ ActivityDescription desc = findActivityDescription(r.id);
+ if (desc != null) {
+ desc.thumbnail = r.thumbnail;
+ desc.description = r.description;
+ if ((mPortraitMode && thumbWidth > thumbHeight)
+ || (!mPortraitMode && thumbWidth < thumbHeight)) {
+ Matrix matrix = new Matrix();
+ matrix.setRotate(90.0f, (float) thumbWidth / 2, (float) thumbHeight / 2);
+ desc.matrix = matrix;
+ }
+ } else {
+ if (DBG) Log.v(TAG, "Couldn't find ActivityDesc for id=" + r.id);
+ }
+ } else {
+ if (DBG) Log.v(TAG, "*** RUNNING THUMBNAIL WAS NULL ***");
+ }
+ }
+ }
+
+ private void updateRecentTasks() {
+ final PackageManager pm = getPackageManager();
+ final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+
+ final List<ActivityManager.RecentTaskInfo> recentTasks =
+ am.getRecentTasks(MAX_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
+
+ ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
+ .resolveActivityInfo(pm, 0);
+
+ // IconUtilities iconUtilities = new IconUtilities(this); // FIXME
+
+ int numTasks = recentTasks.size();
+ mActivityDescriptions.clear();
+ for (int i = 0, index = 0; i < numTasks && (index < MAX_TASKS); ++i) {
+ final ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(i);
+
+ Intent intent = new Intent(recentInfo.baseIntent);
+ if (recentInfo.origActivity != null) {
+ intent.setComponent(recentInfo.origActivity);
+ }
+
+ // Skip the current home activity.
+ if (homeInfo != null
+ && homeInfo.packageName.equals(intent.getComponent().getPackageName())
+ && homeInfo.name.equals(intent.getComponent().getClassName())) {
+ continue;
+ }
+
+ intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+ | Intent.FLAG_ACTIVITY_NEW_TASK);
+ final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
+ if (resolveInfo != null) {
+ final ActivityInfo info = resolveInfo.activityInfo;
+ final String title = info.loadLabel(pm).toString();
+ Drawable icon = info.loadIcon(pm);
+
+ int id = recentTasks.get(i).id;
+ if (id != -1 && title != null && title.length() > 0 && icon != null) {
+ // icon = null; FIXME: iconUtilities.createIconDrawable(icon);
+ ActivityDescription item = new ActivityDescription(
+ null, icon, title, null, id, index);
+ item.intent = intent;
+ mActivityDescriptions.add(item);
+ if (DBG) Log.v(TAG, "Added item[" + index
+ + "], id=" + item.id
+ + ", title=" + item.label);
+ ++index;
+ } else {
+ if (DBG) Log.v(TAG, "SKIPPING item " + id);
+ }
+ }
+ }
+ }
+
+ private final Runnable mRefreshRunnable = new Runnable() {
+ public void run() {
+ updateRecentTasks();
+ updateRunningTasks();
+ showCarousel(mActivityDescriptions.size() > 0);
+ }
+ };
+
+ private void showCarousel(boolean show) {
+ if (show) {
+ mCarouselView.createCards(mActivityDescriptions.size());
+ for (int i = 1; i < mActivityDescriptions.size(); i++) {
+ // Force Carousel to update textures. Note we don't do this for the first item,
+ // since it will be updated when mThumbnailReceiver returns a thumbnail.
+ // TODO: only do this for apps that have changed.
+ mCarouselView.setTextureForItem(i, null);
+ mCarouselView.setDetailTextureForItem(i, 0, 0, 0, 0, null);
+ }
+ // Make carousel visible
+ mNoRecentsView.setVisibility(View.GONE);
+ mCarouselView.setVisibility(View.VISIBLE);
+ mCarouselView.createCards(mActivityDescriptions.size());
+ } else {
+ // show "No Recent Tasks"
+ mNoRecentsView.setVisibility(View.VISIBLE);
+ mCarouselView.setVisibility(View.GONE);
+ }
+ }
+
+ private void refresh() {
+ if (!mHiding && mCarouselView != null) {
+ // Don't update the view now. Instead, post a request so it happens next time
+ // we reach the looper after a delay. This way we can fold multiple refreshes
+ // into just the latest.
+ mCarouselView.removeCallbacks(mRefreshRunnable);
+ mCarouselView.postDelayed(mRefreshRunnable, 50);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsCarouselView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsCarouselView.java
new file mode 100644
index 0000000..1c8ec95
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsCarouselView.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2010 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.recent;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import com.android.ex.carousel.CarouselView;
+import com.android.systemui.R;
+
+public class RecentApplicationsCarouselView extends CarouselView {
+
+ public RecentApplicationsCarouselView(Context context) {
+ this(context, null);
+ }
+
+ public RecentApplicationsCarouselView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public Info getRenderScriptInfo() {
+ return new Info(R.raw.carousel);
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 4f080d5..37939df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -32,7 +32,7 @@ import com.android.internal.statusbar.StatusBarNotification;
* coalescing these calls so they don't stack up. For the calls
* are coalesced, note that they are all idempotent.
*/
-class CommandQueue extends IStatusBar.Stub {
+public class CommandQueue extends IStatusBar.Stub {
private static final String TAG = "StatusBar.CommandQueue";
private static final int MSG_MASK = 0xffff0000;
@@ -52,6 +52,11 @@ class CommandQueue extends IStatusBar.Stub {
private static final int OP_EXPAND = 1;
private static final int OP_COLLAPSE = 2;
+ private static final int MSG_SET_LIGHTS_ON = 0x00070000;
+
+ private static final int MSG_SHOW_MENU = 0x00080000;
+ private static final int MSG_SHOW_IME_BUTTON = 0x00090000;
+
private StatusBarIconList mList;
private Callbacks mCallbacks;
private Handler mHandler = new H();
@@ -75,6 +80,9 @@ class CommandQueue extends IStatusBar.Stub {
public void disable(int state);
public void animateExpand();
public void animateCollapse();
+ public void setLightsOn(boolean on);
+ public void setMenuKeyVisible(boolean visible);
+ public void setIMEButtonVisible(IBinder token, boolean visible);
}
public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -143,6 +151,27 @@ class CommandQueue extends IStatusBar.Stub {
}
}
+ public void setLightsOn(boolean on) {
+ synchronized (mList) {
+ mHandler.removeMessages(MSG_SET_LIGHTS_ON);
+ mHandler.obtainMessage(MSG_SET_LIGHTS_ON, on ? 1 : 0, 0, null).sendToTarget();
+ }
+ }
+
+ public void setMenuKeyVisible(boolean visible) {
+ synchronized (mList) {
+ mHandler.removeMessages(MSG_SHOW_MENU);
+ mHandler.obtainMessage(MSG_SHOW_MENU, visible ? 1 : 0, 0, null).sendToTarget();
+ }
+ }
+
+ public void setIMEButtonVisible(IBinder token, boolean visible) {
+ synchronized (mList) {
+ mHandler.removeMessages(MSG_SHOW_IME_BUTTON);
+ mHandler.obtainMessage(MSG_SHOW_IME_BUTTON, visible ? 1 : 0, 0, token).sendToTarget();
+ }
+ }
+
private final class H extends Handler {
public void handleMessage(Message msg) {
final int what = msg.what & MSG_MASK;
@@ -196,6 +225,16 @@ class CommandQueue extends IStatusBar.Stub {
} else {
mCallbacks.animateCollapse();
}
+ break;
+ case MSG_SET_LIGHTS_ON:
+ mCallbacks.setLightsOn(msg.arg1 != 0);
+ break;
+ case MSG_SHOW_MENU:
+ mCallbacks.setMenuKeyVisible(msg.arg1 != 0);
+ break;
+ case MSG_SHOW_IME_BUTTON:
+ mCallbacks.setIMEButtonVisible((IBinder)msg.obj, msg.arg1 != 0);
+ break;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java b/packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java
new file mode 100644
index 0000000..9e44e71
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2010 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;
+
+import android.app.StatusBarManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Slog;
+
+import com.android.systemui.statusbar.policy.Prefs;
+
+public class DoNotDisturb implements SharedPreferences.OnSharedPreferenceChangeListener {
+ private Context mContext;
+ private StatusBarManager mStatusBar;
+ SharedPreferences mPrefs;
+ private boolean mDoNotDisturb;
+
+ public DoNotDisturb(Context context) {
+ mContext = context;
+ mStatusBar = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
+ mPrefs = Prefs.read(context);
+ mPrefs.registerOnSharedPreferenceChangeListener(this);
+ mDoNotDisturb = mPrefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF, Prefs.DO_NOT_DISTURB_DEFAULT);
+ updateDisableRecord();
+ }
+
+ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+ final boolean val = prefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF,
+ Prefs.DO_NOT_DISTURB_DEFAULT);
+ if (val != mDoNotDisturb) {
+ mDoNotDisturb = val;
+ updateDisableRecord();
+ }
+ }
+
+ private void updateDisableRecord() {
+ final int disabled = StatusBarManager.DISABLE_NOTIFICATION_ICONS
+ | StatusBarManager.DISABLE_NOTIFICATION_ALERTS
+ | StatusBarManager.DISABLE_NOTIFICATION_TICKER;
+ mStatusBar.disable(mDoNotDisturb ? disabled : 0);
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java b/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java
index 1e89624..64ec063 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java
@@ -23,12 +23,11 @@ import android.view.MotionEvent;
import android.widget.FrameLayout;
public class LatestItemView extends FrameLayout {
-
public LatestItemView(Context context, AttributeSet attrs) {
super(context, attrs);
}
- public boolean dispatchTouchEvent(MotionEvent ev) {
- return onTouchEvent(ev);
+ public void setOnClickListener(OnClickListener l) {
+ super.setOnClickListener(l);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 7a82267..7e8a5c1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -22,6 +22,7 @@ import android.view.View;
import com.android.internal.statusbar.StatusBarNotification;
+import java.util.Comparator;
import java.util.ArrayList;
/**
@@ -35,26 +36,47 @@ public class NotificationData {
public View row; // the outer expanded view
public View content; // takes the click events and sends the PendingIntent
public View expanded; // the inflated RemoteViews
+ public Entry() {}
+ public Entry(IBinder key, StatusBarNotification n, StatusBarIconView ic) {
+ this.key = key;
+ this.notification = n;
+ this.icon = ic;
+ }
}
private final ArrayList<Entry> mEntries = new ArrayList<Entry>();
+ private final Comparator<Entry> mEntryCmp = new Comparator<Entry>() {
+ public int compare(Entry a, Entry b) {
+ return (int)(a.notification.notification.when - b.notification.notification.when);
+ }
+ };
public int size() {
return mEntries.size();
}
- public Entry getEntryAt(int index) {
- return mEntries.get(index);
+ public Entry get(int i) {
+ return mEntries.get(i);
+ }
+
+ public Entry findByKey(IBinder key) {
+ for (Entry e : mEntries) {
+ if (e.key == key) {
+ return e;
+ }
+ }
+ return null;
}
- public int findEntry(IBinder key) {
- final int N = mEntries.size();
- for (int i=0; i<N; i++) {
- Entry entry = mEntries.get(i);
- if (entry.key == key) {
- return i;
+ public int add(Entry entry) {
+ int i;
+ int N = mEntries.size();
+ for (i=0; i<N; i++) {
+ if (mEntryCmp.compare(mEntries.get(i), entry) > 0) {
+ break;
}
}
- return -1;
+ mEntries.add(i, entry);
+ return i;
}
public int add(IBinder key, StatusBarNotification notification, View row, View content,
@@ -66,42 +88,23 @@ public class NotificationData {
entry.content = content;
entry.expanded = expanded;
entry.icon = icon;
- final int index = chooseIndex(notification.notification.when);
- mEntries.add(index, entry);
- return index;
+ return add(entry);
}
public Entry remove(IBinder key) {
- final int N = mEntries.size();
- for (int i=0; i<N; i++) {
- Entry entry = mEntries.get(i);
- if (entry.key == key) {
- mEntries.remove(i);
- return entry;
- }
- }
- return null;
- }
-
- private int chooseIndex(final long when) {
- final int N = mEntries.size();
- for (int i=0; i<N; i++) {
- Entry entry = mEntries.get(i);
- if (entry.notification.notification.when > when) {
- return i;
- }
+ Entry e = findByKey(key);
+ if (e != null) {
+ mEntries.remove(e);
}
- return N;
+ return e;
}
/**
* Return whether there are any visible items (i.e. items without an error).
*/
public boolean hasVisibleItems() {
- final int N = mEntries.size();
- for (int i=0; i<N; i++) {
- Entry entry = mEntries.get(i);
- if (entry.expanded != null) { // the view successfully inflated
+ for (Entry e : mEntries) {
+ if (e.expanded != null) { // the view successfully inflated
return true;
}
}
@@ -112,11 +115,9 @@ public class NotificationData {
* Return whether there are any clearable items (that aren't errors).
*/
public boolean hasClearableItems() {
- final int N = mEntries.size();
- for (int i=0; i<N; i++) {
- Entry entry = mEntries.get(i);
- if (entry.expanded != null) { // the view successfully inflated
- if ((entry.notification.notification.flags & Notification.FLAG_NO_CLEAR) == 0) {
+ for (Entry e : mEntries) {
+ if (e.expanded != null) { // the view successfully inflated
+ if (e.notification.isClearable()) {
return true;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java
new file mode 100644
index 0000000..472a225
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2010 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;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.PixelFormat;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Slog;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.WindowManagerImpl;
+
+import java.util.ArrayList;
+
+import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.internal.statusbar.StatusBarIconList;
+import com.android.internal.statusbar.StatusBarNotification;
+
+import com.android.systemui.SystemUI;
+import com.android.systemui.R;
+
+public abstract class StatusBar extends SystemUI implements CommandQueue.Callbacks {
+ static final String TAG = "StatusBar";
+ private static final boolean SPEW = false;
+
+ protected CommandQueue mCommandQueue;
+ protected IStatusBarService mBarService;
+
+ // Up-call methods
+ protected abstract View makeStatusBarView();
+ protected abstract int getStatusBarGravity();
+
+ private DoNotDisturb mDoNotDisturb;
+
+ public void start() {
+ // First set up our views and stuff.
+ View sb = makeStatusBarView();
+
+ // Connect in to the status bar manager service
+ StatusBarIconList iconList = new StatusBarIconList();
+ ArrayList<IBinder> notificationKeys = new ArrayList<IBinder>();
+ ArrayList<StatusBarNotification> notifications = new ArrayList<StatusBarNotification>();
+ mCommandQueue = new CommandQueue(this, iconList);
+ mBarService = IStatusBarService.Stub.asInterface(
+ ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+ int[] switches = new int[4];
+ ArrayList<IBinder> binders = new ArrayList<IBinder>();
+ try {
+ mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications,
+ switches, binders);
+ } catch (RemoteException ex) {
+ // If the system process isn't there we're doomed anyway.
+ }
+
+ disable(switches[0]);
+ setLightsOn(switches[1] != 0);
+ setMenuKeyVisible(switches[2] != 0);
+ // StatusBarManagerService has a back up of IME token and it's restored here.
+ setIMEButtonVisible(binders.get(0), switches[3] != 0);
+
+ // Set up the initial icon state
+ int N = iconList.size();
+ int viewIndex = 0;
+ for (int i=0; i<N; i++) {
+ StatusBarIcon icon = iconList.getIcon(i);
+ if (icon != null) {
+ addIcon(iconList.getSlot(i), i, viewIndex, icon);
+ viewIndex++;
+ }
+ }
+
+ // Set up the initial notification state
+ N = notificationKeys.size();
+ if (N == notifications.size()) {
+ for (int i=0; i<N; i++) {
+ addNotification(notificationKeys.get(i), notifications.get(i));
+ }
+ } else {
+ Log.wtf(TAG, "Notification list length mismatch: keys=" + N
+ + " notifications=" + notifications.size());
+ }
+
+ // Put up the view
+ final Resources res = mContext.getResources();
+ final int height= res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
+
+ final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ height,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR,
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+ PixelFormat.RGBX_8888);
+ lp.gravity = getStatusBarGravity();
+ lp.setTitle("StatusBar");
+ // TODO lp.windowAnimations = R.style.Animation_StatusBar;
+ WindowManagerImpl.getDefault().addView(sb, lp);
+
+ if (SPEW) {
+ Slog.d(TAG, "Added status bar view: gravity=0x" + Integer.toHexString(lp.gravity)
+ + " icons=" + iconList.size()
+ + " disabled=0x" + Integer.toHexString(switches[0])
+ + " lights=" + switches[1]
+ + " menu=" + switches[2]
+ + " imeButton=" + switches[3]
+ );
+ }
+
+ mDoNotDisturb = new DoNotDisturb(mContext);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 8419e56..dbfbe11 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -84,7 +84,7 @@ public class StatusBarIconView extends AnimatedImageView {
if (!iconEquals) {
Drawable drawable = getIcon(icon);
if (drawable == null) {
- Slog.w(StatusBarService.TAG, "No icon for slot " + mSlot);
+ Slog.w(StatusBar.TAG, "No icon for slot " + mSlot);
return false;
}
setImageDrawable(drawable);
@@ -93,7 +93,8 @@ public class StatusBarIconView extends AnimatedImageView {
setImageLevel(icon.iconLevel);
}
if (!numberEquals) {
- if (icon.number > 0) {
+ if (icon.number > 0 && mContext.getResources().getBoolean(
+ R.bool.config_statusBarShowNumber)) {
if (mNumberBackground == null) {
mNumberBackground = getContext().getResources().getDrawable(
R.drawable.ic_notification_overlay);
@@ -130,7 +131,7 @@ public class StatusBarIconView extends AnimatedImageView {
try {
r = context.getPackageManager().getResourcesForApplication(icon.iconPackage);
} catch (PackageManager.NameNotFoundException ex) {
- Slog.e(StatusBarService.TAG, "Icon package not found: " + icon.iconPackage);
+ Slog.e(StatusBar.TAG, "Icon package not found: " + icon.iconPackage);
return null;
}
} else {
@@ -144,7 +145,7 @@ public class StatusBarIconView extends AnimatedImageView {
try {
return r.getDrawable(icon.iconId);
} catch (RuntimeException e) {
- Slog.w(StatusBarService.TAG, "Icon not found in "
+ Slog.w(StatusBar.TAG, "Icon not found in "
+ (icon.iconPackage != null ? icon.iconId : "<system>")
+ ": " + Integer.toHexString(icon.iconId));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CarrierLabel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java
index 31b78b6..d8441f2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CarrierLabel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.content.BroadcastReceiver;
import android.content.Context;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CloseDragHandle.java
index f45caf5..ba64282 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CloseDragHandle.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.util.AttributeSet;
@@ -23,7 +23,7 @@ import android.widget.LinearLayout;
public class CloseDragHandle extends LinearLayout {
- StatusBarService mService;
+ PhoneStatusBar mService;
public CloseDragHandle(Context context, AttributeSet attrs) {
super(context, attrs);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ExpandedView.java
index 3d85f27..92b8976 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ExpandedView.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.util.AttributeSet;
@@ -27,7 +27,7 @@ import android.util.Slog;
public class ExpandedView extends LinearLayout {
- StatusBarService mService;
+ PhoneStatusBar mService;
int mPrevHeight = -1;
public ExpandedView(Context context, AttributeSet attrs) {
@@ -50,10 +50,10 @@ public class ExpandedView extends LinearLayout {
super.onLayout(changed, left, top, right, bottom);
int height = bottom - top;
if (height != mPrevHeight) {
- //Slog.d(StatusBarService.TAG, "height changed old=" + mPrevHeight
+ //Slog.d(StatusBar.TAG, "height changed old=" + mPrevHeight
// + " new=" + height);
mPrevHeight = height;
- mService.updateExpandedViewPos(StatusBarService.EXPANDED_LEAVE_ALONE);
+ mService.updateExpandedViewPos(PhoneStatusBar.EXPANDED_LEAVE_ALONE);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java
index e87d003..e1d17a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.os.Handler;
@@ -26,7 +26,7 @@ import android.widget.LinearLayout;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.R;
-
+import com.android.systemui.statusbar.StatusBarIconView;
public class IconMerger extends LinearLayout {
private static final String TAG = "IconMerger";
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index de30ccd..0d6c5f6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -14,15 +14,9 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.app.Service;
-import com.android.internal.statusbar.IStatusBar;
-import com.android.internal.statusbar.IStatusBarService;
-import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.statusbar.StatusBarIconList;
-import com.android.internal.statusbar.StatusBarNotification;
-
import android.app.ActivityManagerNative;
import android.app.Dialog;
import android.app.Notification;
@@ -33,7 +27,6 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Rect;
@@ -41,10 +34,8 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
-import android.os.Binder;
import android.os.Handler;
import android.os.Message;
-import android.os.ServiceManager;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Slog;
@@ -75,14 +66,19 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
-import com.android.systemui.R;
-import com.android.systemui.statusbar.policy.StatusBarPolicy;
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.internal.statusbar.StatusBarIconList;
+import com.android.internal.statusbar.StatusBarNotification;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.NotificationData;
+import com.android.systemui.statusbar.StatusBar;
+import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.policy.DateView;
-public class StatusBarService extends Service implements CommandQueue.Callbacks {
- static final String TAG = "StatusBarService";
- static final boolean SPEW_ICONS = false;
+public class PhoneStatusBar extends StatusBar {
+ static final String TAG = "PhoneStatusBar";
static final boolean SPEW = false;
public static final String ACTION_STATUSBAR_START
@@ -93,15 +89,18 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
private static final int MSG_ANIMATE = 1000;
private static final int MSG_ANIMATE_REVEAL = 1001;
+ private static final int MSG_SHOW_INTRUDER = 1002;
+ private static final int MSG_HIDE_INTRUDER = 1003;
- StatusBarPolicy mIconPolicy;
+ // will likely move to a resource or other tunable param at some point
+ private static final int INTRUDER_ALERT_DECAY_MS = 10000;
- CommandQueue mCommandQueue;
- IStatusBarService mBarService;
+ PhoneStatusBarPolicy mIconPolicy;
int mIconSize;
Display mDisplay;
- StatusBarView mStatusBarView;
+
+ PhoneStatusBarView mStatusBarView;
int mPixelFormat;
H mHandler = new H();
Object mQueueLock = new Object();
@@ -139,6 +138,9 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
// the date view
DateView mDateView;
+ // for immersive activities
+ private View mIntruderAlertView;
+
// the tracker view
TrackingView mTrackingView;
WindowManager.LayoutParams mTrackingParams;
@@ -190,72 +192,25 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
}
}
-
@Override
- public void onCreate() {
- // First set up our views and stuff.
- mDisplay = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
- makeStatusBarView(this);
-
- // Connect in to the status bar manager service
- StatusBarIconList iconList = new StatusBarIconList();
- ArrayList<IBinder> notificationKeys = new ArrayList<IBinder>();
- ArrayList<StatusBarNotification> notifications = new ArrayList<StatusBarNotification>();
- mCommandQueue = new CommandQueue(this, iconList);
- mBarService = IStatusBarService.Stub.asInterface(
- ServiceManager.getService(Context.STATUS_BAR_SERVICE));
- try {
- mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications);
- } catch (RemoteException ex) {
- // If the system process isn't there we're doomed anyway.
- }
-
- // Set up the initial icon state
- int N = iconList.size();
- int viewIndex = 0;
- for (int i=0; i<N; i++) {
- StatusBarIcon icon = iconList.getIcon(i);
- if (icon != null) {
- addIcon(iconList.getSlot(i), i, viewIndex, icon);
- viewIndex++;
- }
- }
+ public void start() {
+ mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
+ .getDefaultDisplay();
- // Set up the initial notification state
- N = notificationKeys.size();
- if (N == notifications.size()) {
- for (int i=0; i<N; i++) {
- addNotification(notificationKeys.get(i), notifications.get(i));
- }
- } else {
- Log.wtf(TAG, "Notification list length mismatch: keys=" + N
- + " notifications=" + notifications.size());
- }
+ super.start();
- // Put up the view
- addStatusBarView();
+ addIntruderView();
// Lastly, call to the icon policy to install/update all the icons.
- mIconPolicy = new StatusBarPolicy(this);
- }
-
- @Override
- public void onDestroy() {
- // we're never destroyed
- }
-
- /**
- * Nobody binds to us.
- */
- @Override
- public IBinder onBind(Intent intent) {
- return null;
+ mIconPolicy = new PhoneStatusBarPolicy(mContext);
}
// ================================================================================
// Constructing the view
// ================================================================================
- private void makeStatusBarView(Context context) {
+ protected View makeStatusBarView() {
+ final Context context = mContext;
+
Resources res = context.getResources();
mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size);
@@ -264,7 +219,12 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
R.layout.status_bar_expanded, null);
expanded.mService = this;
- StatusBarView sb = (StatusBarView)View.inflate(context, R.layout.status_bar, null);
+ mIntruderAlertView = View.inflate(context, R.layout.intruder_alert, null);
+ mIntruderAlertView.setVisibility(View.GONE);
+ mIntruderAlertView.setClickable(true);
+
+ PhoneStatusBarView sb = (PhoneStatusBarView)View.inflate(context,
+ R.layout.status_bar, null);
sb.mService = this;
// figure out which pixel-format to use for the status bar.
@@ -294,7 +254,6 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
mScrollView = (ScrollView)expanded.findViewById(R.id.scroll);
mNotificationLinearLayout = expanded.findViewById(R.id.notificationLinearLayout);
- mExpandedView.setVisibility(View.GONE);
mOngoingTitle.setVisibility(View.GONE);
mLatestTitle.setVisibility(View.GONE);
@@ -320,91 +279,128 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
filter.addAction(Intent.ACTION_SCREEN_OFF);
context.registerReceiver(mBroadcastReceiver, filter);
+
+ return sb;
+ }
+
+ protected int getStatusBarGravity() {
+ return Gravity.TOP | Gravity.FILL_HORIZONTAL;
}
- protected void addStatusBarView() {
- Resources res = getResources();
+ private void addIntruderView() {
+ final Resources res = mContext.getResources();
final int height= res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
- final StatusBarView view = mStatusBarView;
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
- height,
- WindowManager.LayoutParams.TYPE_STATUS_BAR,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING,
- PixelFormat.RGBX_8888);
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+ PixelFormat.TRANSLUCENT);
lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
- lp.setTitle("StatusBar");
- lp.windowAnimations = com.android.internal.R.style.Animation_StatusBar;
+ lp.y += height * 1.5; // FIXME
+ lp.setTitle("IntruderAlert");
+ lp.windowAnimations = com.android.internal.R.style.Animation_StatusBar_IntruderAlert;
- WindowManagerImpl.getDefault().addView(view, lp);
+ WindowManagerImpl.getDefault().addView(mIntruderAlertView, lp);
}
public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
- if (SPEW_ICONS) {
- Slog.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
- + " icon=" + icon);
- }
- StatusBarIconView view = new StatusBarIconView(this, slot);
+ if (SPEW) Slog.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
+ + " icon=" + icon);
+ StatusBarIconView view = new StatusBarIconView(mContext, slot);
view.set(icon);
mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconSize, mIconSize));
}
public void updateIcon(String slot, int index, int viewIndex,
StatusBarIcon old, StatusBarIcon icon) {
- if (SPEW_ICONS) {
- Slog.d(TAG, "updateIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
- + " old=" + old + " icon=" + icon);
- }
+ if (SPEW) Slog.d(TAG, "updateIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
+ + " old=" + old + " icon=" + icon);
StatusBarIconView view = (StatusBarIconView)mStatusIcons.getChildAt(viewIndex);
view.set(icon);
}
public void removeIcon(String slot, int index, int viewIndex) {
- if (SPEW_ICONS) {
- Slog.d(TAG, "removeIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex);
- }
+ if (SPEW) Slog.d(TAG, "removeIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex);
mStatusIcons.removeViewAt(viewIndex);
}
public void addNotification(IBinder key, StatusBarNotification notification) {
- boolean shouldTick = true;
- if (notification.notification.fullScreenIntent != null) {
- shouldTick = false;
- Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
+ StatusBarIconView iconView = addNotificationViews(key, notification);
+ if (iconView == null) return;
+
+ boolean immersive = false;
+ try {
+ immersive = ActivityManagerNative.getDefault().isTopActivityImmersive();
+ Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive"));
+ } catch (RemoteException ex) {
+ }
+ if (immersive) {
+ if ((notification.notification.flags & Notification.FLAG_HIGH_PRIORITY) != 0) {
+ Slog.d(TAG, "Presenting high-priority notification in immersive activity");
+ // special new transient ticker mode
+ // 1. Populate mIntruderAlertView
+
+ ImageView alertIcon = (ImageView) mIntruderAlertView.findViewById(R.id.alertIcon);
+ TextView alertText = (TextView) mIntruderAlertView.findViewById(R.id.alertText);
+ alertIcon.setImageDrawable(StatusBarIconView.getIcon(
+ alertIcon.getContext(),
+ iconView.getStatusBarIcon()));
+ alertText.setText(notification.notification.tickerText);
+
+ View button = mIntruderAlertView.findViewById(R.id.intruder_alert_content);
+ button.setOnClickListener(
+ new Launcher(notification.notification.contentIntent,
+ notification.pkg, notification.tag, notification.id));
+
+ // 2. Animate mIntruderAlertView in
+ mHandler.sendEmptyMessage(MSG_SHOW_INTRUDER);
+
+ // 3. Set alarm to age the notification off (TODO)
+ mHandler.removeMessages(MSG_HIDE_INTRUDER);
+ mHandler.sendEmptyMessageDelayed(MSG_HIDE_INTRUDER, INTRUDER_ALERT_DECAY_MS);
+ }
+ } else if (notification.notification.fullScreenIntent != null) {
+ // not immersive & a full-screen alert should be shown
+ Slog.d(TAG, "Notification has fullScreenIntent and activity is not immersive;"
+ + " sending fullScreenIntent");
try {
notification.notification.fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
- }
-
- StatusBarIconView iconView = addNotificationViews(key, notification);
- if (iconView == null) return;
+ } else {
+ // usual case: status bar visible & not immersive
- if (shouldTick) {
+ // show the ticker
tick(notification);
}
-
+
// Recalculate the position of the sliding windows and the titles.
setAreThereNotifications();
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
}
public void updateNotification(IBinder key, StatusBarNotification notification) {
+ Slog.d(TAG, "updateNotification key=" + key + " notification=" + notification);
+
NotificationData oldList;
- int oldIndex = mOngoing.findEntry(key);
- if (oldIndex >= 0) {
+ NotificationData.Entry oldEntry = mOngoing.findByKey(key);
+ if (oldEntry != null) {
oldList = mOngoing;
} else {
- oldIndex = mLatest.findEntry(key);
- if (oldIndex < 0) {
+ oldEntry = mLatest.findByKey(key);
+ if (oldEntry == null) {
Slog.w(TAG, "updateNotification for unknown key: " + key);
return;
}
oldList = mLatest;
}
- final NotificationData.Entry oldEntry = oldList.getEntryAt(oldIndex);
final StatusBarNotification oldNotification = oldEntry.notification;
final RemoteViews oldContentView = oldNotification.notification.contentView;
@@ -434,12 +430,14 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
oldEntry.notification = notification;
try {
// Reapply the RemoteViews
- contentView.reapply(this, oldEntry.content);
+ contentView.reapply(mContext, oldEntry.content);
// update the contentIntent
final PendingIntent contentIntent = notification.notification.contentIntent;
if (contentIntent != null) {
oldEntry.content.setOnClickListener(new Launcher(contentIntent,
notification.pkg, notification.tag, notification.id));
+ } else {
+ oldEntry.content.setOnClickListener(null);
}
// Update the icon.
final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
@@ -505,8 +503,9 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
}
// create the row view
- LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View row = inflater.inflate(R.layout.status_bar_latest_event, parent, false);
+ LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ View row = inflater.inflate(R.layout.status_bar_notification_row, parent, false);
// bind the click event to the content area
ViewGroup content = (ViewGroup)row.findViewById(R.id.content);
@@ -516,12 +515,14 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
if (contentIntent != null) {
content.setOnClickListener(new Launcher(contentIntent, notification.pkg,
notification.tag, notification.id));
+ } else {
+ content.setOnClickListener(null);
}
View expanded = null;
Exception exception = null;
try {
- expanded = remoteViews.apply(this, content);
+ expanded = remoteViews.apply(mContext, content);
}
catch (RuntimeException e) {
exception = e;
@@ -560,7 +561,7 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
final View content = views[1];
final View expanded = views[2];
// Construct the icon.
- final StatusBarIconView iconView = new StatusBarIconView(this,
+ final StatusBarIconView iconView = new StatusBarIconView(mContext,
notification.pkg + "/0x" + Integer.toHexString(notification.id));
final StatusBarIcon ic = new StatusBarIcon(notification.pkg, notification.notification.icon,
notification.notification.iconLevel, notification.notification.number);
@@ -626,27 +627,27 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
if ((state & StatusBarManager.DISABLE_EXPAND) != 0) {
- if (SPEW) Slog.d(TAG, "DISABLE_EXPAND: yes");
+ Slog.d(TAG, "DISABLE_EXPAND: yes");
animateCollapse();
}
}
if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
- if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes");
+ Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes");
if (mTicking) {
mTicker.halt();
} else {
setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out);
}
} else {
- if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no");
+ Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no");
if (!mExpandedVisible) {
setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
}
}
} else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
if (mTicking && (state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
- if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: yes");
+ Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: yes");
mTicker.halt();
}
}
@@ -664,6 +665,12 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
case MSG_ANIMATE_REVEAL:
doRevealAnimation();
break;
+ case MSG_SHOW_INTRUDER:
+ setIntruderAlertVisibility(true);
+ break;
+ case MSG_HIDE_INTRUDER:
+ setIntruderAlertVisibility(false);
+ break;
}
}
}
@@ -690,7 +697,6 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
mExpandedDialog.getWindow().setAttributes(mExpandedParams);
mExpandedView.requestFocus(View.FOCUS_FORWARD);
mTrackingView.setVisibility(View.VISIBLE);
- mExpandedView.setVisibility(View.VISIBLE);
if (!mTicking) {
setDateViewVisibility(true, com.android.internal.R.anim.fade_in);
@@ -755,8 +761,7 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
void performCollapse() {
if (SPEW) Slog.d(TAG, "performCollapse: mExpanded=" + mExpanded
- + " mExpandedVisible=" + mExpandedVisible
- + " mTicking=" + mTicking);
+ + " mExpandedVisible=" + mExpandedVisible);
if (!mExpandedVisible) {
return;
@@ -767,14 +772,11 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
mExpandedDialog.getWindow().setAttributes(mExpandedParams);
mTrackingView.setVisibility(View.GONE);
- mExpandedView.setVisibility(View.GONE);
if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) {
setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
}
- if (mDateView.getVisibility() == View.VISIBLE) {
- setDateViewVisibility(false, com.android.internal.R.anim.fade_out);
- }
+ setDateViewVisibility(false, com.android.internal.R.anim.fade_out);
if (!mExpanded) {
return;
@@ -1003,6 +1005,19 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
return false;
}
+ public void setLightsOn(boolean on) {
+ if (!on) {
+ // All we do for "lights out" mode on a phone is hide the status bar,
+ // which the window manager does. But we do need to hide the windowshade
+ // on our own.
+ animateCollapse();
+ }
+ }
+
+ // Not supported
+ public void setMenuKeyVisible(boolean visible) { }
+ public void setIMEButtonVisible(IBinder token, boolean visible) { }
+
private class Launcher implements View.OnClickListener {
private PendingIntent mIntent;
private String mPkg;
@@ -1033,7 +1048,7 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
overlay.setSourceBounds(
new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight()));
try {
- mIntent.send(StatusBarService.this, 0, overlay);
+ mIntent.send(mContext, 0, overlay);
} catch (PendingIntent.CanceledException e) {
// the stack trace isn't very helpful here. Just log the exception message.
Slog.w(TAG, "Sending contentIntent failed: " + e);
@@ -1048,6 +1063,9 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
// close the shade if it was open
animateCollapse();
+
+ // If this click was on the intruder alert, hide that instead
+ mHandler.sendEmptyMessage(MSG_HIDE_INTRUDER);
}
}
@@ -1080,13 +1098,12 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
}
private class MyTicker extends Ticker {
- MyTicker(Context context, StatusBarView sb) {
+ MyTicker(Context context, View sb) {
super(context, sb);
}
@Override
- void tickerStarting() {
- if (SPEW) Slog.d(TAG, "tickerStarting");
+ public void tickerStarting() {
mTicking = true;
mIcons.setVisibility(View.GONE);
mTickerView.setVisibility(View.VISIBLE);
@@ -1098,33 +1115,41 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
}
@Override
- void tickerDone() {
- if (SPEW) Slog.d(TAG, "tickerDone");
- mTicking = false;
+ public void tickerDone() {
mIcons.setVisibility(View.VISIBLE);
mTickerView.setVisibility(View.GONE);
mIcons.startAnimation(loadAnim(com.android.internal.R.anim.push_down_in, null));
- mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_down_out, null));
+ mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_down_out,
+ mTickingDoneListener));
if (mExpandedVisible) {
setDateViewVisibility(true, com.android.internal.R.anim.push_down_in);
}
}
- void tickerHalting() {
- if (SPEW) Slog.d(TAG, "tickerHalting");
- mTicking = false;
+ public void tickerHalting() {
mIcons.setVisibility(View.VISIBLE);
mTickerView.setVisibility(View.GONE);
mIcons.startAnimation(loadAnim(com.android.internal.R.anim.fade_in, null));
- mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.fade_out, null));
+ mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.fade_out,
+ mTickingDoneListener));
if (mExpandedVisible) {
setDateViewVisibility(true, com.android.internal.R.anim.fade_in);
}
}
}
+ Animation.AnimationListener mTickingDoneListener = new Animation.AnimationListener() {;
+ public void onAnimationEnd(Animation animation) {
+ mTicking = false;
+ }
+ public void onAnimationRepeat(Animation animation) {
+ }
+ public void onAnimationStart(Animation animation) {
+ }
+ };
+
private Animation loadAnim(int id, Animation.AnimationListener listener) {
- Animation anim = AnimationUtils.loadAnimation(StatusBarService.this, id);
+ Animation anim = AnimationUtils.loadAnimation(mContext, id);
if (listener != null) {
anim.setAnimationListener(listener);
}
@@ -1136,15 +1161,7 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
+ " " + v.getWidth() + "x" + v.getHeight() + ")";
}
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
- != PackageManager.PERMISSION_GRANTED) {
- pw.println("Permission Denial: can't dump StatusBar from from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid());
- return;
- }
-
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
synchronized (mQueueLock) {
pw.println("Current Status Bar state:");
pw.println(" mExpanded=" + mExpanded
@@ -1176,17 +1193,50 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
+ " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY());
pw.println("mNotificationLinearLayout: " + viewInfo(mNotificationLinearLayout));
}
+ /*
+ synchronized (mNotificationData) {
+ int N = mNotificationData.ongoingCount();
+ pw.println(" ongoingCount.size=" + N);
+ for (int i=0; i<N; i++) {
+ StatusBarNotification n = mNotificationData.getOngoing(i);
+ pw.println(" [" + i + "] key=" + n.key + " view=" + n.view);
+ pw.println(" data=" + n.data);
+ }
+ N = mNotificationData.latestCount();
+ pw.println(" ongoingCount.size=" + N);
+ for (int i=0; i<N; i++) {
+ StatusBarNotification n = mNotificationData.getLatest(i);
+ pw.println(" [" + i + "] key=" + n.key + " view=" + n.view);
+ pw.println(" data=" + n.data);
+ }
+ }
+ */
- if (true) {
+ if (false) {
+ pw.println("see the logcat for a dump of the views we have created.");
// must happen on ui thread
mHandler.post(new Runnable() {
public void run() {
- Slog.d(TAG, "mStatusIcons:");
- mStatusIcons.debug();
+ mStatusBarView.getLocationOnScreen(mAbsPos);
+ Slog.d(TAG, "mStatusBarView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
+ + ") " + mStatusBarView.getWidth() + "x"
+ + mStatusBarView.getHeight());
+ mStatusBarView.debug();
+
+ mExpandedView.getLocationOnScreen(mAbsPos);
+ Slog.d(TAG, "mExpandedView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
+ + ") " + mExpandedView.getWidth() + "x"
+ + mExpandedView.getHeight());
+ mExpandedView.debug();
+
+ mTrackingView.getLocationOnScreen(mAbsPos);
+ Slog.d(TAG, "mTrackingView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
+ + ") " + mTrackingView.getWidth() + "x"
+ + mTrackingView.getHeight());
+ mTrackingView.debug();
}
});
}
-
}
void onBarViewAttached() {
@@ -1204,7 +1254,7 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
- WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
@@ -1232,7 +1282,7 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
lp.height = getExpandedHeight();
lp.x = 0;
mTrackingPosition = lp.y = -disph; // sufficiently large negative
- lp.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;
+ lp.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL;
lp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
@@ -1255,7 +1305,6 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
}
void setDateViewVisibility(boolean visible, int anim) {
- mDateView.setUpdates(visible);
mDateView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
mDateView.startAnimation(loadAnim(anim, null));
}
@@ -1272,8 +1321,7 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
void updateExpandedViewPos(int expandedPosition) {
if (SPEW) {
Slog.d(TAG, "updateExpandedViewPos before expandedPosition=" + expandedPosition
- + " mTrackingParams.y="
- + ((mTrackingParams == null) ? "???" : mTrackingParams.y)
+ + " mTrackingParams.y=" + mTrackingParams.y
+ " mTrackingPosition=" + mTrackingPosition);
}
@@ -1324,26 +1372,29 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
mExpandedContents.getLocationInWindow(mPositionTmp);
final int contentsBottom = mPositionTmp[1] + mExpandedContents.getHeight();
- if (expandedPosition != EXPANDED_LEAVE_ALONE) {
- mExpandedParams.y = pos + mTrackingView.getHeight()
- - (mTrackingParams.height-closePos) - contentsBottom;
- int max = h;
- if (mExpandedParams.y > max) {
- mExpandedParams.y = max;
- }
- int min = mTrackingPosition;
- if (mExpandedParams.y < min) {
- mExpandedParams.y = min;
- }
+ mExpandedParams.y = pos + mTrackingView.getHeight()
+ - (mTrackingParams.height-closePos) - contentsBottom;
+ int max = h;
+ if (mExpandedParams.y > max) {
+ mExpandedParams.y = max;
+ }
+ int min = mTrackingPosition;
+ if (mExpandedParams.y < min) {
+ mExpandedParams.y = min;
+ }
- boolean visible = (mTrackingPosition + mTrackingView.getHeight()) > h;
- if (!visible) {
- // if the contents aren't visible, move the expanded view way off screen
- // because the window itself extends below the content view.
- mExpandedParams.y = -disph;
- }
- mExpandedDialog.getWindow().setAttributes(mExpandedParams);
+ boolean visible = (mTrackingPosition + mTrackingView.getHeight()) > h;
+ if (!visible) {
+ // if the contents aren't visible, move the expanded view way off screen
+ // because the window itself extends below the content view.
+ mExpandedParams.y = -disph;
+ }
+ mExpandedDialog.getWindow().setAttributes(mExpandedParams);
+ // As long as this isn't just a repositioning that's not supposed to affect
+ // the user's perception of what's showing, call to say that the visibility
+ // has changed. (Otherwise, someone else will call to do that).
+ if (expandedPosition != EXPANDED_LEAVE_ALONE) {
if (SPEW) Slog.d(TAG, "updateExpandedViewPos visibilityChanged(" + visible + ")");
visibilityChanged(visible);
}
@@ -1415,9 +1466,6 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
}
}
} else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
- Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: "
- + (((net & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0)
- ? "yes" : "no"));
if (mTicking && (net & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
mTicker.halt();
}
@@ -1448,6 +1496,10 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
}
};
+ private void setIntruderAlertVisibility(boolean vis) {
+ mIntruderAlertView.setVisibility(vis ? View.VISIBLE : View.GONE);
+ }
+
/**
* Reload some of our resources when the configuration changes.
*
@@ -1456,12 +1508,13 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
* meantime, just update the things that we know change.
*/
void updateResources() {
- Resources res = getResources();
+ final Context context = mContext;
+ final Resources res = context.getResources();
- mClearButton.setText(getText(R.string.status_bar_clear_all_button));
- mOngoingTitle.setText(getText(R.string.status_bar_ongoing_events_title));
- mLatestTitle.setText(getText(R.string.status_bar_latest_events_title));
- mNoNotificationsTitle.setText(getText(R.string.status_bar_no_notifications_title));
+ mClearButton.setText(context.getText(R.string.status_bar_clear_all_button));
+ mOngoingTitle.setText(context.getText(R.string.status_bar_ongoing_events_title));
+ mLatestTitle.setText(context.getText(R.string.status_bar_latest_events_title));
+ mNoNotificationsTitle.setText(context.getText(R.string.status_bar_no_notifications_title));
mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore);
@@ -1477,7 +1530,8 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
}
void vibrate() {
- android.os.Vibrator vib = (android.os.Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
+ android.os.Vibrator vib = (android.os.Vibrator)mContext.getSystemService(
+ Context.VIBRATOR_SERVICE);
vib.vibrate(250);
}
@@ -1499,3 +1553,4 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
}
};
}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 9ef6e6f..73b6723 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -14,18 +14,14 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar.policy;
+package com.android.systemui.statusbar.phone;
import android.app.StatusBarManager;
-import android.app.AlertDialog;
-import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothHeadset;
+import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothPbap;
import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.TypedArray;
@@ -34,8 +30,6 @@ import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.location.LocationManager;
import android.media.AudioManager;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
@@ -60,11 +54,8 @@ import android.text.SpannableStringBuilder;
import android.util.Slog;
import android.view.View;
import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.WindowManagerImpl;
import android.widget.ImageView;
import android.widget.LinearLayout;
-import android.widget.TextView;
import com.android.internal.app.IBatteryStats;
import com.android.internal.telephony.IccCard;
@@ -80,8 +71,8 @@ import com.android.systemui.R;
* bar at boot time. It goes through the normal API for icons, even though it probably
* strictly doesn't need to.
*/
-public class StatusBarPolicy {
- private static final String TAG = "StatusBarPolicy";
+public class PhoneStatusBarPolicy {
+ private static final String TAG = "PhoneStatusBarPolicy";
// message codes for the handler
private static final int EVENT_BATTERY_CLOSE = 4;
@@ -96,24 +87,12 @@ public class StatusBarPolicy {
private final Context mContext;
private final StatusBarManager mService;
- private final Handler mHandler = new StatusBarHandler();
+ private final Handler mHandler = new Handler();
private final IBatteryStats mBatteryStats;
// storage
private StorageManager mStorageManager;
- // battery
- private boolean mBatteryFirst = true;
- private boolean mBatteryPlugged;
- private int mBatteryLevel;
- private AlertDialog mLowBatteryDialog;
- private TextView mBatteryLevelTextView;
- private View mBatteryView;
- private int mBatteryViewSequence;
- private boolean mBatteryShowLowOnEndCall = false;
- private static final boolean SHOW_LOW_BATTERY_WARNING = true;
- private static final boolean SHOW_BATTERY_WARNINGS_IN_CALL = true;
-
// phone
private TelephonyManager mPhone;
private int mPhoneSignalIconId;
@@ -319,9 +298,6 @@ public class StatusBarPolicy {
private boolean mVolumeVisible;
// bluetooth device status
- private int mBluetoothHeadsetState;
- private boolean mBluetoothA2dpConnected;
- private int mBluetoothPbapState;
private boolean mBluetoothEnabled;
// wifi
@@ -361,17 +337,8 @@ public class StatusBarPolicy {
else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {
updateSyncState(intent);
}
- else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
- onBatteryLow(intent);
- }
- else if (action.equals(Intent.ACTION_BATTERY_OKAY)
- || action.equals(Intent.ACTION_POWER_CONNECTED)) {
- onBatteryOkay(intent);
- }
else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||
- action.equals(BluetoothHeadset.ACTION_STATE_CHANGED) ||
- action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED) ||
- action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) {
+ action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
updateBluetooth(intent);
}
else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION) ||
@@ -401,7 +368,7 @@ public class StatusBarPolicy {
}
};
- public StatusBarPolicy(Context context) {
+ public PhoneStatusBarPolicy(Context context) {
mContext = context;
mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
mSignalStrength = new SignalStrength();
@@ -454,9 +421,6 @@ public class StatusBarPolicy {
} else {
mBluetoothEnabled = false;
}
- mBluetoothA2dpConnected = false;
- mBluetoothHeadsetState = BluetoothHeadset.STATE_DISCONNECTED;
- mBluetoothPbapState = BluetoothPbap.STATE_DISCONNECTED;
mService.setIconVisibility("bluetooth", mBluetoothEnabled);
// Gps status
@@ -482,17 +446,12 @@ public class StatusBarPolicy {
// Register for Intent broadcasts for...
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
- filter.addAction(Intent.ACTION_BATTERY_LOW);
- filter.addAction(Intent.ACTION_BATTERY_OKAY);
- filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_ALARM_CHANGED);
filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
- filter.addAction(BluetoothHeadset.ACTION_STATE_CHANGED);
- filter.addAction(BluetoothA2dp.ACTION_SINK_STATE_CHANGED);
- filter.addAction(BluetoothPbap.PBAP_STATE_CHANGED_ACTION);
+ filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
@@ -531,179 +490,6 @@ public class StatusBarPolicy {
final int id = intent.getIntExtra("icon-small", 0);
int level = intent.getIntExtra("level", 0);
mService.setIcon("battery", id, level);
-
- boolean plugged = intent.getIntExtra("plugged", 0) != 0;
- level = intent.getIntExtra("level", -1);
- if (false) {
- Slog.d(TAG, "updateBattery level=" + level
- + " plugged=" + plugged
- + " mBatteryPlugged=" + mBatteryPlugged
- + " mBatteryLevel=" + mBatteryLevel
- + " mBatteryFirst=" + mBatteryFirst);
- }
-
- boolean oldPlugged = mBatteryPlugged;
-
- mBatteryPlugged = plugged;
- mBatteryLevel = level;
-
- if (mBatteryFirst) {
- mBatteryFirst = false;
- }
- /*
- * No longer showing the battery view because it draws attention away
- * from the USB storage notification. We could still show it when
- * connected to a brick, but that could lead to the user into thinking
- * the device does not charge when plugged into USB (since he/she would
- * not see the same battery screen on USB as he sees on brick).
- */
- if (false) {
- Slog.d(TAG, "plugged=" + plugged + " oldPlugged=" + oldPlugged + " level=" + level);
- }
- }
-
- private void onBatteryLow(Intent intent) {
- if (SHOW_LOW_BATTERY_WARNING) {
- if (false) {
- Slog.d(TAG, "mPhoneState=" + mPhoneState
- + " mLowBatteryDialog=" + mLowBatteryDialog
- + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
- }
-
- if (SHOW_BATTERY_WARNINGS_IN_CALL || mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
- showLowBatteryWarning();
- } else {
- mBatteryShowLowOnEndCall = true;
- }
- }
- }
-
- private void onBatteryOkay(Intent intent) {
- if (mLowBatteryDialog != null
- && SHOW_LOW_BATTERY_WARNING) {
- mLowBatteryDialog.dismiss();
- mBatteryShowLowOnEndCall = false;
- }
- }
-
- private void setBatteryLevel(View parent, int id, int height, int background, int level) {
- ImageView v = (ImageView)parent.findViewById(id);
- LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)v.getLayoutParams();
- lp.weight = height;
- if (background != 0) {
- v.setBackgroundResource(background);
- Drawable bkg = v.getBackground();
- bkg.setLevel(level);
- }
- }
-
- private void showLowBatteryWarning() {
- closeLastBatteryView();
-
- // Show exact battery level.
- CharSequence levelText = mContext.getString(
- R.string.battery_low_percent_format, mBatteryLevel);
-
- if (mBatteryLevelTextView != null) {
- mBatteryLevelTextView.setText(levelText);
- } else {
- View v = View.inflate(mContext, R.layout.battery_low, null);
- mBatteryLevelTextView=(TextView)v.findViewById(R.id.level_percent);
-
- mBatteryLevelTextView.setText(levelText);
-
- AlertDialog.Builder b = new AlertDialog.Builder(mContext);
- b.setCancelable(true);
- b.setTitle(R.string.battery_low_title);
- b.setView(v);
- b.setIcon(android.R.drawable.ic_dialog_alert);
- b.setPositiveButton(android.R.string.ok, null);
-
- final Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_NO_HISTORY);
- if (intent.resolveActivity(mContext.getPackageManager()) != null) {
- b.setNegativeButton(R.string.battery_low_why,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- mContext.startActivity(intent);
- if (mLowBatteryDialog != null) {
- mLowBatteryDialog.dismiss();
- }
- }
- });
- }
-
- AlertDialog d = b.create();
- d.setOnDismissListener(mLowBatteryListener);
- d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- d.show();
- mLowBatteryDialog = d;
- }
-
- final ContentResolver cr = mContext.getContentResolver();
- if (Settings.System.getInt(cr,
- Settings.System.POWER_SOUNDS_ENABLED, 1) == 1)
- {
- final String soundPath = Settings.System.getString(cr,
- Settings.System.LOW_BATTERY_SOUND);
- if (soundPath != null) {
- final Uri soundUri = Uri.parse("file://" + soundPath);
- if (soundUri != null) {
- final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
- if (sfx != null) {
- sfx.setStreamType(AudioManager.STREAM_SYSTEM);
- sfx.play();
- }
- }
- }
- }
- }
-
- private final void updateCallState(int state) {
- mPhoneState = state;
- if (false) {
- Slog.d(TAG, "mPhoneState=" + mPhoneState
- + " mLowBatteryDialog=" + mLowBatteryDialog
- + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
- }
- if (mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
- if (mBatteryShowLowOnEndCall) {
- if (!mBatteryPlugged) {
- showLowBatteryWarning();
- }
- mBatteryShowLowOnEndCall = false;
- }
- } else {
- if (mLowBatteryDialog != null) {
- mLowBatteryDialog.dismiss();
- mBatteryShowLowOnEndCall = true;
- }
- }
- }
-
- private DialogInterface.OnDismissListener mLowBatteryListener
- = new DialogInterface.OnDismissListener() {
- public void onDismiss(DialogInterface dialog) {
- mLowBatteryDialog = null;
- mBatteryLevelTextView = null;
- }
- };
-
- private void scheduleCloseBatteryView() {
- Message m = mHandler.obtainMessage(EVENT_BATTERY_CLOSE);
- m.arg1 = (++mBatteryViewSequence);
- mHandler.sendMessageDelayed(m, 3000);
- }
-
- private void closeLastBatteryView() {
- if (mBatteryView != null) {
- //mBatteryView.debug();
- WindowManagerImpl.getDefault().removeView(mBatteryView);
- mBatteryView = null;
- }
}
private void updateConnectivity(Intent intent) {
@@ -764,7 +550,6 @@ public class StatusBarPolicy {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
- updateCallState(state);
// In cdma, if a voice call is made, RSSI should switch to 1x.
if (isCdma()) {
updateSignalStrength();
@@ -965,6 +750,7 @@ public class StatusBarPolicy {
case TelephonyManager.NETWORK_TYPE_EVDO_B:
mDataIconList = sDataNetType_3g[mInetCondition];
break;
+ // TODO - add support for NETWORK_TYPE_LTE and NETWORK_TYPE_EHRPD
default:
mDataIconList = sDataNetType_g[mInetCondition];
break;
@@ -1063,28 +849,16 @@ public class StatusBarPolicy {
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
mBluetoothEnabled = state == BluetoothAdapter.STATE_ON;
- } else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) {
- mBluetoothHeadsetState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE,
- BluetoothHeadset.STATE_ERROR);
- } else if (action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED)) {
- BluetoothA2dp a2dp = new BluetoothA2dp(mContext);
- if (a2dp.getConnectedSinks().size() != 0) {
- mBluetoothA2dpConnected = true;
- } else {
- mBluetoothA2dpConnected = false;
+ } else if (action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
+ int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
+ BluetoothAdapter.STATE_DISCONNECTED);
+ if (state == BluetoothAdapter.STATE_CONNECTED) {
+ iconId = R.drawable.stat_sys_data_bluetooth_connected;
}
- } else if (action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) {
- mBluetoothPbapState = intent.getIntExtra(BluetoothPbap.PBAP_STATE,
- BluetoothPbap.STATE_DISCONNECTED);
} else {
return;
}
- if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED || mBluetoothA2dpConnected ||
- mBluetoothPbapState == BluetoothPbap.STATE_CONNECTED) {
- iconId = R.drawable.stat_sys_data_bluetooth_connected;
- }
-
mService.setIcon("bluetooth", iconId, 0);
mService.setIconVisibility("bluetooth", mBluetoothEnabled);
}
@@ -1204,18 +978,4 @@ public class StatusBarPolicy {
}
mService.setIcon("phone_signal", mPhoneSignalIconId, 0);
}
-
-
- private class StatusBarHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case EVENT_BATTERY_CLOSE:
- if (msg.arg1 == mBatteryViewSequence) {
- closeLastBatteryView();
- }
- break;
- }
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 117b126..84c524a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -14,11 +14,12 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Canvas;
+import android.graphics.Rect;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.MotionEvent;
@@ -28,13 +29,14 @@ import android.view.ViewParent;
import android.widget.FrameLayout;
import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.FixedSizeDrawable;
-public class StatusBarView extends FrameLayout {
- private static final String TAG = "StatusBarView";
+public class PhoneStatusBarView extends FrameLayout {
+ private static final String TAG = "PhoneStatusBarView";
static final int DIM_ANIM_TIME = 400;
- StatusBarService mService;
+ PhoneStatusBar mService;
boolean mTracking;
int mStartX, mStartY;
ViewGroup mNotificationIcons;
@@ -42,7 +44,14 @@ public class StatusBarView extends FrameLayout {
View mDate;
FixedSizeDrawable mBackground;
- public StatusBarView(Context context, AttributeSet attrs) {
+ boolean mNightMode = false;
+ int mStartAlpha = 0, mEndAlpha = 0;
+ long mEndTime = 0;
+
+ Rect mButtonBounds = new Rect();
+ boolean mCapturingEvents = true;
+
+ public PhoneStatusBarView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@@ -65,9 +74,32 @@ public class StatusBarView extends FrameLayout {
}
@Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ boolean nightMode = (newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK)
+ == Configuration.UI_MODE_NIGHT_YES;
+ if (mNightMode != nightMode) {
+ mNightMode = nightMode;
+ mStartAlpha = getCurAlpha();
+ mEndAlpha = mNightMode ? 0x80 : 0x00;
+ mEndTime = SystemClock.uptimeMillis() + DIM_ANIM_TIME;
+ invalidate();
+ }
+ }
+
+ int getCurAlpha() {
+ long time = SystemClock.uptimeMillis();
+ if (time > mEndTime) {
+ return mEndAlpha;
+ }
+ return mEndAlpha
+ - (int)(((mEndAlpha-mStartAlpha) * (mEndTime-time) / DIM_ANIM_TIME));
+ }
+
+ @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
- mService.updateExpandedViewPos(StatusBarService.EXPANDED_LEAVE_ALONE);
+ mService.updateExpandedViewPos(PhoneStatusBar.EXPANDED_LEAVE_ALONE);
}
@Override
@@ -100,6 +132,18 @@ public class StatusBarView extends FrameLayout {
mBackground.setFixedBounds(-mDate.getLeft(), -mDate.getTop(), (r-l), (b-t));
}
+ @Override
+ protected void dispatchDraw(Canvas canvas) {
+ super.dispatchDraw(canvas);
+ int alpha = getCurAlpha();
+ if (alpha != 0) {
+ canvas.drawARGB(alpha, 0, 0, 0);
+ }
+ if (alpha != mEndAlpha) {
+ invalidate();
+ }
+ }
+
/**
* Gets the left position of v in this view. Throws if v is not
* a child of this.
@@ -138,6 +182,9 @@ public class StatusBarView extends FrameLayout {
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
+ if (!mCapturingEvents) {
+ return false;
+ }
if (event.getAction() != MotionEvent.ACTION_DOWN) {
mService.interceptTouchEvent(event);
}
@@ -146,6 +193,13 @@ public class StatusBarView extends FrameLayout {
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ if (mButtonBounds.contains((int)event.getX(), (int)event.getY())) {
+ mCapturingEvents = false;
+ return false;
+ }
+ }
+ mCapturingEvents = true;
return mService.interceptTouchEvent(event)
? true : super.onInterceptTouchEvent(event);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java
index 3a697a6..8ee12de 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/Ticker.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.graphics.drawable.Drawable;
@@ -36,7 +36,9 @@ import java.util.ArrayList;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.internal.util.CharSequences;
+
import com.android.systemui.R;
+import com.android.systemui.statusbar.StatusBarIconView;
public abstract class Ticker {
private static final int TICKER_SEGMENT_DELAY = 3000;
@@ -141,7 +143,7 @@ public abstract class Ticker {
}
};
- Ticker(Context context, StatusBarView sb) {
+ public Ticker(Context context, View sb) {
mContext = context;
mTickerView = sb.findViewById(R.id.ticker);
@@ -163,7 +165,7 @@ public abstract class Ticker {
}
- void addEntry(StatusBarNotification n) {
+ public void addEntry(StatusBarNotification n) {
int initialCount = mSegments.size();
// If what's being displayed has the same text and icon, just drop it
@@ -212,7 +214,7 @@ public abstract class Ticker {
}
}
- void removeEntry(StatusBarNotification n) {
+ public void removeEntry(StatusBarNotification n) {
for (int i=mSegments.size()-1; i>=0; i--) {
Segment seg = mSegments.get(i);
if (n.id == seg.notification.id && n.pkg.equals(seg.notification.pkg)) {
@@ -221,13 +223,13 @@ public abstract class Ticker {
}
}
- void halt() {
+ public void halt() {
mHandler.removeCallbacks(mAdvanceTicker);
mSegments.clear();
tickerHalting();
}
- void reflowText() {
+ public void reflowText() {
if (mSegments.size() > 0) {
Segment seg = mSegments.get(0);
CharSequence text = seg.getText();
@@ -266,8 +268,8 @@ public abstract class Ticker {
mHandler.postDelayed(mAdvanceTicker, TICKER_SEGMENT_DELAY);
}
- abstract void tickerStarting();
- abstract void tickerDone();
- abstract void tickerHalting();
+ public abstract void tickerStarting();
+ public abstract void tickerDone();
+ public abstract void tickerHalting();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TickerView.java
index 9749ae4..8aa3837 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TickerView.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.util.AttributeSet;
@@ -34,5 +34,9 @@ public class TickerView extends TextSwitcher
super.onSizeChanged(w, h, oldw, oldh);
mTicker.reflowText();
}
+
+ public void setTicker(Ticker t) {
+ mTicker = t;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/TrackingPatternView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrackingPatternView.java
index ba6f15d..d2ed5ff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/TrackingPatternView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrackingPatternView.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.content.res.TypedArray;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrackingView.java
index 9108eee..fd32a3d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrackingView.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.util.AttributeSet;
@@ -26,7 +26,7 @@ import android.widget.LinearLayout;
public class TrackingView extends LinearLayout {
final Display mDisplay;
- StatusBarService mService;
+ PhoneStatusBar mService;
boolean mTracking;
int mStartX, mStartY;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java
new file mode 100644
index 0000000..da60f0d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2010 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.policy;
+
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.util.Slog;
+import android.widget.CompoundButton;
+
+public class AirplaneModeController extends BroadcastReceiver
+ implements CompoundButton.OnCheckedChangeListener {
+ private static final String TAG = "StatusBar.AirplaneModeController";
+
+ private Context mContext;
+ private CompoundButton mCheckBox;
+
+ private boolean mAirplaneMode;
+
+ public AirplaneModeController(Context context, CompoundButton checkbox) {
+ mContext = context;
+ mAirplaneMode = getAirplaneMode();
+ mCheckBox = checkbox;
+ checkbox.setChecked(mAirplaneMode);
+ checkbox.setOnCheckedChangeListener(this);
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ context.registerReceiver(this, filter);
+
+ }
+
+ public void release() {
+ mContext.unregisterReceiver(this);
+ }
+
+ public void onCheckedChanged(CompoundButton view, boolean checked) {
+ Slog.d(TAG, "onCheckedChanged checked=" + checked + " mAirplaneMode=" + mAirplaneMode);
+ if (checked != mAirplaneMode) {
+ mAirplaneMode = checked;
+ unsafe(checked);
+ }
+ }
+
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) {
+ final boolean enabled = intent.getBooleanExtra("state", false);
+ if (enabled != mAirplaneMode) {
+ mAirplaneMode = enabled;
+ mCheckBox.setChecked(enabled);
+ }
+ }
+ }
+
+ private boolean getAirplaneMode() {
+ ContentResolver cr = mContext.getContentResolver();
+ return 0 != Settings.System.getInt(cr, Settings.System.AIRPLANE_MODE_ON, 0);
+ }
+
+ // TODO: Fix this racy API by adding something better to TelephonyManager or
+ // ConnectivityService.
+ private void unsafe(boolean enabled) {
+ Settings.System.putInt(
+ mContext.getContentResolver(),
+ Settings.System.AIRPLANE_MODE_ON,
+ enabled ? 1 : 0);
+ Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+ intent.putExtra("state", enabled);
+ mContext.sendBroadcast(intent);
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AutoRotateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AutoRotateController.java
new file mode 100644
index 0000000..866e5fc
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AutoRotateController.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2010 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.policy;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.util.Slog;
+import android.view.IWindowManager;
+import android.widget.CompoundButton;
+
+/**
+ * TODO: Listen for changes to the setting.
+ */
+public class AutoRotateController implements CompoundButton.OnCheckedChangeListener {
+ private static final String TAG = "StatusBar.AutoRotateController";
+
+ private Context mContext;
+ private CompoundButton mCheckBox;
+
+ private boolean mLockRotation;
+
+ public AutoRotateController(Context context, CompoundButton checkbox) {
+ mContext = context;
+ mLockRotation = getLockRotation();
+ mCheckBox = checkbox;
+ checkbox.setChecked(mLockRotation);
+ checkbox.setOnCheckedChangeListener(this);
+ }
+
+ public void onCheckedChanged(CompoundButton view, boolean checked) {
+ Slog.d(TAG, "onCheckedChanged checked=" + checked + " mLockRotation=" + mLockRotation);
+ if (checked != mLockRotation) {
+ setLockRotation(checked);
+ }
+ }
+
+ private boolean getLockRotation() {
+ ContentResolver cr = mContext.getContentResolver();
+ return 0 == Settings.System.getInt(cr, Settings.System.ACCELEROMETER_ROTATION, 0);
+ }
+
+ private void setLockRotation(boolean locked) {
+ mLockRotation = locked;
+ try {
+ IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService(
+ Context.WINDOW_SERVICE));
+ ContentResolver cr = mContext.getContentResolver();
+ if (locked) {
+ wm.freezeRotation();
+ } else {
+ wm.thawRotation();
+ }
+ } catch (RemoteException exc) {
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
new file mode 100644
index 0000000..ae2b6b2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2010 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.policy;
+
+import java.util.ArrayList;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.BatteryManager;
+import android.util.Slog;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+
+public class BatteryController extends BroadcastReceiver {
+ private static final String TAG = "StatusBar.BatteryController";
+
+ private Context mContext;
+ private ArrayList<ImageView> mIconViews = new ArrayList<ImageView>();
+ private ArrayList<TextView> mLabelViews = new ArrayList<TextView>();
+
+ public BatteryController(Context context) {
+ mContext = context;
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_BATTERY_CHANGED);
+ context.registerReceiver(this, filter);
+ }
+
+ public void addIconView(ImageView v) {
+ mIconViews.add(v);
+ }
+
+ public void addLabelView(TextView v) {
+ mLabelViews.add(v);
+ }
+
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
+ final int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
+ int N = mIconViews.size();
+ for (int i=0; i<N; i++) {
+ final int icon = intent.getIntExtra(BatteryManager.EXTRA_ICON_SMALL, 0);
+ ImageView v = mIconViews.get(i);
+ v.setImageResource(icon);
+ v.setImageLevel(level);
+ }
+ N = mLabelViews.size();
+ for (int i=0; i<N; i++) {
+ //final boolean plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;
+ TextView v = mLabelViews.get(i);
+ v.setText(mContext.getString(R.string.status_bar_settings_battery_meter_format, level));
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index 9fc8df5..69872df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.policy;
import android.content.BroadcastReceiver;
import android.content.Context;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
index e6d3a7e..136f4a94 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DateView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.policy;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -24,6 +24,8 @@ import android.util.AttributeSet;
import android.util.Slog;
import android.widget.TextView;
import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewParent;
import java.text.DateFormat;
import java.util.Date;
@@ -31,7 +33,9 @@ import java.util.Date;
public final class DateView extends TextView {
private static final String TAG = "DateView";
- private boolean mUpdating = false;
+ private boolean mAttachedToWindow;
+ private boolean mWindowVisible;
+ private boolean mUpdating;
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
@@ -51,12 +55,28 @@ public final class DateView extends TextView {
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
+ mAttachedToWindow = true;
+ setUpdates();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- setUpdates(false);
+ mAttachedToWindow = false;
+ setUpdates();
+ }
+
+ @Override
+ protected void onWindowVisibilityChanged(int visibility) {
+ super.onWindowVisibilityChanged(visibility);
+ mWindowVisible = visibility == VISIBLE;
+ setUpdates();
+ }
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int visibility) {
+ super.onVisibilityChanged(changedView, visibility);
+ setUpdates();
}
@Override
@@ -67,10 +87,26 @@ public final class DateView extends TextView {
private final void updateClock() {
Date now = new Date();
- setText(DateFormat.getDateInstance(DateFormat.LONG).format(now));
+ setText(DateFormat.getDateInstance(DateFormat.FULL).format(now));
+ }
+
+ private boolean isVisible() {
+ View v = this;
+ while (true) {
+ if (v.getVisibility() != VISIBLE) {
+ return false;
+ }
+ final ViewParent parent = v.getParent();
+ if (parent instanceof View) {
+ v = (View)parent;
+ } else {
+ return true;
+ }
+ }
}
- void setUpdates(boolean update) {
+ private void setUpdates() {
+ boolean update = mAttachedToWindow && mWindowVisible && isVisible();
if (update != mUpdating) {
mUpdating = update;
if (update) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java
new file mode 100644
index 0000000..94c8aa5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2010 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.policy;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.util.Slog;
+import android.view.IWindowManager;
+import android.widget.CompoundButton;
+
+public class DoNotDisturbController implements CompoundButton.OnCheckedChangeListener,
+ SharedPreferences.OnSharedPreferenceChangeListener {
+ private static final String TAG = "StatusBar.DoNotDisturbController";
+
+ SharedPreferences mPrefs;
+ private Context mContext;
+ private CompoundButton mCheckBox;
+
+ private boolean mDoNotDisturb;
+
+ public DoNotDisturbController(Context context, CompoundButton checkbox) {
+ mContext = context;
+
+ mPrefs = Prefs.read(context);
+ mPrefs.registerOnSharedPreferenceChangeListener(this);
+ mDoNotDisturb = mPrefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF, Prefs.DO_NOT_DISTURB_DEFAULT);
+
+ mCheckBox = checkbox;
+ checkbox.setOnCheckedChangeListener(this);
+
+ checkbox.setChecked(!mDoNotDisturb);
+ }
+
+ // The checkbox is ON for notifications coming in and OFF for Do not disturb, so we
+ // don't have a double negative.
+ public void onCheckedChanged(CompoundButton view, boolean checked) {
+ //Slog.d(TAG, "onCheckedChanged checked=" + checked + " mDoNotDisturb=" + mDoNotDisturb);
+ final boolean value = !checked;
+ if (value != mDoNotDisturb) {
+ SharedPreferences.Editor editor = Prefs.edit(mContext);
+ editor.putBoolean(Prefs.DO_NOT_DISTURB_PREF, value);
+ editor.apply();
+ }
+ }
+
+ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+ final boolean val = prefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF,
+ Prefs.DO_NOT_DISTURB_DEFAULT);
+ if (val != mDoNotDisturb) {
+ mDoNotDisturb = val;
+ mCheckBox.setChecked(!val);
+ }
+ }
+
+ public void release() {
+ mPrefs.unregisterOnSharedPreferenceChangeListener(this);
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FixedSizeDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java
index eb22b61..8f2f5f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/FixedSizeDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.policy;
import android.graphics.drawable.Drawable;
import android.graphics.Canvas;
@@ -22,14 +22,14 @@ import android.graphics.ColorFilter;
import android.graphics.Rect;
import android.util.Slog;
-class FixedSizeDrawable extends Drawable {
+public class FixedSizeDrawable extends Drawable {
Drawable mDrawable;
int mLeft;
int mTop;
int mRight;
int mBottom;
- FixedSizeDrawable(Drawable that) {
+ public FixedSizeDrawable(Drawable that) {
mDrawable = that;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
new file mode 100644
index 0000000..5374957
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -0,0 +1,147 @@
+/*
+ * 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.policy;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.ServiceManager;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.view.HapticFeedbackConstants;
+import android.view.IWindowManager;
+import android.view.InputDevice;
+import android.view.KeyCharacterMap;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.ViewConfiguration;
+import android.widget.ImageView;
+import android.widget.RemoteViews.RemoteView;
+
+import com.android.systemui.R;
+
+public class KeyButtonView extends ImageView {
+ private static final String TAG = "StatusBar.KeyButtonView";
+
+ IWindowManager mWindowManager;
+ long mDownTime;
+ boolean mSending, mLongPressed;
+ int mCode;
+ int mRepeat;
+ Runnable mCheckLongPress = new Runnable() {
+ public void run() {
+ Slog.d("KeyButtonView", "longpress");
+ if (isPressed()) {
+ mLongPressed = true;
+ mRepeat++;
+ sendEvent(KeyEvent.ACTION_DOWN,
+ KeyEvent.FLAG_FROM_SYSTEM
+ | KeyEvent.FLAG_VIRTUAL_HARD_KEY
+ | KeyEvent.FLAG_LONG_PRESS);
+ }
+ }
+ };
+
+ public KeyButtonView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public KeyButtonView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.KeyButtonView,
+ defStyle, 0);
+
+ mCode = a.getInteger(R.styleable.KeyButtonView_keyCode, 0);
+ if (mCode == 0) {
+ Slog.w(TAG, "KeyButtonView without key code id=0x" + Integer.toHexString(getId()));
+ }
+
+ a.recycle();
+
+ mWindowManager = IWindowManager.Stub.asInterface(
+ ServiceManager.getService(Context.WINDOW_SERVICE));
+ }
+
+ public boolean onTouchEvent(MotionEvent ev) {
+ final int action = ev.getAction();
+ int x, y;
+
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ //Slog.d("KeyButtonView", "press");
+ mDownTime = SystemClock.uptimeMillis();
+ mRepeat = 0;
+ mSending = true;
+ mLongPressed = false;
+ sendEvent(KeyEvent.ACTION_DOWN,
+ KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY, mDownTime);
+ setPressed(true);
+ removeCallbacks(mCheckLongPress);
+ postDelayed(mCheckLongPress, ViewConfiguration.getLongPressTimeout());
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (mSending) {
+ x = (int)ev.getX();
+ y = (int)ev.getY();
+ setPressed(x >= 0 && x < getWidth() && y >= 0 && y < getHeight());
+ }
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ setPressed(false);
+ if (mSending && !mLongPressed) {
+ mSending = false;
+ sendEvent(KeyEvent.ACTION_UP,
+ KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY
+ | KeyEvent.FLAG_CANCELED);
+ removeCallbacks(mCheckLongPress);
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ setPressed(false);
+ if (mSending && !mLongPressed) {
+ mSending = false;
+ sendEvent(KeyEvent.ACTION_UP,
+ KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY);
+ removeCallbacks(mCheckLongPress);
+ }
+ break;
+ }
+
+ return true;
+ }
+
+ void sendEvent(int action, int flags) {
+ sendEvent(action, flags, SystemClock.uptimeMillis());
+ }
+
+ void sendEvent(int action, int flags, long when) {
+ final KeyEvent ev = new KeyEvent(mDownTime, when, action, mCode, mRepeat,
+ 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, flags, InputDevice.SOURCE_KEYBOARD);
+ try {
+ //Slog.d(TAG, "injecting event " + ev);
+ mWindowManager.injectInputEventNoWait(ev);
+ } catch (RemoteException ex) {
+ // System process is dead
+ }
+ }
+}
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
new file mode 100644
index 0000000..ec23a3d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -0,0 +1,711 @@
+/*
+ * Copyright (C) 2010 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.policy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.wifi.SupplicantState;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.provider.Settings;
+import android.telephony.PhoneStateListener;
+import android.telephony.ServiceState;
+import android.telephony.SignalStrength;
+import android.telephony.TelephonyManager;
+import android.util.Slog;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.internal.app.IBatteryStats;
+import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.cdma.EriInfo;
+import com.android.server.am.BatteryStatsService;
+
+import com.android.systemui.R;
+
+public class NetworkController extends BroadcastReceiver {
+ // debug
+ static final String TAG = "StatusBar.NetworkController";
+ static final boolean DEBUG = false;
+
+ // telephony
+ boolean mHspaDataDistinguishable;
+ final TelephonyManager mPhone;
+ boolean mDataConnected;
+ IccCard.State mSimState = IccCard.State.READY;
+ int mPhoneState = TelephonyManager.CALL_STATE_IDLE;
+ int mDataState = TelephonyManager.DATA_DISCONNECTED;
+ int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE;
+ ServiceState mServiceState;
+ SignalStrength mSignalStrength;
+ int[] mDataIconList = TelephonyIcons.DATA_G[0];
+ int mPhoneSignalIconId;
+ int mDataDirectionIconId;
+ int mDataSignalIconId;
+ int mDataTypeIconId;
+
+ // wifi
+ final WifiManager mWifiManager;
+ boolean mWifiEnabled, mWifiConnected;
+ int mWifiLevel;
+ String mWifiSsid;
+ int mWifiIconId;
+
+ // data connectivity (regardless of state, can we access the internet?)
+ // state of inet connection - 0 not connected, 100 connected
+ private int mInetCondition = 0;
+ private static final int INET_CONDITION_THRESHOLD = 50;
+
+ // our ui
+ Context mContext;
+ ArrayList<ImageView> mPhoneSignalIconViews = new ArrayList<ImageView>();
+ ArrayList<ImageView> mDataDirectionIconViews = new ArrayList<ImageView>();
+ ArrayList<ImageView> mWifiIconViews = new ArrayList<ImageView>();
+ ArrayList<ImageView> mCombinedSignalIconViews = new ArrayList<ImageView>();
+ ArrayList<ImageView> mDataTypeIconViews = new ArrayList<ImageView>();
+ ArrayList<TextView> mLabelViews = new ArrayList<TextView>();
+ int mLastPhoneSignalIconId = -1;
+ int mLastDataDirectionIconId = -1;
+ int mLastWifiIconId = -1;
+ int mLastCombinedSignalIconId = -1;
+ int mLastDataTypeIconId = -1;
+ String mLastLabel = "";
+
+ // yuck -- stop doing this here and put it in the framework
+ IBatteryStats mBatteryStats;
+
+ /**
+ * Construct this controller object and register for updates.
+ */
+ public NetworkController(Context context) {
+ mContext = context;
+
+ // telephony
+ mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
+ mPhone.listen(mPhoneStateListener,
+ PhoneStateListener.LISTEN_SERVICE_STATE
+ | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
+ | PhoneStateListener.LISTEN_CALL_STATE
+ | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
+ | PhoneStateListener.LISTEN_DATA_ACTIVITY);
+ mHspaDataDistinguishable = mContext.getResources().getBoolean(
+ R.bool.config_hspa_data_distinguishable);
+
+
+ // wifi
+ mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+
+ // broadcasts
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+ filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
+ context.registerReceiver(this, filter);
+
+ // yuck
+ mBatteryStats = BatteryStatsService.getService();
+ }
+
+ public void addPhoneSignalIconView(ImageView v) {
+ mPhoneSignalIconViews.add(v);
+ }
+
+ public void addDataDirectionIconView(ImageView v) {
+ mDataDirectionIconViews.add(v);
+ }
+
+ public void addWifiIconView(ImageView v) {
+ mWifiIconViews.add(v);
+ }
+
+ public void addCombinedSignalIconView(ImageView v) {
+ mCombinedSignalIconViews.add(v);
+ }
+
+ public void addDataTypeIconView(ImageView v) {
+ mDataTypeIconViews.add(v);
+ }
+
+ public void addLabelView(TextView v) {
+ mLabelViews.add(v);
+ }
+
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (action.equals(WifiManager.RSSI_CHANGED_ACTION)
+ || action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)
+ || action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+ updateWifiState(intent);
+ refreshViews();
+ } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
+ updateSimState(intent);
+ updateDataIcon();
+ refreshViews();
+ } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) ||
+ action.equals(ConnectivityManager.INET_CONDITION_ACTION)) {
+ updateConnectivity(intent);
+ refreshViews();
+ }
+ }
+
+
+ // ===== Telephony ==============================================================
+
+ PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+ @Override
+ public void onSignalStrengthsChanged(SignalStrength signalStrength) {
+ if (DEBUG) {
+ Slog.d(TAG, "onSignalStrengthsChanged signalStrength=" + signalStrength);
+ }
+ mSignalStrength = signalStrength;
+ updateTelephonySignalStrength();
+ refreshViews();
+ }
+
+ @Override
+ public void onServiceStateChanged(ServiceState state) {
+ if (DEBUG) {
+ Slog.d(TAG, "onServiceStateChanged state=" + state.getState());
+ }
+ mServiceState = state;
+ updateTelephonySignalStrength();
+ updateDataIcon();
+ refreshViews();
+ }
+
+ @Override
+ public void onCallStateChanged(int state, String incomingNumber) {
+ if (DEBUG) {
+ Slog.d(TAG, "onCallStateChanged state=" + state);
+ }
+ // In cdma, if a voice call is made, RSSI should switch to 1x.
+ if (isCdma()) {
+ updateTelephonySignalStrength();
+ refreshViews();
+ }
+ }
+
+ @Override
+ public void onDataConnectionStateChanged(int state, int networkType) {
+ if (DEBUG) {
+ Slog.d(TAG, "onDataConnectionStateChanged: state=" + state
+ + " type=" + networkType);
+ }
+ mDataState = state;
+ updateDataNetType(networkType);
+ updateDataIcon();
+ refreshViews();
+ }
+
+ @Override
+ public void onDataActivity(int direction) {
+ if (DEBUG) {
+ Slog.d(TAG, "onDataActivity: direction=" + direction);
+ }
+ mDataActivity = direction;
+ updateDataIcon();
+ refreshViews();
+ }
+ };
+
+ private final void updateSimState(Intent intent) {
+ String stateExtra = intent.getStringExtra(IccCard.INTENT_KEY_ICC_STATE);
+ if (IccCard.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
+ mSimState = IccCard.State.ABSENT;
+ }
+ else if (IccCard.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
+ mSimState = IccCard.State.READY;
+ }
+ else if (IccCard.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
+ final String lockedReason = intent.getStringExtra(IccCard.INTENT_KEY_LOCKED_REASON);
+ if (IccCard.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
+ mSimState = IccCard.State.PIN_REQUIRED;
+ }
+ else if (IccCard.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
+ mSimState = IccCard.State.PUK_REQUIRED;
+ }
+ else {
+ mSimState = IccCard.State.NETWORK_LOCKED;
+ }
+ } else {
+ mSimState = IccCard.State.UNKNOWN;
+ }
+ }
+
+ private boolean isCdma() {
+ return (mSignalStrength != null) && !mSignalStrength.isGsm();
+ }
+
+ private boolean isEvdo() {
+ return ((mServiceState != null)
+ && ((mServiceState.getRadioTechnology() == ServiceState.RADIO_TECHNOLOGY_EVDO_0)
+ || (mServiceState.getRadioTechnology() == ServiceState.RADIO_TECHNOLOGY_EVDO_A)
+ || (mServiceState.getRadioTechnology() == ServiceState.RADIO_TECHNOLOGY_EVDO_B)));
+ }
+
+ private boolean hasService() {
+ if (mServiceState != null) {
+ switch (mServiceState.getState()) {
+ case ServiceState.STATE_OUT_OF_SERVICE:
+ case ServiceState.STATE_POWER_OFF:
+ return false;
+ default:
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ private int getCdmaLevel() {
+ if (mSignalStrength == null) return 0;
+ final int cdmaDbm = mSignalStrength.getCdmaDbm();
+ final int cdmaEcio = mSignalStrength.getCdmaEcio();
+ int levelDbm = 0;
+ int levelEcio = 0;
+
+ if (cdmaDbm >= -75) levelDbm = 4;
+ else if (cdmaDbm >= -85) levelDbm = 3;
+ else if (cdmaDbm >= -95) levelDbm = 2;
+ else if (cdmaDbm >= -100) levelDbm = 1;
+ else levelDbm = 0;
+
+ // Ec/Io are in dB*10
+ if (cdmaEcio >= -90) levelEcio = 4;
+ else if (cdmaEcio >= -110) levelEcio = 3;
+ else if (cdmaEcio >= -130) levelEcio = 2;
+ else if (cdmaEcio >= -150) levelEcio = 1;
+ else levelEcio = 0;
+
+ return (levelDbm < levelEcio) ? levelDbm : levelEcio;
+ }
+
+ private int getEvdoLevel() {
+ if (mSignalStrength == null) return 0;
+ int evdoDbm = mSignalStrength.getEvdoDbm();
+ int evdoSnr = mSignalStrength.getEvdoSnr();
+ int levelEvdoDbm = 0;
+ int levelEvdoSnr = 0;
+
+ if (evdoDbm >= -65) levelEvdoDbm = 4;
+ else if (evdoDbm >= -75) levelEvdoDbm = 3;
+ else if (evdoDbm >= -90) levelEvdoDbm = 2;
+ else if (evdoDbm >= -105) levelEvdoDbm = 1;
+ else levelEvdoDbm = 0;
+
+ if (evdoSnr >= 7) levelEvdoSnr = 4;
+ else if (evdoSnr >= 5) levelEvdoSnr = 3;
+ else if (evdoSnr >= 3) levelEvdoSnr = 2;
+ else if (evdoSnr >= 1) levelEvdoSnr = 1;
+ else levelEvdoSnr = 0;
+
+ return (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
+ }
+
+ private final void updateTelephonySignalStrength() {
+ // Display signal strength while in "emergency calls only" mode
+ if (mServiceState == null || (!hasService() && !mServiceState.isEmergencyOnly())) {
+ //Slog.d(TAG, "updateTelephonySignalStrength: no service");
+ if (Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.AIRPLANE_MODE_ON, 0) == 1) {
+ mPhoneSignalIconId = R.drawable.stat_sys_signal_flightmode;
+ mDataSignalIconId = R.drawable.stat_sys_signal_flightmode;
+ } else {
+ mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
+ mDataSignalIconId = R.drawable.stat_sys_signal_0; // note we use 0 instead of null
+ }
+ } else {
+ if (mSignalStrength == null) {
+ mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
+ mDataSignalIconId = R.drawable.stat_sys_signal_0; // note we use 0 instead of null
+ } else if (isCdma()) {
+ // If 3G(EV) and 1x network are available than 3G should be
+ // displayed, displayed RSSI should be from the EV side.
+ // If a voice call is made then RSSI should switch to 1x.
+ int iconLevel;
+ if ((mPhoneState == TelephonyManager.CALL_STATE_IDLE) && isEvdo()){
+ iconLevel = getEvdoLevel();
+ } else {
+ iconLevel = getCdmaLevel();
+ }
+ int[] iconList;
+ if (isCdmaEri()) {
+ iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition];
+ } else {
+ iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition];
+ }
+ mPhoneSignalIconId = iconList[iconLevel];
+ mDataSignalIconId = TelephonyIcons.DATA_SIGNAL_STRENGTH[mInetCondition][iconLevel];
+ } else {
+ int asu = mSignalStrength.getGsmSignalStrength();
+
+ // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
+ // asu = 0 (-113dB or less) is very weak
+ // signal, its better to show 0 bars to the user in such cases.
+ // asu = 99 is a special case, where the signal strength is unknown.
+ int iconLevel;
+ if (asu <= 2 || asu == 99) iconLevel = 0;
+ else if (asu >= 12) iconLevel = 4;
+ else if (asu >= 8) iconLevel = 3;
+ else if (asu >= 5) iconLevel = 2;
+ else iconLevel = 1;
+
+ // Though mPhone is a Manager, this call is not an IPC
+ int[] iconList;
+ if (mPhone.isNetworkRoaming()) {
+ iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition];
+ } else {
+ iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition];
+ }
+ mPhoneSignalIconId = iconList[iconLevel];
+ mDataSignalIconId = TelephonyIcons.DATA_SIGNAL_STRENGTH[mInetCondition][iconLevel];
+ }
+ }
+ }
+
+ private final void updateDataNetType(int net) {
+ switch (net) {
+ case TelephonyManager.NETWORK_TYPE_EDGE:
+ mDataIconList = TelephonyIcons.DATA_E[mInetCondition];
+ mDataTypeIconId = R.drawable.stat_sys_signal_edge;
+ break;
+ case TelephonyManager.NETWORK_TYPE_UMTS:
+ mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
+ mDataTypeIconId = R.drawable.stat_sys_signal_3g;
+ break;
+ case TelephonyManager.NETWORK_TYPE_HSDPA:
+ case TelephonyManager.NETWORK_TYPE_HSUPA:
+ case TelephonyManager.NETWORK_TYPE_HSPA:
+ if (mHspaDataDistinguishable) {
+ mDataIconList = TelephonyIcons.DATA_H[mInetCondition];
+ mDataTypeIconId = R.drawable.stat_sys_signal_hsdpa;
+ } else {
+ mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
+ mDataTypeIconId = R.drawable.stat_sys_signal_3g;
+ }
+ break;
+ case TelephonyManager.NETWORK_TYPE_CDMA:
+ // display 1xRTT for IS95A/B
+ mDataIconList = TelephonyIcons.DATA_1X[mInetCondition];
+ mDataTypeIconId = R.drawable.stat_sys_signal_1x;
+ break;
+ case TelephonyManager.NETWORK_TYPE_1xRTT:
+ mDataIconList = TelephonyIcons.DATA_1X[mInetCondition];
+ mDataTypeIconId = R.drawable.stat_sys_signal_1x;
+ break;
+ case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
+ case TelephonyManager.NETWORK_TYPE_EVDO_A:
+ case TelephonyManager.NETWORK_TYPE_EVDO_B:
+ mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
+ mDataTypeIconId = R.drawable.stat_sys_signal_3g;
+ break;
+ // TODO - add support for NETWORK_TYPE_LTE and NETWORK_TYPE_EHRPD
+ default:
+ mDataIconList = TelephonyIcons.DATA_G[mInetCondition];
+ mDataTypeIconId = R.drawable.stat_sys_signal_gprs;
+ break;
+ }
+ if ((isCdma() && isCdmaEri()) || mPhone.isNetworkRoaming()) {
+ mDataTypeIconId = R.drawable.stat_sys_signal_roam;
+ }
+ }
+
+ boolean isCdmaEri() {
+ final int iconIndex = mServiceState.getCdmaEriIconIndex();
+ if (iconIndex != EriInfo.ROAMING_INDICATOR_OFF) {
+ final int iconMode = mServiceState.getCdmaEriIconMode();
+ if (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL
+ || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private final void updateDataIcon() {
+ int iconId;
+ boolean visible = true;
+
+ if (!isCdma()) {
+ // GSM case, we have to check also the sim state
+ if (mSimState == IccCard.State.READY || mSimState == IccCard.State.UNKNOWN) {
+ if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
+ switch (mDataActivity) {
+ case TelephonyManager.DATA_ACTIVITY_IN:
+ iconId = mDataIconList[1];
+ break;
+ case TelephonyManager.DATA_ACTIVITY_OUT:
+ iconId = mDataIconList[2];
+ break;
+ case TelephonyManager.DATA_ACTIVITY_INOUT:
+ iconId = mDataIconList[3];
+ break;
+ default:
+ iconId = mDataIconList[0];
+ break;
+ }
+ mDataDirectionIconId = iconId;
+ } else {
+ iconId = 0;
+ visible = false;
+ }
+ } else {
+ iconId = R.drawable.stat_sys_no_sim;
+ }
+ } else {
+ // CDMA case, mDataActivity can be also DATA_ACTIVITY_DORMANT
+ if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
+ switch (mDataActivity) {
+ case TelephonyManager.DATA_ACTIVITY_IN:
+ iconId = mDataIconList[1];
+ break;
+ case TelephonyManager.DATA_ACTIVITY_OUT:
+ iconId = mDataIconList[2];
+ break;
+ case TelephonyManager.DATA_ACTIVITY_INOUT:
+ iconId = mDataIconList[3];
+ break;
+ case TelephonyManager.DATA_ACTIVITY_DORMANT:
+ default:
+ iconId = mDataIconList[0];
+ break;
+ }
+ } else {
+ iconId = 0;
+ visible = false;
+ }
+ }
+
+ // yuck - this should NOT be done by the status bar
+ long ident = Binder.clearCallingIdentity();
+ try {
+ mBatteryStats.notePhoneDataConnectionState(mPhone.getNetworkType(), visible);
+ } catch (RemoteException e) {
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+
+ mDataDirectionIconId = iconId;
+ mDataConnected = visible;
+ }
+
+ // ===== Wifi ===================================================================
+
+ private void updateWifiState(Intent intent) {
+ final String action = intent.getAction();
+ if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
+ mWifiEnabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
+ WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
+
+ } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+ final NetworkInfo networkInfo = (NetworkInfo)
+ intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
+ boolean wasConnected = mWifiConnected;
+ mWifiConnected = networkInfo != null && networkInfo.isConnected();
+ // If we just connected, grab the inintial signal strength and ssid
+ if (mWifiConnected && !wasConnected) {
+ WifiInfo info = mWifiManager.getConnectionInfo();
+ if (info != null) {
+ mWifiLevel = WifiManager.calculateSignalLevel(info.getRssi(),
+ WifiIcons.WIFI_LEVEL_COUNT);
+ mWifiSsid = huntForSsid(info);
+ } else {
+ mWifiLevel = 0;
+ mWifiSsid = null;
+ }
+ } else if (!mWifiConnected) {
+ mWifiLevel = 0;
+ mWifiSsid = null;
+ }
+
+ } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
+ if (mWifiConnected) {
+ final int newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
+ mWifiLevel = WifiManager.calculateSignalLevel(newRssi, WifiIcons.WIFI_LEVEL_COUNT);
+ }
+ }
+
+ updateWifiIcons();
+ }
+
+ private void updateWifiIcons() {
+ if (mWifiConnected) {
+ mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel];
+ } else {
+ mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[0][0];
+ }
+ }
+
+ private String huntForSsid(WifiInfo info) {
+ String ssid = info.getSSID();
+ if (ssid != null) {
+ return ssid;
+ }
+ // OK, it's not in the connectionInfo; we have to go hunting for it
+ List<WifiConfiguration> networks = mWifiManager.getConfiguredNetworks();
+ for (WifiConfiguration net : networks) {
+ if (net.networkId == info.getNetworkId()) {
+ return net.SSID;
+ }
+ }
+ return null;
+ }
+
+
+ // ===== Full or limited Internet connectivity ==================================
+
+ private void updateConnectivity(Intent intent) {
+ NetworkInfo info = (NetworkInfo)(intent.getParcelableExtra(
+ ConnectivityManager.EXTRA_NETWORK_INFO));
+ int connectionStatus = intent.getIntExtra(ConnectivityManager.EXTRA_INET_CONDITION, 0);
+
+ int inetCondition = (connectionStatus > INET_CONDITION_THRESHOLD ? 1 : 0);
+
+ switch (info.getType()) {
+ case ConnectivityManager.TYPE_MOBILE:
+ mInetCondition = inetCondition;
+ updateDataNetType(info.getSubtype());
+ updateDataIcon();
+ updateTelephonySignalStrength(); // apply any change in connectionStatus
+ break;
+ case ConnectivityManager.TYPE_WIFI:
+ mInetCondition = inetCondition;
+ updateWifiIcons();
+ break;
+ }
+ }
+
+
+ // ===== Update the views =======================================================
+
+ // figure out what to show: first wifi, then 3G, then nothing
+ void refreshViews() {
+ Context context = mContext;
+
+ int combinedSignalIconId;
+ int dataTypeIconId;
+ String label;
+ int N;
+
+ if (mWifiConnected) {
+ if (mWifiSsid == null) {
+ label = context.getString(R.string.status_bar_settings_signal_meter_wifi_nossid);
+ } else {
+ label = context.getString(R.string.status_bar_settings_signal_meter_wifi_ssid_format,
+ mWifiSsid);
+ }
+ combinedSignalIconId = mWifiIconId;
+ dataTypeIconId = 0;
+ } else {
+ if (mDataConnected) {
+ label = context.getString(R.string.status_bar_settings_signal_meter_data_connected);
+ } else {
+ label = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
+ }
+ combinedSignalIconId = mDataSignalIconId;
+ dataTypeIconId = mDataTypeIconId;
+ }
+
+ if (false) {
+ Slog.d(TAG, "refreshViews combinedSignalIconId=0x"
+ + Integer.toHexString(mPhoneSignalIconId)
+ + " mPhoneSignalIconId=0x" + Integer.toHexString(mPhoneSignalIconId)
+ + " mDataDirectionIconId=0x" + Integer.toHexString(mDataDirectionIconId)
+ + " mDataSignalIconId=0x" + Integer.toHexString(mDataSignalIconId)
+ + " mDataTypeIconId=0x" + Integer.toHexString(mDataTypeIconId)
+ + " mWifiIconId=0x" + Integer.toHexString(mWifiIconId));
+ }
+
+ // the phone icon on phones
+ if (mLastPhoneSignalIconId != mPhoneSignalIconId) {
+ mLastPhoneSignalIconId = mPhoneSignalIconId;
+ N = mPhoneSignalIconViews.size();
+ for (int i=0; i<N; i++) {
+ final ImageView v = mPhoneSignalIconViews.get(i);
+ v.setImageResource(mPhoneSignalIconId);
+ }
+ }
+
+ // the data icon on phones
+ if (mLastDataDirectionIconId != mDataDirectionIconId) {
+ mLastDataDirectionIconId = mDataDirectionIconId;
+ N = mDataDirectionIconViews.size();
+ for (int i=0; i<N; i++) {
+ final ImageView v = mDataDirectionIconViews.get(i);
+ v.setImageResource(mDataDirectionIconId);
+ }
+ }
+
+ // the wifi icon on phones
+ if (mLastWifiIconId != mWifiIconId) {
+ mLastWifiIconId = mWifiIconId;
+ N = mWifiIconViews.size();
+ for (int i=0; i<N; i++) {
+ final ImageView v = mWifiIconViews.get(i);
+ v.setImageResource(mWifiIconId);
+ }
+ }
+
+ // the combined data signal icon
+ if (mLastCombinedSignalIconId != combinedSignalIconId) {
+ mLastCombinedSignalIconId = combinedSignalIconId;
+ N = mCombinedSignalIconViews.size();
+ for (int i=0; i<N; i++) {
+ final ImageView v = mCombinedSignalIconViews.get(i);
+ v.setImageResource(combinedSignalIconId);
+ }
+ }
+
+ // the data network type overlay
+ if (mLastDataTypeIconId != dataTypeIconId) {
+ mLastDataTypeIconId = dataTypeIconId;
+ N = mDataTypeIconViews.size();
+ for (int i=0; i<N; i++) {
+ final ImageView v = mDataTypeIconViews.get(i);
+ if (dataTypeIconId == 0) {
+ v.setVisibility(View.INVISIBLE);
+ } else {
+ v.setVisibility(View.VISIBLE);
+ v.setImageResource(dataTypeIconId);
+ }
+ }
+ }
+
+ // the label in the notification panel
+ if (!mLastLabel.equals(label)) {
+ mLastLabel = label;
+ N = mLabelViews.size();
+ for (int i=0; i<N; i++) {
+ TextView v = mLabelViews.get(i);
+ v.setText(label);
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
new file mode 100644
index 0000000..05eafe8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 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.policy;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+public class Prefs {
+ private static final String SHARED_PREFS_NAME = "status_bar";
+
+ // a boolean
+ public static final String DO_NOT_DISTURB_PREF = "do_not_disturb";
+ public static final boolean DO_NOT_DISTURB_DEFAULT = false;
+
+ public static SharedPreferences read(Context context) {
+ return context.getSharedPreferences(Prefs.SHARED_PREFS_NAME, Context.MODE_PRIVATE);
+ }
+
+ public static SharedPreferences.Editor edit(Context context) {
+ return context.getSharedPreferences(Prefs.SHARED_PREFS_NAME, Context.MODE_PRIVATE).edit();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
new file mode 100644
index 0000000..94c68ac
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -0,0 +1,115 @@
+/*
+ * 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.policy;
+
+import com.android.systemui.R;
+
+class TelephonyIcons {
+ //***** Signal strength icons
+
+ //GSM/UMTS
+ static final int[][] TELEPHONY_SIGNAL_STRENGTH = {
+ { R.drawable.stat_sys_signal_0,
+ R.drawable.stat_sys_signal_1,
+ R.drawable.stat_sys_signal_2,
+ R.drawable.stat_sys_signal_3,
+ R.drawable.stat_sys_signal_4 },
+ { R.drawable.stat_sys_signal_0_fully,
+ R.drawable.stat_sys_signal_1_fully,
+ R.drawable.stat_sys_signal_2_fully,
+ R.drawable.stat_sys_signal_3_fully,
+ R.drawable.stat_sys_signal_4_fully }
+ };
+
+ static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING = {
+ { R.drawable.stat_sys_r_signal_0,
+ R.drawable.stat_sys_r_signal_1,
+ R.drawable.stat_sys_r_signal_2,
+ R.drawable.stat_sys_r_signal_3,
+ R.drawable.stat_sys_r_signal_4 },
+ { R.drawable.stat_sys_r_signal_0_fully,
+ R.drawable.stat_sys_r_signal_1_fully,
+ R.drawable.stat_sys_r_signal_2_fully,
+ R.drawable.stat_sys_r_signal_3_fully,
+ R.drawable.stat_sys_r_signal_4_fully }
+ };
+
+ static final int[][] DATA_SIGNAL_STRENGTH = TELEPHONY_SIGNAL_STRENGTH;
+
+ //***** Data connection icons
+
+ //GSM/UMTS
+ static final int[][] DATA_G = {
+ { R.drawable.stat_sys_data_connected_g,
+ R.drawable.stat_sys_data_in_g,
+ R.drawable.stat_sys_data_out_g,
+ R.drawable.stat_sys_data_inandout_g },
+ { R.drawable.stat_sys_data_fully_connected_g,
+ R.drawable.stat_sys_data_fully_in_g,
+ R.drawable.stat_sys_data_fully_out_g,
+ R.drawable.stat_sys_data_fully_inandout_g }
+ };
+
+ static final int[][] DATA_3G = {
+ { R.drawable.stat_sys_data_connected_3g,
+ R.drawable.stat_sys_data_in_3g,
+ R.drawable.stat_sys_data_out_3g,
+ R.drawable.stat_sys_data_inandout_3g },
+ { R.drawable.stat_sys_data_fully_connected_3g,
+ R.drawable.stat_sys_data_fully_in_3g,
+ R.drawable.stat_sys_data_fully_out_3g,
+ R.drawable.stat_sys_data_fully_inandout_3g }
+ };
+
+ static final int[][] DATA_E = {
+ { R.drawable.stat_sys_data_connected_e,
+ R.drawable.stat_sys_data_in_e,
+ R.drawable.stat_sys_data_out_e,
+ R.drawable.stat_sys_data_inandout_e },
+ { R.drawable.stat_sys_data_fully_connected_e,
+ R.drawable.stat_sys_data_fully_in_e,
+ R.drawable.stat_sys_data_fully_out_e,
+ R.drawable.stat_sys_data_fully_inandout_e }
+ };
+
+ //3.5G
+ static final int[][] DATA_H = {
+ { R.drawable.stat_sys_data_connected_h,
+ R.drawable.stat_sys_data_in_h,
+ R.drawable.stat_sys_data_out_h,
+ R.drawable.stat_sys_data_inandout_h },
+ { R.drawable.stat_sys_data_fully_connected_h,
+ R.drawable.stat_sys_data_fully_in_h,
+ R.drawable.stat_sys_data_fully_out_h,
+ R.drawable.stat_sys_data_fully_inandout_h }
+ };
+
+ //CDMA
+ // Use 3G icons for EVDO data and 1x icons for 1XRTT data
+ static final int[][] DATA_1X = {
+ { R.drawable.stat_sys_data_connected_1x,
+ R.drawable.stat_sys_data_in_1x,
+ R.drawable.stat_sys_data_out_1x,
+ R.drawable.stat_sys_data_inandout_1x },
+ { R.drawable.stat_sys_data_fully_connected_1x,
+ R.drawable.stat_sys_data_fully_in_1x,
+ R.drawable.stat_sys_data_fully_out_1x,
+ R.drawable.stat_sys_data_fully_inandout_1x }
+ };
+
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
new file mode 100644
index 0000000..0787289
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
@@ -0,0 +1,34 @@
+/*
+ * 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.policy;
+
+import com.android.systemui.R;
+
+class WifiIcons {
+ static final int[][] WIFI_SIGNAL_STRENGTH = {
+ { R.drawable.stat_sys_wifi_signal_1,
+ R.drawable.stat_sys_wifi_signal_2,
+ R.drawable.stat_sys_wifi_signal_3,
+ R.drawable.stat_sys_wifi_signal_4 },
+ { R.drawable.stat_sys_wifi_signal_1_fully,
+ R.drawable.stat_sys_wifi_signal_2_fully,
+ R.drawable.stat_sys_wifi_signal_3_fully,
+ R.drawable.stat_sys_wifi_signal_4_fully }
+ };
+
+ static final int WIFI_LEVEL_COUNT = WIFI_SIGNAL_STRENGTH[0].length;
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java
new file mode 100644
index 0000000..3b76434
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.android.systemui.statusbar.tablet;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.AssetManager;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
+import android.text.format.DateFormat;
+import android.text.style.CharacterStyle;
+import android.text.style.ForegroundColorSpan;
+import android.text.style.RelativeSizeSpan;
+import android.text.style.RelativeSizeSpan;
+import android.text.style.StyleSpan;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+import com.android.systemui.R;
+
+public class HoloClock extends FrameLayout {
+ private boolean mAttached;
+ private Calendar mCalendar;
+ private String mClockFormatString;
+ private SimpleDateFormat mClockFormat;
+
+ private static Typeface sBackgroundType, sForegroundType;
+ private TextView mBgText, mFgText;
+
+ public HoloClock(Context context) {
+ this(context, null);
+ }
+
+ public HoloClock(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public HoloClock(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ if (sBackgroundType == null) {
+ AssetManager assets = getContext().getAssets();
+
+ sBackgroundType = Typeface.createFromAsset(assets,
+ "fonts/AndroidClock.ttf");
+ sForegroundType = Typeface.createFromAsset(assets,
+ "fonts/AndroidClock2.ttf");
+ }
+ mBgText = (TextView) findViewById(R.id.time_bg);
+ if (mBgText != null) {
+ mBgText.setTypeface(sBackgroundType);
+ }
+ mFgText = (TextView) findViewById(R.id.time_fg);
+ if (mFgText != null) {
+ mFgText.setTypeface(sForegroundType);
+ }
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ if (!mAttached) {
+ mAttached = true;
+ IntentFilter filter = new IntentFilter();
+
+ filter.addAction(Intent.ACTION_TIME_TICK);
+ filter.addAction(Intent.ACTION_TIME_CHANGED);
+ filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+ filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+
+ getContext().registerReceiver(mIntentReceiver, filter, null, getHandler());
+ }
+
+ // NOTE: It's safe to do these after registering the receiver since the receiver always runs
+ // in the main thread, therefore the receiver can't run before this method returns.
+
+ // The time zone may have changed while the receiver wasn't registered, so update the Time
+ mCalendar = Calendar.getInstance(TimeZone.getDefault());
+
+ // Make sure we update to the current time
+ updateClock();
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ if (mAttached) {
+ getContext().unregisterReceiver(mIntentReceiver);
+ mAttached = false;
+ }
+ }
+
+ private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
+ String tz = intent.getStringExtra("time-zone");
+ mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz));
+ if (mClockFormat != null) {
+ mClockFormat.setTimeZone(mCalendar.getTimeZone());
+ }
+ }
+ updateClock();
+ }
+ };
+
+ final void updateClock() {
+ mCalendar.setTimeInMillis(System.currentTimeMillis());
+ CharSequence txt = getTimeText();
+ mBgText.setText(txt);
+ mFgText.setText(txt);
+ }
+
+ private final CharSequence getTimeText() {
+ Context context = getContext();
+ int res = DateFormat.is24HourFormat(context)
+ ? com.android.internal.R.string.twenty_four_hour_time_format
+ : com.android.internal.R.string.twelve_hour_time_format;
+
+ SimpleDateFormat sdf;
+ String format = context.getString(res);
+ if (!format.equals(mClockFormatString)) {
+ // we don't want AM/PM showing up in our statusbar, even in 12h mode
+ format = format.replaceAll("a", "").trim();
+ mClockFormat = sdf = new SimpleDateFormat(format);
+ mClockFormatString = format;
+ } else {
+ sdf = mClockFormat;
+ }
+ String result = sdf.format(mCalendar.getTime());
+ return result;
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
new file mode 100644
index 0000000..7e03e2a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.IBinder;
+import android.provider.Settings;
+import android.util.Log;
+import android.util.Slog;
+import android.util.AttributeSet;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.android.server.InputMethodManagerService;
+import com.android.systemui.R;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class InputMethodButton extends ImageView {
+
+ private static final String TAG = "StatusBar/InputMethodButton";
+ private static final boolean DEBUG = false;
+
+ private static final int ID_IME_SWITCH_BUTTON = R.id.imeSwitchButton;
+ private static final int ID_IME_SHORTCUT_BUTTON = R.id.imeShortcutButton;
+
+ // other services we wish to talk to
+ private final InputMethodManager mImm;
+ private final int mId;
+ // Cache of InputMethodsInfo
+ private final HashMap<String, InputMethodInfo> mInputMethodsInfo =
+ new HashMap<String, InputMethodInfo>();
+ private ImageView mIcon;
+ private IBinder mToken;
+ private boolean mKeyboardShown;
+ private InputMethodInfo mShortcutInfo;
+ private InputMethodSubtype mShortcutSubtype;
+
+ public InputMethodButton(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ mKeyboardShown = false;
+ // Resource Id of the input method button. This id is defined in status_bar.xml
+ mId = getId();
+ // IME hookup
+ mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ // TODO: read the current icon & visibility state directly from the service
+
+ // TODO: register for notifications about changes to visibility & subtype from service
+
+ setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (mId) {
+ case ID_IME_SWITCH_BUTTON:
+ mImm.showInputMethodPicker();
+ break;
+ case ID_IME_SHORTCUT_BUTTON:
+ if (mToken != null && mShortcutInfo != null) {
+ mImm.setInputMethodAndSubtype(
+ mToken, mShortcutInfo.getId(), mShortcutSubtype);
+ }
+ break;
+ }
+ }
+ });
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ mIcon = (ImageView) findViewById(mId);
+
+ refreshStatusIcon(mKeyboardShown);
+ }
+
+ private InputMethodInfo getCurrentInputMethodInfo() {
+ String curInputMethodId = Settings.Secure.getString(getContext()
+ .getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
+ if (!mInputMethodsInfo.containsKey(curInputMethodId)) {
+ mInputMethodsInfo.clear();
+ List<InputMethodInfo> imis = mImm.getInputMethodList();
+ for (int i = 0; i < imis.size(); ++i) {
+ InputMethodInfo imi = imis.get(i);
+ mInputMethodsInfo.put(imi.getId(), imi);
+ }
+ }
+ return mInputMethodsInfo.get(curInputMethodId);
+ }
+
+ // TODO: Need to show an appropriate drawable for this shortcut button,
+ // if there are two or more shortcut input methods contained in this button.
+ // And need to add other methods to handle multiple shortcuts as appropriate.
+ private Drawable getShortcutInputMethodAndSubtypeDrawable() {
+ Map<InputMethodInfo, List<InputMethodSubtype>> shortcuts =
+ mImm.getShortcutInputMethodsAndSubtypes();
+ if (shortcuts.size() > 0) {
+ for (InputMethodInfo imi: shortcuts.keySet()) {
+ List<InputMethodSubtype> subtypes = shortcuts.get(imi);
+ // TODO: Returns the first found IMI for now. Should handle all shortcuts as
+ // appropriate.
+ mShortcutInfo = imi;
+ // TODO: Pick up the first found subtype for now. Should handle all subtypes
+ // as appropriate.
+ mShortcutSubtype = subtypes.size() > 0 ? subtypes.get(0) : null;
+ return getSubtypeIcon(mShortcutInfo, mShortcutSubtype);
+ }
+ }
+ return null;
+ }
+
+ private Drawable getSubtypeIcon(InputMethodInfo imi, InputMethodSubtype subtype) {
+ final PackageManager pm = getContext().getPackageManager();
+ if (imi != null) {
+ if (DEBUG) {
+ Log.d(TAG, "Update icons of IME: " + imi.getPackageName() + ","
+ + subtype.getLocale() + "," + subtype.getMode());
+ }
+ if (subtype != null) {
+ return pm.getDrawable(imi.getPackageName(), subtype.getIconResId(),
+ imi.getServiceInfo().applicationInfo);
+ } else if (imi.getSubtypes().size() > 0) {
+ return pm.getDrawable(imi.getPackageName(),
+ imi.getSubtypes().get(0).getIconResId(),
+ imi.getServiceInfo().applicationInfo);
+ } else {
+ try {
+ return pm.getApplicationInfo(imi.getPackageName(), 0).loadIcon(pm);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "IME can't be found: " + imi.getPackageName());
+ }
+ }
+ }
+ return null;
+ }
+
+ private void refreshStatusIcon(boolean keyboardShown) {
+ if (!keyboardShown) {
+ setVisibility(View.INVISIBLE);
+ return;
+ } else {
+ setVisibility(View.VISIBLE);
+ }
+ Drawable icon = null;
+ switch (mId) {
+ case ID_IME_SWITCH_BUTTON:
+ // TODO: Just showing the first shortcut IME subtype for now. Should handle all
+ // shortcuts as appropriate.
+ icon = getSubtypeIcon(getCurrentInputMethodInfo(),
+ mImm.getCurrentInputMethodSubtype());
+ break;
+ case ID_IME_SHORTCUT_BUTTON:
+ icon = getShortcutInputMethodAndSubtypeDrawable();
+ break;
+ }
+ if (icon == null) {
+ mIcon.setImageResource(R.drawable.ic_sysbar_ime_default);
+ } else {
+ mIcon.setImageDrawable(icon);
+ }
+ }
+
+ public void setIMEButtonVisible(IBinder token, boolean visible) {
+ mToken = token;
+ mKeyboardShown = visible;
+ refreshStatusIcon(mKeyboardShown);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java
new file mode 100644
index 0000000..df29f95
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.ImageView;
+import android.view.MotionEvent;
+
+import com.android.systemui.R;
+
+
+public class NotificationIconArea extends LinearLayout {
+ private static final String TAG = "NotificationIconArea";
+
+ IconLayout mIconLayout;
+
+ public NotificationIconArea(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ mIconLayout = (IconLayout)findViewById(R.id.icons);
+ }
+
+ static class IconLayout extends LinearLayout {
+ public IconLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public boolean onInterceptTouchEvent(MotionEvent e) {
+ return true;
+ }
+ }
+}
+
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java
new file mode 100644
index 0000000..baf4a0f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+
+public class NotificationPanel extends LinearLayout implements StatusBarPanel,
+ View.OnClickListener {
+ static final String TAG = "NotificationPanel";
+
+ View mTitleArea;
+ View mSettingsButton;
+ View mNotificationButton;
+ View mNotificationScroller;
+ FrameLayout mContentFrame;
+ View mSettingsView;
+
+ public NotificationPanel(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public NotificationPanel(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ public void onFinishInflate() {
+ super.onFinishInflate();
+
+ mTitleArea = findViewById(R.id.title_area);
+
+ mSettingsButton = (ImageView)findViewById(R.id.settings_button);
+ mSettingsButton.setOnClickListener(this);
+ mNotificationButton = (ImageView)findViewById(R.id.notification_button);
+ mNotificationButton.setOnClickListener(this);
+
+ mNotificationScroller = findViewById(R.id.notificationScroller);
+ mContentFrame = (FrameLayout)findViewById(R.id.content_frame);
+ }
+
+ @Override
+ public void onVisibilityChanged(View v, int vis) {
+ super.onVisibilityChanged(v, vis);
+ // when we hide, put back the notifications
+ if (!isShown()) {
+ switchToNotificationMode();
+ mNotificationScroller.scrollTo(0, 0);
+ }
+ }
+
+ /**
+ * We need to be aligned at the bottom. LinearLayout can't do this, so instead,
+ * let LinearLayout do all the hard work, and then shift everything down to the bottom.
+ */
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed, l, t, r, b);
+ // We know that none of our children are GONE, so don't worry about skipping GONE views.
+ final int N = getChildCount();
+ if (N == 0) {
+ return;
+ }
+ final int allocatedBottom = getChildAt(N-1).getBottom();
+ final int shift = b - allocatedBottom - getPaddingBottom();
+ if (shift <= 0) {
+ return;
+ }
+ for (int i=0; i<N; i++) {
+ final View c = getChildAt(i);
+ c.layout(c.getLeft(), c.getTop() + shift, c.getRight(), c.getBottom() + shift);
+ }
+ }
+
+ public void onClick(View v) {
+ if (v == mSettingsButton) {
+ switchToSettingsMode();
+ } else if (v == mNotificationButton) {
+ switchToNotificationMode();
+ }
+ }
+
+ public void switchToSettingsMode() {
+ removeSettingsView();
+ addSettingsView();
+ mSettingsButton.setVisibility(View.INVISIBLE);
+ mNotificationScroller.setVisibility(View.GONE);
+ mNotificationButton.setVisibility(View.VISIBLE);
+ }
+
+ public void switchToNotificationMode() {
+ removeSettingsView();
+ mSettingsButton.setVisibility(View.VISIBLE);
+ mNotificationScroller.setVisibility(View.VISIBLE);
+ mNotificationButton.setVisibility(View.INVISIBLE);
+ }
+
+ public boolean isInContentArea(int x, int y) {
+ final int l = mContentFrame.getLeft();
+ final int r = mContentFrame.getRight();
+ final int t = mTitleArea.getTop();
+ final int b = mContentFrame.getBottom();
+ return x >= l && x < r && y >= t && y < b;
+ }
+
+ void removeSettingsView() {
+ if (mSettingsView != null) {
+ mContentFrame.removeView(mSettingsView);
+ mSettingsView = null;
+ }
+ }
+
+ void addSettingsView() {
+ LayoutInflater infl = LayoutInflater.from(getContext());
+ mSettingsView = infl.inflate(R.layout.status_bar_settings_view, mContentFrame, false);
+ mContentFrame.addView(mSettingsView);
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPeekPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPeekPanel.java
new file mode 100644
index 0000000..744f667
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPeekPanel.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.RelativeLayout;
+
+import com.android.systemui.R;
+
+public class NotificationPeekPanel extends RelativeLayout implements StatusBarPanel {
+ public NotificationPeekPanel(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public NotificationPeekPanel(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public boolean isInContentArea(int x, int y) {
+ final int l = getPaddingLeft();
+ final int r = getWidth() - getPaddingRight();
+ final int t = getPaddingTop();
+ final int b = getHeight() - getPaddingBottom();
+ return x >= l && x < r && y >= t && y < b;
+ }
+
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java
new file mode 100644
index 0000000..d4413db
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import android.content.Context;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.graphics.Paint;
+import android.graphics.Canvas;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import com.android.systemui.R;
+
+public class NotificationTitleArea extends RelativeLayout {
+ static final String TAG = "NotificationTitleArea";
+
+ View mSettingsButton;
+ View mNotificationButton;
+ View mNotificationScroller;
+ FrameLayout mSettingsFrame;
+ View mSettingsPanel;
+
+ // for drawing the background
+ Bitmap mTexture;
+ Paint mPaint;
+ int mTextureWidth;
+ int mTextureHeight;
+
+
+ public NotificationTitleArea(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public NotificationTitleArea(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ // for drawing the background
+ mTexture = BitmapFactory.decodeResource(getResources(), R.drawable.panel_notification);
+ mTextureWidth = mTexture.getWidth();
+ mTextureHeight = mTexture.getHeight();
+
+ mPaint = new Paint();
+ mPaint.setDither(false);
+ }
+
+ public void onFinishInflate() {
+ super.onFinishInflate();
+ setWillNotDraw(false);
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ final Bitmap texture = mTexture;
+ final Paint paint = mPaint;
+
+ final int width = getWidth();
+ final int height = getHeight();
+
+ final int textureWidth = mTextureWidth;
+ final int textureHeight = mTextureHeight;
+
+ int x = 0;
+ int y;
+
+ while (x < width) {
+ y = 0;
+ while (y < height) {
+ canvas.drawBitmap(texture, x, y, paint);
+ y += textureHeight;
+ }
+ x += textureWidth;
+ }
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java
new file mode 100644
index 0000000..5eafdc1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java
@@ -0,0 +1,73 @@
+/*
+ * 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.phone;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.view.View;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.graphics.Paint;
+import android.graphics.Canvas;
+
+public class PanelBackgroundView extends View {
+ private Bitmap mTexture;
+ private Paint mPaint;
+ private int mTextureWidth;
+ private int mTextureHeight;
+
+ public PanelBackgroundView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ /*
+ mTexture = BitmapFactory.decodeResource(getResources(),
+ com.android.internal.R.drawable.status_bar_background);
+ mTextureWidth = mTexture.getWidth();
+ mTextureHeight = mTexture.getHeight();
+
+ mPaint = new Paint();
+ mPaint.setDither(false);
+ */
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ /*
+ final Bitmap texture = mTexture;
+ final Paint paint = mPaint;
+
+ final int width = getWidth();
+ final int height = getHeight();
+
+ final int textureWidth = mTextureWidth;
+ final int textureHeight = mTextureHeight;
+
+ int x = 0;
+ int y;
+
+ while (x < width) {
+ y = 0;
+ while (y < height) {
+ canvas.drawBitmap(texture, x, y, paint);
+ y += textureHeight;
+ }
+ x += textureWidth;
+ }
+ */
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
new file mode 100644
index 0000000..546750b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
+import android.app.IActivityManager;
+import android.app.IThumbnailReceiver;
+import android.app.ActivityManager.RunningTaskInfo;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.Bitmap;
+import android.graphics.Matrix;
+import android.graphics.drawable.Drawable;
+import android.os.RemoteException;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+
+public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnClickListener {
+ private static final String TAG = "RecentAppsPanel";
+ private static final boolean DEBUG = TabletStatusBar.DEBUG;
+ private static final int DISPLAY_TASKS = 4; // number of recent tasks to display
+ private static final int MAX_TASKS = 2 * DISPLAY_TASKS; // give some slack for non-apps
+ private static final boolean DBG = true;
+ private TabletStatusBar mBar;
+ private TextView mNoRecents;
+ private LinearLayout mRecentsContainer;
+ private ArrayList<ActivityDescription> mActivityDescriptions;
+
+ static class ActivityDescription {
+ int id;
+ Bitmap thumbnail; // generated by Activity.onCreateThumbnail()
+ Drawable icon; // application package icon
+ String label; // application package label
+ CharSequence description; // generated by Activity.onCreateDescription()
+ Intent intent; // launch intent for application
+ Matrix matrix; // arbitrary rotation matrix to correct orientation
+ int position; // position in list
+
+ public ActivityDescription(Bitmap _thumbnail,
+ Drawable _icon, String _label, String _desc, Intent _intent, int _id, int _pos)
+ {
+ thumbnail = _thumbnail;
+ icon = _icon;
+ label = _label;
+ description = _desc;
+ intent = _intent;
+ id = _id;
+ position = _pos;
+ }
+ };
+
+ private final IThumbnailReceiver mThumbnailReceiver = new IThumbnailReceiver.Stub() {
+
+ public void finished() throws RemoteException {
+ }
+
+ public void newThumbnail(final int id, final Bitmap bitmap, CharSequence description)
+ throws RemoteException {
+ ActivityDescription info = findActivityDescription(id);
+ if (info != null) {
+ info.thumbnail = bitmap;
+ info.description = description;
+ }
+ }
+ };
+
+ public boolean isInContentArea(int x, int y) {
+ final int l = getPaddingLeft();
+ final int r = getWidth() - getPaddingRight();
+ final int t = getPaddingTop();
+ final int b = getHeight() - getPaddingBottom();
+ return x >= l && x < r && y >= t && y < b;
+ }
+
+ public void setBar(TabletStatusBar bar) {
+ mBar = bar;
+ }
+
+ public RecentAppsPanel(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public RecentAppsPanel(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mNoRecents = (TextView) findViewById(R.id.recents_no_recents);
+ mRecentsContainer = (LinearLayout) findViewById(R.id.recents_container);
+ }
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int visibility) {
+ super.onVisibilityChanged(changedView, visibility);
+ Log.v(TAG, "onVisibilityChanged(" + changedView + ", " + visibility + ")");
+ if (visibility == View.VISIBLE && changedView == this) {
+ refreshApplicationList();
+ mRecentsContainer.setScrollbarFadingEnabled(true);
+ mRecentsContainer.scrollTo(0, 0);
+ }
+ }
+
+ private ArrayList<ActivityDescription> getRecentTasks() {
+ ArrayList<ActivityDescription> activityDescriptions = new ArrayList<ActivityDescription>();
+ final PackageManager pm = mContext.getPackageManager();
+ final ActivityManager am = (ActivityManager)
+ mContext.getSystemService(Context.ACTIVITY_SERVICE);
+
+ final List<ActivityManager.RecentTaskInfo> recentTasks =
+ am.getRecentTasks(MAX_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
+
+ ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
+ .resolveActivityInfo(pm, 0);
+
+ int numTasks = recentTasks.size();
+ for (int i = 0, index = 0; i < numTasks && (index < MAX_TASKS); ++i) {
+ final ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(i);
+
+ Intent intent = new Intent(recentInfo.baseIntent);
+ if (recentInfo.origActivity != null) {
+ intent.setComponent(recentInfo.origActivity);
+ }
+
+ // Skip the current home activity.
+ if (homeInfo != null
+ && homeInfo.packageName.equals(intent.getComponent().getPackageName())
+ && homeInfo.name.equals(intent.getComponent().getClassName())) {
+ continue;
+ }
+
+ intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+ | Intent.FLAG_ACTIVITY_NEW_TASK);
+ final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
+ if (resolveInfo != null) {
+ final ActivityInfo info = resolveInfo.activityInfo;
+ final String title = info.loadLabel(pm).toString();
+ Drawable icon = info.loadIcon(pm);
+ int id = recentTasks.get(i).id;
+ if (title != null && title.length() > 0 && icon != null) {
+ Log.v(TAG, "creating activity desc for id=" + id + ", label=" + title);
+ ActivityDescription item = new ActivityDescription(
+ null, icon, title, null, intent, id, index);
+ activityDescriptions.add(item);
+ ++index;
+ } else {
+ if (DBG) Log.v(TAG, "SKIPPING item " + id);
+ }
+ }
+ }
+ return activityDescriptions;
+ }
+
+ ActivityDescription findActivityDescription(int id)
+ {
+ ActivityDescription desc = null;
+ for (int i = 0; i < mActivityDescriptions.size(); i++) {
+ ActivityDescription item = mActivityDescriptions.get(i);
+ if (item != null && item.id == id) {
+ desc = item;
+ break;
+ }
+ }
+ return desc;
+ }
+
+ private void getThumbnails(ArrayList<ActivityDescription> tasks) {
+ ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+ List<RunningTaskInfo> runningTasks = am.getRunningTasks(MAX_TASKS, 0, mThumbnailReceiver);
+ for (RunningTaskInfo r : runningTasks) {
+ // Find the activity description associted with the given id
+ ActivityDescription desc = findActivityDescription(r.id);
+ if (desc != null) {
+ if (r.thumbnail != null) {
+ desc.thumbnail = r.thumbnail;
+ desc.description = r.description;
+ } else {
+ if (DBG) Log.v(TAG, "*** RUNNING THUMBNAIL WAS NULL ***");
+ }
+ } else {
+ if (DBG) Log.v(TAG, "Couldn't find ActivityDesc for id=" + r.id);
+ }
+ }
+ }
+
+ private void refreshApplicationList() {
+ mActivityDescriptions = getRecentTasks();
+ getThumbnails(mActivityDescriptions);
+ updateUiElements();
+ }
+
+ private void updateUiElements() {
+ mRecentsContainer.removeAllViews();
+ final int first = 0;
+ final int last = Math.min(mActivityDescriptions.size(), DISPLAY_TASKS) - 1;
+ for (int i = last; i >= first; i--) {
+ ActivityDescription activityDescription = mActivityDescriptions.get(i);
+ View view = View.inflate(mContext, R.layout.status_bar_recent_item, null);
+ ImageView appThumbnail = (ImageView) view.findViewById(R.id.app_thumbnail);
+ ImageView appIcon = (ImageView) view.findViewById(R.id.app_icon);
+ TextView appDescription = (TextView) view.findViewById(R.id.app_label);
+ if (activityDescription.thumbnail != null) {
+ Log.v(TAG, "thumbnail res = " + activityDescription.thumbnail.getWidth()
+ + "x" + activityDescription.thumbnail.getHeight());
+ } else {
+ Log.v(TAG, "thumbnail for " + activityDescription.label + " was null");
+ }
+ appThumbnail.setImageBitmap(activityDescription.thumbnail);
+ appIcon.setImageDrawable(activityDescription.icon);
+ appDescription.setText(activityDescription.label);
+ view.setOnClickListener(this);
+ view.setTag(activityDescription);
+ Log.v(TAG, "Adding task: " + activityDescription.label);
+ mRecentsContainer.addView(view);
+ }
+
+ int views = mRecentsContainer.getChildCount();
+ mNoRecents.setVisibility(views == 0 ? View.VISIBLE : View.GONE);
+ mRecentsContainer.setVisibility(views > 0 ? View.VISIBLE : View.GONE);
+ }
+
+ public void onClick(View v) {
+ ActivityDescription ad = (ActivityDescription)v.getTag();
+ if (ad.id >= 0) {
+ // This is an active task; it should just go to the foreground.
+ final ActivityManager am = (ActivityManager)
+ getContext().getSystemService(Context.ACTIVITY_SERVICE);
+ am.moveTaskToFront(ad.id, ActivityManager.MOVE_TASK_WITH_HOME);
+ } else {
+ Intent intent = ad.intent;
+ intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
+ | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
+ if (DEBUG) Log.v(TAG, "Starting activity " + intent);
+ getContext().startActivity(intent);
+ }
+ mBar.animateCollapse();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java
new file mode 100644
index 0000000..d1f8dd0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import android.app.StatusBarManager;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.widget.LinearLayout;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.AirplaneModeController;
+import com.android.systemui.statusbar.policy.AutoRotateController;
+import com.android.systemui.statusbar.policy.DoNotDisturbController;
+
+public class SettingsView extends LinearLayout implements View.OnClickListener {
+ static final String TAG = "SettingsView";
+
+ AirplaneModeController mAirplane;
+ AutoRotateController mRotate;
+ DoNotDisturbController mDoNotDisturb;
+
+ public SettingsView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public SettingsView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ final Context context = getContext();
+
+ mAirplane = new AirplaneModeController(context,
+ (CompoundButton)findViewById(R.id.airplane_checkbox));
+ findViewById(R.id.network).setOnClickListener(this);
+ mRotate = new AutoRotateController(context,
+ (CompoundButton)findViewById(R.id.rotate_checkbox));
+ mDoNotDisturb = new DoNotDisturbController(context,
+ (CompoundButton)findViewById(R.id.do_not_disturb_checkbox));
+ findViewById(R.id.settings).setOnClickListener(this);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mAirplane.release();
+ mDoNotDisturb.release();
+ }
+
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.network:
+ onClickNetwork();
+ break;
+ case R.id.settings:
+ onClickSettings();
+ break;
+ }
+ }
+
+ private StatusBarManager getStatusBarManager() {
+ return (StatusBarManager)getContext().getSystemService(Context.STATUS_BAR_SERVICE);
+ }
+
+ // Network
+ // ----------------------------
+ private void onClickNetwork() {
+ Slog.d(TAG, "onClickNetwork");
+ }
+
+ // Settings
+ // ----------------------------
+ private void onClickSettings() {
+ Slog.d(TAG, "onClickSettings");
+ getContext().startActivity(new Intent(Settings.ACTION_SETTINGS)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ getStatusBarManager().collapse();
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java
new file mode 100644
index 0000000..d1e61a9
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java
@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.util.Slog;
+import android.view.View;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.view.DragEvent;
+import android.view.MotionEvent;
+import android.content.ClipData;
+import android.content.ClipDescription;
+import android.graphics.Paint;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Point;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.view.WindowManagerImpl;
+import android.graphics.PixelFormat;
+import android.view.Gravity;
+
+import com.android.systemui.R;
+
+public class ShirtPocket extends FrameLayout {
+ private static final boolean DEBUG = false;
+ private static final String TAG = "StatusBar/ShirtPocket";
+
+ private ClipData mClipping = null;
+
+ private View mWindow = null;
+ private ImageView mIcon;
+ private ImageView mPreviewIcon;
+ private TextView mDescription;
+ private TextView mAltText;
+
+ public ShirtPocket(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setupWindow();
+ }
+
+ // TODO: "pin area" panel, dragging things out
+ ObjectAnimator mAnimHide, mAnimShow;
+
+ protected void onAttachedToWindow() {
+ // Drag API notes: we must be visible to receive drag events
+ setVisibility(View.VISIBLE);
+
+ mIcon = (ImageView) findViewById(R.id.pocket_icon);
+ refreshStatusIcon();
+
+ setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ if (mClipping != null) {
+ if (mWindow.getVisibility() == View.VISIBLE) hideWindow();
+ else showWindow();
+ }
+ }
+ });
+ }
+
+ private void refreshStatusIcon() {
+ setClickable(mClipping != null);
+ mIcon.setImageResource(mClipping == null
+ ? R.drawable.ic_sysbar_pocket_hidden
+ : R.drawable.ic_sysbar_pocket_holding);
+ mIcon.setVisibility(mClipping == null ? View.INVISIBLE : View.VISIBLE);
+ }
+
+ private void showWindow() {
+ getHandler().post(new Runnable() {
+ public void run() {
+ mWindow.setVisibility(View.VISIBLE);
+ refreshStatusIcon();
+ }
+ });
+ }
+
+ private void hideWindow() {
+ getHandler().post(new Runnable() {
+ public void run() {
+ mWindow.setVisibility(View.GONE);
+ refreshStatusIcon();
+ }
+ });
+ }
+
+ private void hideWindowInJustASec() {
+ getHandler().postDelayed(new Runnable() {
+ public void run() {
+ mWindow.setVisibility(View.GONE);
+ refreshStatusIcon();
+ }
+ },
+ 250);
+ }
+
+ private void stash(ClipData clipping) {
+ mClipping = clipping;
+ if (mClipping != null) {
+ Bitmap icon = mClipping.getIcon();
+ mDescription.setText(mClipping.getDescription().getLabel());
+ if (icon != null) {
+ mPreviewIcon.setImageBitmap(icon);
+ mPreviewIcon.setVisibility(View.VISIBLE);
+ mAltText.setVisibility(View.GONE);
+ } else {
+ mPreviewIcon.setVisibility(View.GONE);
+ mAltText.setVisibility(View.VISIBLE);
+ if (mClipping.getItemCount() > 0) {
+ // TODO: figure out how to visualize every kind of ClipData!
+ mAltText.setText(mClipping.getItem(0).coerceToText(getContext()));
+ }
+ }
+ }
+ }
+
+ private boolean isInViewContentArea(View v, int x, int y) {
+ final int l = v.getPaddingLeft();
+ final int r = v.getWidth() - v.getPaddingRight();
+ final int t = v.getPaddingTop();
+ final int b = v.getHeight() - v.getPaddingBottom();
+ return x >= l && x < r && y >= t && y < b;
+ }
+
+ View.OnTouchListener mWindowTouchListener = new View.OnTouchListener() {
+ public boolean onTouch(View v, MotionEvent ev) {
+ final int action = ev.getAction();
+ if (action == MotionEvent.ACTION_OUTSIDE
+ || (action == MotionEvent.ACTION_DOWN
+ && !isInViewContentArea(mWindow, (int)ev.getX(), (int)ev.getY()))) {
+ hideWindow();
+ return true;
+ } else if (action == MotionEvent.ACTION_DOWN) {
+ Slog.d(TAG, "ACTION_DOWN");
+ final ClipData clip = mClipping;
+ if (clip != null) {
+ final Bitmap icon = clip.getIcon();
+ DragThumbnailBuilder thumb;
+ if (icon != null) {
+ thumb = new DragThumbnailBuilder(v) {
+ public void onProvideThumbnailMetrics(Point thumbnailSize, Point thumbnailTouchPoint) {
+ thumbnailSize.set(icon.getWidth(), icon.getHeight());
+ thumbnailTouchPoint.set(thumbnailSize.x / 2, thumbnailSize.y / 2);
+ }
+ public void onDrawThumbnail(Canvas canvas) {
+ canvas.drawBitmap(icon, 0, 0, new Paint());
+ }
+ };
+ } else {
+ // uhhh, what now?
+ thumb = new DragThumbnailBuilder(mWindow.findViewById(R.id.preview));
+ }
+
+ v.startDrag(clip, thumb, false);
+
+ // TODO: only discard the clipping if it was accepted
+ stash(null);
+
+ hideWindowInJustASec(); // will refresh the icon
+
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+
+ private void setupWindow() {
+ mWindow = View.inflate(getContext(), R.layout.status_bar_pocket_panel, null);
+
+ mPreviewIcon = (ImageView) mWindow.findViewById(R.id.icon);
+ mDescription = (TextView) mWindow.findViewById(R.id.description);
+ mAltText = (TextView) mWindow.findViewById(R.id.alt);
+
+ mWindow.setVisibility(View.GONE);
+ mWindow.setOnTouchListener(mWindowTouchListener);
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+ 400,
+ 250,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+ PixelFormat.TRANSLUCENT);
+ lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
+// int pos[] = new int[2];
+// getLocationOnScreen(pos);
+// lp.x = pos[1];
+// lp.y = 0;
+ lp.setTitle("ShirtPocket");
+ lp.windowAnimations = R.style.Animation_ShirtPocketPanel;
+
+ WindowManagerImpl.getDefault().addView(mWindow, lp);
+
+ }
+
+ public boolean onDragEvent(DragEvent event) {
+ if (DEBUG) Slog.d(TAG, "onDragEvent: " + event);
+ if (mIcon != null) {
+ switch (event.getAction()) {
+ // We want to appear whenever a potential drag takes off from anywhere in the UI.
+ case DragEvent.ACTION_DRAG_STARTED:
+ mIcon.setImageResource(mClipping == null
+ ? R.drawable.ic_sysbar_pocket
+ : R.drawable.ic_sysbar_pocket_holding);
+ mIcon.setVisibility(View.VISIBLE);
+ break;
+ case DragEvent.ACTION_DRAG_ENTERED:
+ if (DEBUG) Slog.d(TAG, "entered!");
+ mIcon.setImageResource(R.drawable.ic_sysbar_pocket_drag);
+ break;
+ case DragEvent.ACTION_DRAG_EXITED:
+ if (DEBUG) Slog.d(TAG, "exited!");
+ mIcon.setImageResource(mClipping == null
+ ? R.drawable.ic_sysbar_pocket
+ : R.drawable.ic_sysbar_pocket_holding);
+ break;
+ case DragEvent.ACTION_DROP:
+ if (DEBUG) Slog.d(TAG, "dropped!");
+ stash(event.getClipData());
+ refreshStatusIcon();
+ break;
+ case DragEvent.ACTION_DRAG_ENDED:
+ refreshStatusIcon();
+ break;
+ }
+ }
+ return true; // we want everything, thank you
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/StatusBarPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/StatusBarPanel.java
new file mode 100644
index 0000000..8fa01d5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/StatusBarPanel.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+public interface StatusBarPanel {
+ public boolean isInContentArea(int x, int y);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
new file mode 100644
index 0000000..3519e8c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -0,0 +1,1265 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.IdentityHashMap;
+
+import android.animation.LayoutTransition;
+import android.animation.ObjectAnimator;
+import android.animation.AnimatorSet;
+import android.app.ActivityManagerNative;
+import android.app.PendingIntent;
+import android.app.Notification;
+import android.app.StatusBarManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.RemoteException;
+import android.text.TextUtils;
+import android.util.Slog;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.WindowManagerImpl;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RemoteViews;
+import android.widget.ScrollView;
+import android.widget.TextSwitcher;
+import android.widget.TextView;
+
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.internal.statusbar.StatusBarNotification;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.*;
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.recent.RecentApplicationsActivity;
+
+public class TabletStatusBar extends StatusBar {
+ public static final boolean DEBUG = false;
+ public static final String TAG = "TabletStatusBar";
+
+ public static final int MSG_OPEN_NOTIFICATION_PANEL = 1000;
+ public static final int MSG_CLOSE_NOTIFICATION_PANEL = 1001;
+ public static final int MSG_OPEN_NOTIFICATION_PEEK = 1002;
+ public static final int MSG_CLOSE_NOTIFICATION_PEEK = 1003;
+ public static final int MSG_OPEN_RECENTS_PANEL = 1020;
+ public static final int MSG_CLOSE_RECENTS_PANEL = 1021;
+ public static final int MSG_HIDE_SHADOWS = 1030;
+ public static final int MSG_SHOW_SHADOWS = 1031;
+ public static final int MSG_RESTORE_SHADOWS = 1032;
+
+ private static final int MAX_IMAGE_LEVEL = 10000;
+ private static final boolean USE_2D_RECENTS = true;
+
+ public static final int LIGHTS_ON_DELAY = 5000;
+
+ int mIconSize;
+
+ H mHandler = new H();
+
+ // tracking all current notifications
+ private NotificationData mNotns = new NotificationData();
+
+ TabletStatusBarView mStatusBarView;
+ View mNotificationArea;
+ View mNotificationTrigger;
+ NotificationIconArea mNotificationIconArea;
+ View mNavigationArea;
+
+ ImageView mBackButton;
+ View mHomeButton;
+ View mMenuButton;
+ View mRecentButton;
+
+ InputMethodButton mInputMethodSwitchButton;
+ InputMethodButton mInputMethodShortcutButton;
+
+ NotificationPanel mNotificationPanel;
+ NotificationPeekPanel mNotificationPeekWindow;
+ ViewGroup mNotificationPeekRow;
+ int mNotificationPeekIndex;
+ IBinder mNotificationPeekKey;
+ LayoutTransition mNotificationPeekScrubLeft, mNotificationPeekScrubRight;
+
+ int mNotificationPeekTapDuration;
+ int mNotificationFlingVelocity;
+
+ ViewGroup mPile;
+
+ BatteryController mBatteryController;
+ NetworkController mNetworkController;
+
+ View mBarContents;
+
+ // lights out support
+ View mBackShadow, mHomeShadow, mRecentShadow, mMenuShadow, mNotificationShadow;
+ ShadowController mShadowController;
+
+ NotificationIconArea.IconLayout mIconLayout;
+
+ TabletTicker mTicker;
+
+ // for disabling the status bar
+ int mDisabled = 0;
+
+ boolean mNotificationsOn = true;
+ private RecentAppsPanel mRecentsPanel;
+
+ protected void addPanelWindows() {
+ final Context context = mContext;
+
+ final Resources res = context.getResources();
+ final int barHeight= res.getDimensionPixelSize(
+ com.android.internal.R.dimen.status_bar_height);
+
+ // Notification Panel
+ mNotificationPanel = (NotificationPanel)View.inflate(context,
+ R.layout.status_bar_notification_panel, null);
+ mNotificationPanel.setVisibility(View.GONE);
+ mNotificationPanel.setOnTouchListener(
+ new TouchOutsideListener(MSG_CLOSE_NOTIFICATION_PANEL, mNotificationPanel));
+
+ // the battery and network icons
+ mBatteryController.addIconView((ImageView)mNotificationPanel.findViewById(R.id.battery));
+ mBatteryController.addLabelView(
+ (TextView)mNotificationPanel.findViewById(R.id.battery_text));
+ mNetworkController.addCombinedSignalIconView(
+ (ImageView)mNotificationPanel.findViewById(R.id.network_signal));
+ mNetworkController.addDataTypeIconView(
+ (ImageView)mNotificationPanel.findViewById(R.id.network_type));
+ mNetworkController.addLabelView(
+ (TextView)mNotificationPanel.findViewById(R.id.network_text));
+
+ mStatusBarView.setIgnoreChildren(0, mNotificationTrigger, mNotificationPanel);
+
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+ PixelFormat.TRANSLUCENT);
+ lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
+ lp.setTitle("NotificationPanel");
+
+ WindowManagerImpl.getDefault().addView(mNotificationPanel, lp);
+
+ // Notification preview window
+ mNotificationPeekWindow = (NotificationPeekPanel) View.inflate(context,
+ R.layout.status_bar_notification_peek, null);
+ mNotificationPeekRow = (ViewGroup) mNotificationPeekWindow.findViewById(R.id.content);
+ mNotificationPeekWindow.setVisibility(View.GONE);
+ mNotificationPeekWindow.setOnTouchListener(
+ new TouchOutsideListener(MSG_CLOSE_NOTIFICATION_PEEK, mNotificationPeekWindow));
+ mNotificationPeekScrubRight = new LayoutTransition();
+ mNotificationPeekScrubRight.setAnimator(LayoutTransition.APPEARING,
+ ObjectAnimator.ofInt(null, "left", -512, 0));
+ mNotificationPeekScrubRight.setAnimator(LayoutTransition.DISAPPEARING,
+ ObjectAnimator.ofInt(null, "left", -512, 0));
+ mNotificationPeekScrubRight.setDuration(500);
+
+ mNotificationPeekScrubLeft = new LayoutTransition();
+ mNotificationPeekScrubLeft.setAnimator(LayoutTransition.APPEARING,
+ ObjectAnimator.ofInt(null, "left", 512, 0));
+ mNotificationPeekScrubLeft.setAnimator(LayoutTransition.DISAPPEARING,
+ ObjectAnimator.ofInt(null, "left", 512, 0));
+ mNotificationPeekScrubLeft.setDuration(500);
+
+ // XXX: setIgnoreChildren?
+ lp = new WindowManager.LayoutParams(
+ 512, // ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+ PixelFormat.TRANSLUCENT);
+ lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
+ lp.setTitle("NotificationPeekWindow");
+ lp.windowAnimations = com.android.internal.R.style.Animation_Toast;
+
+ WindowManagerImpl.getDefault().addView(mNotificationPeekWindow, lp);
+
+ // Recents Panel
+ if (USE_2D_RECENTS) {
+ mRecentsPanel = (RecentAppsPanel) View.inflate(context,
+ R.layout.status_bar_recent_panel, null);
+ mRecentsPanel.setVisibility(View.GONE);
+ mRecentsPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_RECENTS_PANEL,
+ mRecentsPanel));
+ mStatusBarView.setIgnoreChildren(2, mRecentButton, mRecentsPanel);
+
+ lp = new WindowManager.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+ PixelFormat.TRANSLUCENT);
+ lp.gravity = Gravity.BOTTOM | Gravity.LEFT;
+ lp.setTitle("RecentsPanel");
+ lp.windowAnimations = R.style.Animation_RecentPanel;
+
+ WindowManagerImpl.getDefault().addView(mRecentsPanel, lp);
+ mRecentsPanel.setBar(this);
+ }
+ }
+
+ @Override
+ public void start() {
+ super.start(); // will add the main bar view
+ }
+
+ protected View makeStatusBarView() {
+ final Context context = mContext;
+ final Resources res = context.getResources();
+
+ mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size);
+
+ final TabletStatusBarView sb = (TabletStatusBarView)View.inflate(
+ context, R.layout.status_bar, null);
+ mStatusBarView = sb;
+
+ sb.setHandler(mHandler);
+
+ mBarContents = sb.findViewById(R.id.bar_contents);
+
+ // the whole right-hand side of the bar
+ mNotificationArea = sb.findViewById(R.id.notificationArea);
+
+ // the button to open the notification area
+ mNotificationTrigger = sb.findViewById(R.id.notificationTrigger);
+ mNotificationTrigger.setOnClickListener(mOnClickListener);
+
+ // the more notifications icon
+ mNotificationIconArea = (NotificationIconArea)sb.findViewById(R.id.notificationIcons);
+
+ // where the icons go
+ mIconLayout = (NotificationIconArea.IconLayout) sb.findViewById(R.id.icons);
+ mIconLayout.setOnTouchListener(new NotificationIconTouchListener());
+
+ ViewConfiguration vc = ViewConfiguration.get(context);
+ mNotificationPeekTapDuration = vc.getTapTimeout();
+ mNotificationFlingVelocity = 300; // px/s
+
+ mTicker = new TabletTicker(context);
+
+ // The icons
+ mBatteryController = new BatteryController(mContext);
+ mBatteryController.addIconView((ImageView)sb.findViewById(R.id.battery));
+ mNetworkController = new NetworkController(mContext);
+ mNetworkController.addCombinedSignalIconView(
+ (ImageView)sb.findViewById(R.id.network_signal));
+ mNetworkController.addDataTypeIconView(
+ (ImageView)sb.findViewById(R.id.network_type));
+
+ // The navigation buttons
+ mNavigationArea = sb.findViewById(R.id.navigationArea);
+ mBackButton = (ImageView)mNavigationArea.findViewById(R.id.back);
+ mHomeButton = mNavigationArea.findViewById(R.id.home);
+ mMenuButton = mNavigationArea.findViewById(R.id.menu);
+ mRecentButton = mNavigationArea.findViewById(R.id.recent_apps);
+ Slog.d(TAG, "rec=" + mRecentButton + ", listener=" + mOnClickListener);
+ mRecentButton.setOnClickListener(mOnClickListener);
+
+ // The bar contents buttons
+ mInputMethodSwitchButton = (InputMethodButton) sb.findViewById(R.id.imeSwitchButton);
+ mInputMethodShortcutButton = (InputMethodButton) sb.findViewById(R.id.imeShortcutButton);
+
+ // "shadows" of the status bar features, for lights-out mode
+ mBackShadow = sb.findViewById(R.id.back_shadow);
+ mHomeShadow = sb.findViewById(R.id.home_shadow);
+ mRecentShadow = sb.findViewById(R.id.recent_shadow);
+ mMenuShadow = sb.findViewById(R.id.menu_shadow);
+ mNotificationShadow = sb.findViewById(R.id.notification_shadow);
+
+ mShadowController = new ShadowController(false);
+ mShadowController.add(mBackButton, mBackShadow);
+ mShadowController.add(mHomeButton, mHomeShadow);
+ mShadowController.add(mRecentButton, mRecentShadow);
+ mShadowController.add(mMenuButton, mMenuShadow);
+ mShadowController.add(mNotificationArea, mNotificationShadow);
+
+ // set the initial view visibility
+ setAreThereNotifications();
+ refreshNotificationTrigger();
+
+ // Add the windows
+ addPanelWindows();
+
+ mPile = (ViewGroup)mNotificationPanel.findViewById(R.id.content);
+ mPile.removeAllViews();
+
+ ScrollView scroller = (ScrollView)mPile.getParent();
+ scroller.setFillViewport(true);
+
+ return sb;
+ }
+
+ protected int getStatusBarGravity() {
+ return Gravity.BOTTOM | Gravity.FILL_HORIZONTAL;
+ }
+
+ private class H extends Handler {
+ public void handleMessage(Message m) {
+ switch (m.what) {
+ case MSG_OPEN_NOTIFICATION_PEEK:
+ if (DEBUG) Slog.d(TAG, "opening notification peek window; arg=" + m.arg1);
+ if (m.arg1 >= 0) {
+ final int N = mNotns.size();
+ if (mNotificationPeekIndex >= 0 && mNotificationPeekIndex < N) {
+ NotificationData.Entry entry = mNotns.get(N-1-mNotificationPeekIndex);
+ entry.icon.setBackgroundColor(0);
+ mNotificationPeekIndex = -1;
+ mNotificationPeekKey = null;
+ }
+
+ final int peekIndex = m.arg1;
+ if (peekIndex < N) {
+ Slog.d(TAG, "loading peek: " + peekIndex);
+ NotificationData.Entry entry = mNotns.get(N-1-peekIndex);
+ NotificationData.Entry copy = new NotificationData.Entry(
+ entry.key,
+ entry.notification,
+ entry.icon);
+ inflateViews(copy, mNotificationPeekRow);
+
+ entry.icon.setBackgroundColor(0x20FFFFFF);
+
+// mNotificationPeekRow.setLayoutTransition(
+// peekIndex < mNotificationPeekIndex
+// ? mNotificationPeekScrubLeft
+// : mNotificationPeekScrubRight);
+
+ mNotificationPeekRow.removeAllViews();
+ mNotificationPeekRow.addView(copy.row);
+
+ mNotificationPeekWindow.setVisibility(View.VISIBLE);
+ mNotificationPanel.setVisibility(View.GONE);
+
+ mNotificationPeekIndex = peekIndex;
+ mNotificationPeekKey = entry.key;
+ }
+ }
+ break;
+ case MSG_CLOSE_NOTIFICATION_PEEK:
+ if (DEBUG) Slog.d(TAG, "closing notification peek window");
+ mNotificationPeekWindow.setVisibility(View.GONE);
+ mNotificationPeekRow.removeAllViews();
+ final int N = mNotns.size();
+ if (mNotificationPeekIndex >= 0 && mNotificationPeekIndex < N) {
+ NotificationData.Entry entry = mNotns.get(N-1-mNotificationPeekIndex);
+ entry.icon.setBackgroundColor(0);
+ }
+
+ mNotificationPeekIndex = -1;
+ mNotificationPeekKey = null;
+ break;
+ case MSG_OPEN_NOTIFICATION_PANEL:
+ if (DEBUG) Slog.d(TAG, "opening notifications panel");
+ if (mNotificationPanel.getVisibility() == View.GONE) {
+ mNotificationPeekWindow.setVisibility(View.GONE);
+ mNotificationPanel.setVisibility(View.VISIBLE);
+ // synchronize with current shadow state
+ mShadowController.hideElement(mNotificationArea);
+ mTicker.halt();
+ }
+ break;
+ case MSG_CLOSE_NOTIFICATION_PANEL:
+ if (DEBUG) Slog.d(TAG, "closing notifications panel");
+ if (mNotificationPanel.getVisibility() == View.VISIBLE) {
+ mNotificationPanel.setVisibility(View.GONE);
+ // synchronize with current shadow state
+ mShadowController.showElement(mNotificationArea);
+ }
+ break;
+ case MSG_OPEN_RECENTS_PANEL:
+ if (DEBUG) Slog.d(TAG, "opening recents panel");
+ if (mRecentsPanel != null) mRecentsPanel.setVisibility(View.VISIBLE);
+ break;
+ case MSG_CLOSE_RECENTS_PANEL:
+ if (DEBUG) Slog.d(TAG, "closing recents panel");
+ if (mRecentsPanel != null) mRecentsPanel.setVisibility(View.GONE);
+ break;
+ case MSG_HIDE_SHADOWS:
+ if (DEBUG) Slog.d(TAG, "hiding shadows (lights on)");
+ mShadowController.hideAllShadows();
+ break;
+ case MSG_SHOW_SHADOWS:
+ if (DEBUG) Slog.d(TAG, "showing shadows (lights out)");
+ animateCollapse();
+ mShadowController.showAllShadows();
+ break;
+ case MSG_RESTORE_SHADOWS:
+ if (DEBUG) Slog.d(TAG, "quickly re-showing shadows if appropriate");
+ mShadowController.refresh();
+ break;
+ }
+ }
+ }
+
+ public void refreshNotificationTrigger() {
+ /*
+ if (mNotificationTrigger == null) return;
+
+ int resId;
+ boolean panel = (mNotificationPanel != null
+ && mNotificationPanel.getVisibility() == View.VISIBLE);
+ if (!mNotificationsOn) {
+ resId = R.drawable.ic_sysbar_noti_dnd;
+ } else if (mNotns.size() > 0) {
+ resId = panel ? R.drawable.ic_sysbar_noti_avail_open : R.drawable.ic_sysbar_noti_avail;
+ } else {
+ resId = panel ? R.drawable.ic_sysbar_noti_none_open : R.drawable.ic_sysbar_noti_none;
+ }
+ //mNotificationTrigger.setImageResource(resId);
+ */
+ }
+
+ public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
+ if (DEBUG) Slog.d(TAG, "addIcon(" + slot + ") -> " + icon);
+ }
+
+ public void updateIcon(String slot, int index, int viewIndex,
+ StatusBarIcon old, StatusBarIcon icon) {
+ if (DEBUG) Slog.d(TAG, "updateIcon(" + slot + ") -> " + icon);
+ }
+
+ public void removeIcon(String slot, int index, int viewIndex) {
+ if (DEBUG) Slog.d(TAG, "removeIcon(" + slot + ")");
+ }
+
+ public void addNotification(IBinder key, StatusBarNotification notification) {
+ if (DEBUG) Slog.d(TAG, "addNotification(" + key + " -> " + notification + ")");
+ addNotificationViews(key, notification);
+
+ final boolean immersive = isImmersive();
+ if (false && immersive) {
+ // TODO: immersive mode popups for tablet
+ } else if (notification.notification.fullScreenIntent != null) {
+ // not immersive & a full-screen alert should be shown
+ Slog.d(TAG, "Notification has fullScreenIntent and activity is not immersive;"
+ + " sending fullScreenIntent");
+ try {
+ notification.notification.fullScreenIntent.send();
+ } catch (PendingIntent.CanceledException e) {
+ }
+ } else {
+ tick(key, notification);
+ }
+
+ setAreThereNotifications();
+ }
+
+ public void updateNotification(IBinder key, StatusBarNotification notification) {
+ if (DEBUG) Slog.d(TAG, "updateNotification(" + key + " -> " + notification + ") // TODO");
+
+ final NotificationData.Entry oldEntry = mNotns.findByKey(key);
+ if (oldEntry == null) {
+ Slog.w(TAG, "updateNotification for unknown key: " + key);
+ return;
+ }
+
+ final StatusBarNotification oldNotification = oldEntry.notification;
+ final RemoteViews oldContentView = oldNotification.notification.contentView;
+
+ final RemoteViews contentView = notification.notification.contentView;
+
+ if (DEBUG) {
+ Slog.d(TAG, "old notification: when=" + oldNotification.notification.when
+ + " ongoing=" + oldNotification.isOngoing()
+ + " expanded=" + oldEntry.expanded
+ + " contentView=" + oldContentView);
+ Slog.d(TAG, "new notification: when=" + notification.notification.when
+ + " ongoing=" + oldNotification.isOngoing()
+ + " contentView=" + contentView);
+ }
+
+ // Can we just reapply the RemoteViews in place? If when didn't change, the order
+ // didn't change.
+ boolean orderUnchanged = (notification.notification.when == oldNotification.notification.when
+ && notification.isOngoing() == oldNotification.isOngoing()
+ && oldEntry.expanded != null
+ && contentView != null
+ && oldContentView != null
+ && contentView.getPackage() != null
+ && oldContentView.getPackage() != null
+ && oldContentView.getPackage().equals(contentView.getPackage())
+ && oldContentView.getLayoutId() == contentView.getLayoutId());
+ ViewGroup rowParent = (ViewGroup) oldEntry.row.getParent();
+ boolean isLastAnyway = rowParent.indexOfChild(oldEntry.row) == rowParent.getChildCount() - 1;
+ if (orderUnchanged || isLastAnyway) {
+ if (DEBUG) Slog.d(TAG, "reusing notification for key: " + key);
+ oldEntry.notification = notification;
+ try {
+ // Reapply the RemoteViews
+ contentView.reapply(mContext, oldEntry.content);
+ // update the contentIntent
+ final PendingIntent contentIntent = notification.notification.contentIntent;
+ if (contentIntent != null) {
+ oldEntry.content.setOnClickListener(new NotificationClicker(contentIntent,
+ notification.pkg, notification.tag, notification.id));
+ } else {
+ oldEntry.content.setOnClickListener(null);
+ }
+ // Update the icon.
+ final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
+ notification.notification.icon, notification.notification.iconLevel,
+ notification.notification.number);
+ if (!oldEntry.icon.set(ic)) {
+ handleNotificationError(key, notification, "Couldn't update icon: " + ic);
+ return;
+ }
+ }
+ catch (RuntimeException e) {
+ // It failed to add cleanly. Log, and remove the view from the panel.
+ Slog.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e);
+ removeNotificationViews(key);
+ addNotificationViews(key, notification);
+ }
+ } else {
+ if (DEBUG) Slog.d(TAG, "not reusing notification for key: " + key);
+ removeNotificationViews(key);
+ addNotificationViews(key, notification);
+ }
+ // fullScreenIntent doesn't happen on updates. You need to clear & repost a new
+ // notification.
+ final boolean immersive = isImmersive();
+ if (false && immersive) {
+ // TODO: immersive mode
+ } else {
+ tick(key, notification);
+ }
+
+ setAreThereNotifications();
+ }
+
+ public void removeNotification(IBinder key) {
+ if (DEBUG) Slog.d(TAG, "removeNotification(" + key + ") // TODO");
+ removeNotificationViews(key);
+ mTicker.remove(key);
+ setAreThereNotifications();
+ }
+
+ public void disable(int state) {
+ int old = mDisabled;
+ int diff = state ^ old;
+ mDisabled = state;
+
+ // act accordingly
+ if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
+ if ((state & StatusBarManager.DISABLE_EXPAND) != 0) {
+ Slog.d(TAG, "DISABLE_EXPAND: yes");
+ animateCollapse();
+ }
+ }
+ if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
+ if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
+ Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes");
+ // synchronize with current shadow state
+ mShadowController.hideElement(mNotificationIconArea);
+ mTicker.halt();
+ } else {
+ Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no");
+ // synchronize with current shadow state
+ mShadowController.showElement(mNotificationIconArea);
+ }
+ } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
+ if ((state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
+ mTicker.halt();
+ }
+ }
+ if ((diff & StatusBarManager.DISABLE_NAVIGATION) != 0) {
+ if ((state & StatusBarManager.DISABLE_NAVIGATION) != 0) {
+ Slog.d(TAG, "DISABLE_NAVIGATION: yes");
+ mNavigationArea.setVisibility(View.GONE);
+ } else {
+ Slog.d(TAG, "DISABLE_NAVIGATION: no");
+ mNavigationArea.setVisibility(View.VISIBLE);
+ }
+ }
+ }
+
+ private boolean hasTicker(Notification n) {
+ return n.tickerView != null || !TextUtils.isEmpty(n.tickerText);
+ }
+
+ private void tick(IBinder key, StatusBarNotification n) {
+ // Don't show the ticker when the windowshade is open.
+ if (mNotificationPanel.getVisibility() == View.VISIBLE) {
+ return;
+ }
+ // Show the ticker if one is requested. Also don't do this
+ // until status bar window is attached to the window manager,
+ // because... well, what's the point otherwise? And trying to
+ // run a ticker without being attached will crash!
+ if (hasTicker(n.notification) && mStatusBarView.getWindowToken() != null) {
+ if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS
+ | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) {
+ mTicker.add(key, n);
+ }
+ }
+ }
+
+ public void animateExpand() {
+ mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PANEL);
+ mHandler.sendEmptyMessage(MSG_OPEN_NOTIFICATION_PANEL);
+ }
+
+ public void animateCollapse() {
+ mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PANEL);
+ mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
+ }
+
+ // called by StatusBar
+ @Override
+ public void setLightsOn(boolean on) {
+ mHandler.removeMessages(MSG_SHOW_SHADOWS);
+ mHandler.removeMessages(MSG_HIDE_SHADOWS);
+ mHandler.sendEmptyMessage(on ? MSG_HIDE_SHADOWS : MSG_SHOW_SHADOWS);
+ }
+
+ public void setMenuKeyVisible(boolean visible) {
+ if (DEBUG) {
+ Slog.d(TAG, (visible?"showing":"hiding") + " the MENU button");
+ }
+ mMenuButton.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+ public void setIMEButtonVisible(IBinder token, boolean visible) {
+ if (DEBUG) {
+ Slog.d(TAG, (visible?"showing":"hiding") + " the IME button");
+ }
+ mInputMethodSwitchButton.setIMEButtonVisible(token, visible);
+ mInputMethodShortcutButton.setIMEButtonVisible(token, visible);
+ mBackButton.setImageResource(
+ visible ? R.drawable.ic_sysbar_back_ime : R.drawable.ic_sysbar_back);
+ }
+
+ private boolean isImmersive() {
+ try {
+ return ActivityManagerNative.getDefault().isTopActivityImmersive();
+ //Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive"));
+ } catch (RemoteException ex) {
+ // the end is nigh
+ return false;
+ }
+ }
+
+ private void setAreThereNotifications() {
+ final boolean hasClearable = mNotns.hasClearableItems();
+
+ //Slog.d(TAG, "setAreThereNotifications hasClerable=" + hasClearable);
+
+ /*
+ mOngoingTitle.setVisibility(ongoing ? View.VISIBLE : View.GONE);
+ mLatestTitle.setVisibility(latest ? View.VISIBLE : View.GONE);
+
+ if (ongoing || latest) {
+ mNoNotificationsTitle.setVisibility(View.GONE);
+ } else {
+ mNoNotificationsTitle.setVisibility(View.VISIBLE);
+ }
+ */
+ }
+
+ /**
+ * Cancel this notification and tell the status bar service about the failure. Hold no locks.
+ */
+ void handleNotificationError(IBinder key, StatusBarNotification n, String message) {
+ removeNotification(key);
+ try {
+ mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message);
+ } catch (RemoteException ex) {
+ // The end is nigh.
+ }
+ }
+
+ private View.OnClickListener mOnClickListener = new View.OnClickListener() {
+ public void onClick(View v) {
+ if (v == mNotificationTrigger) {
+ onClickNotificationTrigger();
+ } else if (v == mRecentButton) {
+ onClickRecentButton();
+ }
+ }
+ };
+
+ public void onClickNotificationTrigger() {
+ if (DEBUG) Slog.d(TAG, "clicked notification icons; disabled=" + mDisabled);
+ if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) {
+ if (!mNotificationsOn) {
+ mNotificationsOn = true;
+ mIconLayout.setVisibility(View.VISIBLE); // TODO: animation
+ refreshNotificationTrigger();
+ } else {
+ int msg = (mNotificationPanel.getVisibility() == View.GONE)
+ ? MSG_OPEN_NOTIFICATION_PANEL
+ : MSG_CLOSE_NOTIFICATION_PANEL;
+ mHandler.removeMessages(msg);
+ mHandler.sendEmptyMessage(msg);
+ }
+ }
+ }
+
+ public void onClickRecentButton() {
+ if (DEBUG) Slog.d(TAG, "clicked recent apps; disabled=" + mDisabled);
+ if (mRecentsPanel == null) {
+ Intent intent = new Intent();
+ intent.setClass(mContext, RecentApplicationsActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ mContext.startActivity(intent);
+ } else {
+ if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) {
+ int msg = (mRecentsPanel.getVisibility() == View.GONE)
+ ? MSG_OPEN_RECENTS_PANEL
+ : MSG_CLOSE_RECENTS_PANEL;
+ mHandler.removeMessages(msg);
+ mHandler.sendEmptyMessage(msg);
+ }
+ }
+ }
+
+ private class NotificationClicker implements View.OnClickListener {
+ private PendingIntent mIntent;
+ private String mPkg;
+ private String mTag;
+ private int mId;
+
+ NotificationClicker(PendingIntent intent, String pkg, String tag, int id) {
+ mIntent = intent;
+ mPkg = pkg;
+ mTag = tag;
+ mId = id;
+ }
+
+ public void onClick(View v) {
+ try {
+ // The intent we are sending is for the application, which
+ // won't have permission to immediately start an activity after
+ // the user switches to home. We know it is safe to do at this
+ // point, so make sure new activity switches are now allowed.
+ ActivityManagerNative.getDefault().resumeAppSwitches();
+ } catch (RemoteException e) {
+ }
+
+ if (mIntent != null) {
+ int[] pos = new int[2];
+ v.getLocationOnScreen(pos);
+ Intent overlay = new Intent();
+ overlay.setSourceBounds(
+ new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight()));
+ try {
+ mIntent.send(mContext, 0, overlay);
+ } catch (PendingIntent.CanceledException e) {
+ // the stack trace isn't very helpful here. Just log the exception message.
+ Slog.w(TAG, "Sending contentIntent failed: " + e);
+ }
+ }
+
+ try {
+ mBarService.onNotificationClick(mPkg, mTag, mId);
+ } catch (RemoteException ex) {
+ // system process is dead if we're here.
+ }
+
+ // close the shade if it was open
+ animateCollapse();
+
+ // If this click was on the intruder alert, hide that instead
+// mHandler.sendEmptyMessage(MSG_HIDE_INTRUDER);
+ }
+ }
+
+ StatusBarNotification removeNotificationViews(IBinder key) {
+ NotificationData.Entry entry = mNotns.remove(key);
+ if (entry == null) {
+ Slog.w(TAG, "removeNotification for unknown key: " + key);
+ return null;
+ }
+ // Remove the expanded view.
+ ViewGroup rowParent = (ViewGroup)entry.row.getParent();
+ if (rowParent != null) rowParent.removeView(entry.row);
+
+ if (key == mNotificationPeekKey) {
+ // must close the peek as well, since it's gone
+ mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK);
+ }
+ // Remove the icon.
+// ViewGroup iconParent = (ViewGroup)entry.icon.getParent();
+// if (iconParent != null) iconParent.removeView(entry.icon);
+ refreshIcons();
+
+ return entry.notification;
+ }
+
+ private class NotificationIconTouchListener implements View.OnTouchListener {
+ VelocityTracker mVT;
+
+ public NotificationIconTouchListener() {
+ }
+
+ public boolean onTouch(View v, MotionEvent event) {
+ boolean peeking = mNotificationPeekWindow.getVisibility() != View.GONE;
+ boolean panelShowing = mNotificationPanel.getVisibility() != View.GONE;
+ if (panelShowing) return false;
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ mVT = VelocityTracker.obtain();
+
+ // fall through
+ case MotionEvent.ACTION_OUTSIDE:
+ case MotionEvent.ACTION_MOVE:
+ // peek and switch icons if necessary
+ int numIcons = mIconLayout.getChildCount();
+ int peekIndex = (int)((float)event.getX() * numIcons / mIconLayout.getWidth());
+ if (peekIndex > numIcons - 1) peekIndex = numIcons - 1;
+ else if (peekIndex < 0) peekIndex = 0;
+
+ if (!peeking || mNotificationPeekIndex != peekIndex) {
+ if (DEBUG) Slog.d(TAG, "will peek at notification #" + peekIndex);
+ Message peekMsg = mHandler.obtainMessage(MSG_OPEN_NOTIFICATION_PEEK);
+ peekMsg.arg1 = peekIndex;
+
+ mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
+
+ // no delay if we're scrubbing left-right
+ mHandler.sendMessage(peekMsg);
+ }
+
+ // check for fling
+ if (mVT != null) {
+ mVT.addMovement(event);
+ mVT.computeCurrentVelocity(1000);
+ // require a little more oomph once we're already in peekaboo mode
+ if (!panelShowing && (
+ (peeking && mVT.getYVelocity() < -mNotificationFlingVelocity*3)
+ || (mVT.getYVelocity() < -mNotificationFlingVelocity))) {
+ mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
+ mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK);
+ mHandler.sendEmptyMessage(MSG_OPEN_NOTIFICATION_PANEL);
+ }
+ }
+ return true;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
+ if (peeking) {
+ mHandler.sendEmptyMessageDelayed(MSG_CLOSE_NOTIFICATION_PEEK, 5000);
+ }
+ mVT.recycle();
+ mVT = null;
+ return true;
+ }
+ return false;
+ }
+ }
+
+ StatusBarIconView addNotificationViews(IBinder key, StatusBarNotification notification) {
+ if (DEBUG) {
+ Slog.d(TAG, "addNotificationViews(key=" + key + ", notification=" + notification);
+ }
+ // Construct the icon.
+ final StatusBarIconView iconView = new StatusBarIconView(mContext,
+ notification.pkg + "/0x" + Integer.toHexString(notification.id));
+ iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+
+ final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
+ notification.notification.icon,
+ notification.notification.iconLevel,
+ notification.notification.number);
+ if (!iconView.set(ic)) {
+ handleNotificationError(key, notification, "Couldn't attach StatusBarIcon: " + ic);
+ return null;
+ }
+ // Construct the expanded view.
+ NotificationData.Entry entry = new NotificationData.Entry(key, notification, iconView);
+ if (!inflateViews(entry, mPile)) {
+ handleNotificationError(key, notification, "Couldn't expand RemoteViews for: "
+ + notification);
+ return null;
+ }
+
+ // Add the icon.
+ mNotns.add(entry);
+ refreshIcons();
+
+ return iconView;
+ }
+
+ private void refreshIcons() {
+ // XXX: need to implement a new limited linear layout class
+ // to avoid removing & readding everything
+
+ final int ICON_LIMIT = 4;
+ final LinearLayout.LayoutParams params
+ = new LinearLayout.LayoutParams(mIconSize, mIconSize);
+
+ int N = mNotns.size();
+
+ if (DEBUG) {
+ Slog.d(TAG, "refreshing icons: " + N + " notifications, mIconLayout=" + mIconLayout);
+ }
+
+ ArrayList<View> toShow = new ArrayList<View>();
+
+ for (int i=0; i<ICON_LIMIT; i++) {
+ if (i>=N) break;
+ toShow.add(mNotns.get(N-i-1).icon);
+ }
+
+ ArrayList<View> toRemove = new ArrayList<View>();
+ for (int i=0; i<mIconLayout.getChildCount(); i++) {
+ View child = mIconLayout.getChildAt(i);
+ if (!toShow.contains(child)) {
+ toRemove.add(child);
+ }
+ }
+
+ for (View remove : toRemove) {
+ mIconLayout.removeView(remove);
+ }
+
+ for (int i=0; i<toShow.size(); i++) {
+ View v = toShow.get(i);
+ if (v.getParent() == null) {
+ mIconLayout.addView(toShow.get(i), i, params);
+ }
+ }
+
+ loadNotificationPanel();
+ refreshNotificationTrigger();
+ }
+
+ private void loadNotificationPanel() {
+ int N = mNotns.size();
+
+ ArrayList<View> toShow = new ArrayList<View>();
+
+ for (int i=0; i<N; i++) {
+ View row = mNotns.get(N-i-1).row;
+ toShow.add(row);
+ }
+
+ ArrayList<View> toRemove = new ArrayList<View>();
+ for (int i=0; i<mPile.getChildCount(); i++) {
+ View child = mPile.getChildAt(i);
+ if (!toShow.contains(child)) {
+ toRemove.add(child);
+ }
+ }
+
+ for (View remove : toRemove) {
+ mPile.removeView(remove);
+ }
+
+ for (int i=0; i<toShow.size(); i++) {
+ View v = toShow.get(i);
+ if (v.getParent() == null) {
+ mPile.addView(toShow.get(i));
+ }
+ }
+ }
+
+ void workAroundBadLayerDrawableOpacity(View v) {
+ LayerDrawable d = (LayerDrawable)v.getBackground();
+ v.setBackgroundDrawable(null);
+ d.setOpacity(PixelFormat.TRANSLUCENT);
+ v.setBackgroundDrawable(d);
+ }
+
+ private boolean inflateViews(NotificationData.Entry entry, ViewGroup parent) {
+ StatusBarNotification sbn = entry.notification;
+ RemoteViews remoteViews = sbn.notification.contentView;
+ if (remoteViews == null) {
+ return false;
+ }
+
+ // create the row view
+ LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ View row = inflater.inflate(R.layout.status_bar_notification_row, parent, false);
+ workAroundBadLayerDrawableOpacity(row);
+ View vetoButton = row.findViewById(R.id.veto);
+ if (entry.notification.isClearable()) {
+ final String _pkg = sbn.pkg;
+ final String _tag = sbn.tag;
+ final int _id = sbn.id;
+ vetoButton.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ try {
+ mBarService.onNotificationClear(_pkg, _tag, _id);
+ } catch (RemoteException ex) {
+ // system process is dead if we're here.
+ }
+ }
+ });
+ } else {
+ vetoButton.setVisibility(View.INVISIBLE);
+ }
+
+ // the large icon
+ ImageView largeIcon = (ImageView)row.findViewById(R.id.large_icon);
+ if (sbn.notification.largeIcon != null) {
+ largeIcon.setImageBitmap(sbn.notification.largeIcon);
+ } else {
+ largeIcon.getLayoutParams().width = 0;
+ largeIcon.setVisibility(View.INVISIBLE);
+ }
+
+ // bind the click event to the content area
+ ViewGroup content = (ViewGroup)row.findViewById(R.id.content);
+ // XXX: update to allow controls within notification views
+ content.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
+// content.setOnFocusChangeListener(mFocusChangeListener);
+ PendingIntent contentIntent = sbn.notification.contentIntent;
+ if (contentIntent != null) {
+ content.setOnClickListener(new NotificationClicker(contentIntent,
+ sbn.pkg, sbn.tag, sbn.id));
+ } else {
+ content.setOnClickListener(null);
+ }
+
+ View expanded = null;
+ Exception exception = null;
+ try {
+ expanded = remoteViews.apply(mContext, content);
+ }
+ catch (RuntimeException e) {
+ exception = e;
+ }
+ if (expanded == null) {
+ final String ident = sbn.pkg + "/0x" + Integer.toHexString(sbn.id);
+ Slog.e(TAG, "couldn't inflate view for notification " + ident, exception);
+ return false;
+ } else {
+ content.addView(expanded);
+ row.setDrawingCacheEnabled(true);
+ }
+
+ entry.row = row;
+ entry.content = content;
+ entry.expanded = expanded;
+
+ return true;
+ }
+
+ public class ShadowController {
+ boolean mShowShadows;
+ Map<View, View> mShadowsForElements = new IdentityHashMap<View, View>(7);
+ Map<View, View> mElementsForShadows = new IdentityHashMap<View, View>(7);
+ LayoutTransition mElementTransition, mShadowTransition;
+
+ View mTouchTarget;
+
+ ShadowController(boolean showShadows) {
+ mShowShadows = showShadows;
+ mTouchTarget = null;
+
+ mElementTransition = new LayoutTransition();
+// AnimatorSet s = new AnimatorSet();
+// s.play(ObjectAnimator.ofInt(null, "top", 48, 0))
+// .with(ObjectAnimator.ofFloat(null, "scaleY", 0.5f, 1f))
+// .with(ObjectAnimator.ofFloat(null, "alpha", 0.5f, 1f))
+// ;
+ mElementTransition.setAnimator(LayoutTransition.APPEARING, //s);
+ ObjectAnimator.ofInt(null, "top", 48, 0));
+ mElementTransition.setDuration(LayoutTransition.APPEARING, 100);
+ mElementTransition.setStartDelay(LayoutTransition.APPEARING, 0);
+
+// s = new AnimatorSet();
+// s.play(ObjectAnimator.ofInt(null, "top", 0, 48))
+// .with(ObjectAnimator.ofFloat(null, "scaleY", 1f, 0.5f))
+// .with(ObjectAnimator.ofFloat(null, "alpha", 1f, 0.5f))
+// ;
+ mElementTransition.setAnimator(LayoutTransition.DISAPPEARING, //s);
+ ObjectAnimator.ofInt(null, "top", 0, 48));
+ mElementTransition.setDuration(LayoutTransition.DISAPPEARING, 400);
+
+ mShadowTransition = new LayoutTransition();
+ mShadowTransition.setAnimator(LayoutTransition.APPEARING,
+ ObjectAnimator.ofFloat(null, "alpha", 0f, 1f));
+ mShadowTransition.setDuration(LayoutTransition.APPEARING, 200);
+ mShadowTransition.setStartDelay(LayoutTransition.APPEARING, 100);
+ mShadowTransition.setAnimator(LayoutTransition.DISAPPEARING,
+ ObjectAnimator.ofFloat(null, "alpha", 1f, 0f));
+ mShadowTransition.setDuration(LayoutTransition.DISAPPEARING, 100);
+
+ ViewGroup bar = (ViewGroup) TabletStatusBar.this.mBarContents;
+ bar.setLayoutTransition(mElementTransition);
+ ViewGroup nav = (ViewGroup) TabletStatusBar.this.mNavigationArea;
+ nav.setLayoutTransition(mElementTransition);
+ ViewGroup shadowGroup = (ViewGroup) bar.findViewById(R.id.shadows);
+ shadowGroup.setLayoutTransition(mShadowTransition);
+ }
+
+ public void add(View element, View shadow) {
+ shadow.setOnTouchListener(makeTouchListener());
+ mShadowsForElements.put(element, shadow);
+ mElementsForShadows.put(shadow, element);
+ }
+
+ public boolean getShadowState() {
+ return mShowShadows;
+ }
+
+ public View.OnTouchListener makeTouchListener() {
+ return new View.OnTouchListener() {
+ public boolean onTouch(View v, MotionEvent ev) {
+ final int action = ev.getAction();
+
+ if (DEBUG) Slog.d(TAG, "ShadowController: v=" + v + ", ev=" + ev);
+
+ // currently redirecting events?
+ if (mTouchTarget == null) {
+ mTouchTarget = mElementsForShadows.get(v);
+ }
+
+ if (mTouchTarget != null && mTouchTarget.getVisibility() != View.GONE) {
+ boolean last = false;
+ switch (action) {
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ mHandler.removeMessages(MSG_RESTORE_SHADOWS);
+ if (mShowShadows) {
+ mHandler.sendEmptyMessageDelayed(MSG_RESTORE_SHADOWS,
+ v == mNotificationShadow ? 5000 : 500);
+ }
+ last = true;
+ break;
+ case MotionEvent.ACTION_DOWN:
+ mHandler.removeMessages(MSG_RESTORE_SHADOWS);
+ setElementShadow(mTouchTarget, false);
+ break;
+ }
+ mTouchTarget.dispatchTouchEvent(ev);
+ if (last) mTouchTarget = null;
+ return true;
+ }
+
+ return false;
+ }
+ };
+ }
+
+ public void refresh() {
+ for (View element : mShadowsForElements.keySet()) {
+ setElementShadow(element, mShowShadows);
+ }
+ }
+
+ public void showAllShadows() {
+ mShowShadows = true;
+ refresh();
+ }
+
+ public void hideAllShadows() {
+ mShowShadows = false;
+ refresh();
+ }
+
+ // Use View.INVISIBLE for things hidden due to shadowing, and View.GONE for things that are
+ // disabled (and should not be shadowed or re-shown)
+ public void setElementShadow(View button, boolean shade) {
+ View shadow = mShadowsForElements.get(button);
+ if (shadow != null) {
+ if (button.getVisibility() != View.GONE) {
+ shadow.setVisibility(shade ? View.VISIBLE : View.INVISIBLE);
+ button.setVisibility(shade ? View.INVISIBLE : View.VISIBLE);
+ }
+ }
+ }
+
+ // Hide both element and shadow, using default layout animations.
+ public void hideElement(View button) {
+ Slog.d(TAG, "hiding: " + button);
+ View shadow = mShadowsForElements.get(button);
+ if (shadow != null) {
+ shadow.setVisibility(View.GONE);
+ }
+ button.setVisibility(View.GONE);
+ }
+
+ // Honoring the current shadow state.
+ public void showElement(View button) {
+ Slog.d(TAG, "showing: " + button);
+ View shadow = mShadowsForElements.get(button);
+ if (shadow != null) {
+ shadow.setVisibility(mShowShadows ? View.VISIBLE : View.INVISIBLE);
+ }
+ button.setVisibility(mShowShadows ? View.INVISIBLE : View.VISIBLE);
+ }
+ }
+
+ public class TouchOutsideListener implements View.OnTouchListener {
+ private int mMsg;
+ private StatusBarPanel mPanel;
+
+ public TouchOutsideListener(int msg, StatusBarPanel panel) {
+ mMsg = msg;
+ mPanel = panel;
+ }
+
+ public boolean onTouch(View v, MotionEvent ev) {
+ final int action = ev.getAction();
+ if (action == MotionEvent.ACTION_OUTSIDE
+ || (action == MotionEvent.ACTION_DOWN
+ && !mPanel.isInContentArea((int)ev.getX(), (int)ev.getY()))) {
+ mHandler.removeMessages(mMsg);
+ mHandler.sendEmptyMessage(mMsg);
+ return true;
+ }
+ return false;
+ }
+ }
+
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.print("mDisabled=0x");
+ pw.println(Integer.toHexString(mDisabled));
+ }
+}
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java
new file mode 100644
index 0000000..823b793
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import android.content.Context;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.view.View;
+import android.view.MotionEvent;
+import android.widget.FrameLayout;
+
+public class TabletStatusBarView extends FrameLayout {
+ private Handler mHandler;
+
+ private View[] mIgnoreChildren = new View[3];
+ private View[] mPanels = new View[3];
+ private int[] mPos = new int[2];
+
+ public TabletStatusBarView(Context context) {
+ super(context);
+ }
+
+ public TabletStatusBarView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+ if (TabletStatusBar.DEBUG) {
+ Slog.d(TabletStatusBar.TAG, "TabletStatusBarView intercepting touch event: " + ev);
+ }
+ mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL);
+ mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL);
+ mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL);
+ mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL);
+
+ for (int i=0; i < mPanels.length; i++) {
+ if (mPanels[i] != null && mPanels[i].getVisibility() == View.VISIBLE) {
+ if (eventInside(mIgnoreChildren[i], ev)) {
+ if (TabletStatusBar.DEBUG) {
+ Slog.d(TabletStatusBar.TAG, "TabletStatusBarView eating event for view: " + mIgnoreChildren[i]);
+ }
+ return true;
+ }
+ }
+ }
+ }
+ return super.onInterceptTouchEvent(ev);
+ }
+
+ private boolean eventInside(View v, MotionEvent ev) {
+ // assume that x and y are window coords because we are.
+ final int x = (int)ev.getX();
+ final int y = (int)ev.getY();
+
+ final int[] p = mPos;
+ v.getLocationInWindow(p);
+
+ final int l = p[0];
+ final int t = p[1];
+ final int r = p[0] + v.getWidth();
+ final int b = p[1] + v.getHeight();
+
+ return x >= l && x < r && y >= t && y < b;
+ }
+
+ public void setHandler(Handler h) {
+ mHandler = h;
+ }
+
+ public void setIgnoreChildren(int index, View ignore, View panel) {
+ mIgnoreChildren[index] = ignore;
+ mPanels[index] = panel;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java
new file mode 100644
index 0000000..b3aed03
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2010 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.tablet;
+
+import java.util.Arrays;
+
+import android.app.Notification;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.util.Slog;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.WindowManagerImpl;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.internal.statusbar.StatusBarNotification;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.StatusBarIconView;
+
+public class TabletTicker extends Handler {
+ private static final String TAG = "StatusBar.TabletTicker";
+
+ // 3 is enough to let us see most cases, but not get so far behind that it's too annoying.
+ private static final int QUEUE_LENGTH = 3;
+
+ private static final int MSG_ADVANCE = 1;
+
+ private static final int ADVANCE_DELAY = 5000; // 5 seconds
+
+ private Context mContext;
+
+ private ViewGroup mWindow;
+ private IBinder mCurrentKey;
+ private StatusBarNotification mCurrentNotification;
+ private View mCurrentView;
+
+ private IBinder[] mKeys = new IBinder[QUEUE_LENGTH];
+ private StatusBarNotification[] mQueue = new StatusBarNotification[QUEUE_LENGTH];
+ private int mQueuePos;
+
+ public TabletTicker(Context context) {
+ mContext = context;
+ }
+
+ public void add(IBinder key, StatusBarNotification notification) {
+ if (false) {
+ Slog.d(TAG, "add 1 mCurrentNotification=" + mCurrentNotification
+ + " mQueuePos=" + mQueuePos + " mQueue=" + Arrays.toString(mQueue));
+ }
+
+ // If it's already in here, remove whatever's in there and put the new one at the end.
+ remove(key, false);
+
+ mKeys[mQueuePos] = key;
+ mQueue[mQueuePos] = notification;
+
+ // If nothing is running now, start the next one.
+ if (mQueuePos == 0 && mCurrentNotification == null) {
+ sendEmptyMessage(MSG_ADVANCE);
+ }
+
+ if (mQueuePos < QUEUE_LENGTH - 1) {
+ mQueuePos++;
+ }
+ }
+
+ public void remove(IBinder key) {
+ remove(key, true);
+ }
+
+ public void remove(IBinder key, boolean advance) {
+ if (mCurrentKey == key) {
+ Slog.d(TAG, "removed current");
+ // Showing now
+ if (advance) {
+ removeMessages(MSG_ADVANCE);
+ sendEmptyMessage(MSG_ADVANCE);
+ }
+ } else {
+ // In the queue
+ for (int i=0; i<QUEUE_LENGTH; i++) {
+ if (mKeys[i] == key) {
+ Slog.d(TAG, "removed from queue: " + i);
+ for (; i<QUEUE_LENGTH-1; i++) {
+ mKeys[i] = mKeys[i+1];
+ mQueue[i] = mQueue[i+1];
+ }
+ mKeys[QUEUE_LENGTH-1] = null;
+ mQueue[QUEUE_LENGTH-1] = null;
+ if (mQueuePos > 0) {
+ mQueuePos--;
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ public void halt() {
+ removeMessages(MSG_ADVANCE);
+ if (mCurrentView != null || mQueuePos != 0) {
+ for (int i=0; i<QUEUE_LENGTH; i++) {
+ mKeys[i] = null;
+ mQueue[i] = null;
+ }
+ mQueuePos = 0;
+ sendEmptyMessage(MSG_ADVANCE);
+ }
+ }
+
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_ADVANCE:
+ advance();
+ break;
+ }
+ }
+
+ private void advance() {
+ // Out with the old...
+ if (mCurrentView != null) {
+ mWindow.removeView(mCurrentView);
+ mCurrentView = null;
+ mCurrentKey = null;
+ mCurrentNotification = null;
+ }
+
+ // In with the new...
+ dequeue();
+ while (mCurrentNotification != null) {
+ mCurrentView = makeTickerView(mCurrentNotification);
+ if (mCurrentView != null) {
+ if (mWindow == null) {
+ mWindow = makeWindow();
+ WindowManagerImpl.getDefault().addView(mWindow, mWindow.getLayoutParams());
+ }
+ mWindow.addView(mCurrentView);
+ sendEmptyMessageDelayed(MSG_ADVANCE, ADVANCE_DELAY);
+ break;
+ }
+ dequeue();
+ }
+
+ // if there's nothing left, close the window
+ // TODO: Do this when the animation is done instead
+ if (mCurrentView == null && mWindow != null) {
+ WindowManagerImpl.getDefault().removeView(mWindow);
+ mWindow = null;
+ }
+ }
+
+ private void dequeue() {
+ mCurrentKey = mKeys[0];
+ mCurrentNotification = mQueue[0];
+ if (false) {
+ Slog.d(TAG, "dequeue mQueuePos=" + mQueuePos + " mQueue=" + Arrays.toString(mQueue));
+ }
+ final int N = mQueuePos;
+ for (int i=0; i<N; i++) {
+ mKeys[i] = mKeys[i+1];
+ mQueue[i] = mQueue[i+1];
+ }
+ mKeys[N] = null;
+ mQueue[N] = null;
+ if (mQueuePos > 0) {
+ mQueuePos--;
+ }
+ }
+
+ private ViewGroup makeWindow() {
+ final Resources res = mContext.getResources();
+ final FrameLayout view = new FrameLayout(mContext);
+ final int width = res.getDimensionPixelSize(R.dimen.notification_ticker_width);
+ final int height = res.getDimensionPixelSize(R.dimen.notification_large_icon_height);
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams(width, height,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
+ PixelFormat.TRANSLUCENT);
+ lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
+ lp.setTitle("NotificationTicker");
+ view.setLayoutParams(lp);
+ return view;
+ }
+
+ private View makeTickerView(StatusBarNotification notification) {
+ final Notification n = notification.notification;
+
+ LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+
+ ViewGroup group;
+ int layoutId;
+ int iconId;
+ if (n.largeIcon != null) {
+ iconId = R.id.right_icon;
+ } else {
+ iconId = R.id.left_icon;
+ }
+ if (n.tickerView != null) {
+ group = (ViewGroup)inflater.inflate(R.layout.status_bar_ticker_panel, null, false);
+ View expanded = null;
+ Exception exception = null;
+ try {
+ expanded = n.tickerView.apply(mContext, group);
+ }
+ catch (RuntimeException e) {
+ exception = e;
+ }
+ if (expanded == null) {
+ final String ident = notification.pkg
+ + "/0x" + Integer.toHexString(notification.id);
+ Slog.e(TAG, "couldn't inflate view for notification " + ident, exception);
+ return null;
+ }
+ final int statusBarHeight = mContext.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.status_bar_height);
+ LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT, statusBarHeight, 1.0f);
+ lp.gravity = Gravity.BOTTOM;
+ group.addView(expanded, lp);
+ } else if (n.tickerText != null) {
+ group = (ViewGroup)inflater.inflate(R.layout.status_bar_ticker_compat, mWindow, false);
+ final Drawable icon = StatusBarIconView.getIcon(mContext,
+ new StatusBarIcon(notification.pkg, n.icon, n.iconLevel, 0));
+ ImageView iv = (ImageView)group.findViewById(iconId);
+ iv.setImageDrawable(icon);
+ iv.setVisibility(View.VISIBLE);
+ TextView tv = (TextView)group.findViewById(R.id.text);
+ tv.setText(n.tickerText);
+ } else {
+ throw new RuntimeException("tickerView==null && tickerText==null");
+ }
+ ImageView largeIcon = (ImageView)group.findViewById(R.id.large_icon);
+ if (n.largeIcon != null) {
+ largeIcon.setImageBitmap(n.largeIcon);
+ largeIcon.setVisibility(View.VISIBLE);
+ }
+ return group;
+ }
+}
+
diff --git a/packages/TtsService/jni/Android.mk b/packages/TtsService/jni/Android.mk
index b41759a..5dc0c30 100755
--- a/packages/TtsService/jni/Android.mk
+++ b/packages/TtsService/jni/Android.mk
@@ -5,6 +5,7 @@ LOCAL_SRC_FILES:= \
android_tts_SynthProxy.cpp
LOCAL_C_INCLUDES += \
+ frameworks/base/native/include \
$(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := \
diff --git a/packages/TtsService/jni/android_tts_SynthProxy.cpp b/packages/TtsService/jni/android_tts_SynthProxy.cpp
index 1d69361..8dc88db 100644
--- a/packages/TtsService/jni/android_tts_SynthProxy.cpp
+++ b/packages/TtsService/jni/android_tts_SynthProxy.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009-2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@
#include <nativehelper/jni.h>
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
-#include <tts/TtsEngine.h>
+#include <android/tts.h>
#include <media/AudioTrack.h>
#include <math.h>
@@ -154,7 +154,7 @@ static Mutex engineMutex;
class SynthProxyJniStorage {
public :
jobject tts_ref;
- TtsEngine* mNativeSynthInterface;
+ android_tts_engine_t* mEngine;
void* mEngineLibHandle;
AudioTrack* mAudioOut;
int8_t mPlayState;
@@ -168,7 +168,7 @@ class SynthProxyJniStorage {
SynthProxyJniStorage() {
tts_ref = NULL;
- mNativeSynthInterface = NULL;
+ mEngine = NULL;
mEngineLibHandle = NULL;
mAudioOut = NULL;
mPlayState = SYNTHPLAYSTATE_IS_STOPPED;
@@ -184,9 +184,9 @@ class SynthProxyJniStorage {
~SynthProxyJniStorage() {
//LOGV("entering ~SynthProxyJniStorage()");
killAudio();
- if (mNativeSynthInterface) {
- mNativeSynthInterface->shutdown();
- mNativeSynthInterface = NULL;
+ if (mEngine) {
+ mEngine->funcs->shutdown(mEngine);
+ mEngine = NULL;
}
if (mEngineLibHandle) {
//LOGE("~SynthProxyJniStorage(): before close library");
@@ -273,28 +273,45 @@ void prepAudioTrack(SynthProxyJniStorage* pJniData, AudioSystem::stream_type str
* Callback from TTS engine.
* Directly speaks using AudioTrack or write to file
*/
-static tts_callback_status ttsSynthDoneCB(void *& userdata, uint32_t rate,
- uint32_t format, int channel,
- int8_t *&wav, size_t &bufferSize, tts_synth_status status) {
+extern "C" android_tts_callback_status_t
+__ttsSynthDoneCB(void ** pUserdata, uint32_t rate,
+ android_tts_audio_format_t format, int channel,
+ int8_t **pWav, size_t *pBufferSize,
+ android_tts_synth_status_t status)
+{
//LOGV("ttsSynthDoneCallback: %d bytes", bufferSize);
+ AudioSystem::audio_format encoding;
- if (userdata == NULL){
+ if (*pUserdata == NULL){
LOGE("userdata == NULL");
- return TTS_CALLBACK_HALT;
+ return ANDROID_TTS_CALLBACK_HALT;
+ }
+ switch (format) {
+ case ANDROID_TTS_AUDIO_FORMAT_PCM_8_BIT:
+ encoding = AudioSystem::PCM_8_BIT;
+ break;
+ case ANDROID_TTS_AUDIO_FORMAT_PCM_16_BIT:
+ encoding = AudioSystem::PCM_16_BIT;
+ break;
+ default:
+ LOGE("Can't play, bad format");
+ return ANDROID_TTS_CALLBACK_HALT;
}
- afterSynthData_t* pForAfter = (afterSynthData_t*)userdata;
+ afterSynthData_t* pForAfter = (afterSynthData_t*) *pUserdata;
SynthProxyJniStorage* pJniData = (SynthProxyJniStorage*)(pForAfter->jniStorage);
if (pForAfter->usageMode == USAGEMODE_PLAY_IMMEDIATELY){
//LOGV("Direct speech");
- if (wav == NULL) {
+ if (*pWav == NULL) {
delete pForAfter;
+ pForAfter = NULL;
LOGV("Null: speech has completed");
+ return ANDROID_TTS_CALLBACK_HALT;
}
- if (bufferSize > 0) {
- prepAudioTrack(pJniData, pForAfter->streamType, rate, (AudioSystem::audio_format)format, channel);
+ if (*pBufferSize > 0) {
+ prepAudioTrack(pJniData, pForAfter->streamType, rate, encoding, channel);
if (pJniData->mAudioOut) {
pJniData->mPlayLock.lock();
if(pJniData->mAudioOut->stopped()
@@ -303,28 +320,31 @@ static tts_callback_status ttsSynthDoneCB(void *& userdata, uint32_t rate,
}
pJniData->mPlayLock.unlock();
if (bUseFilter) {
- applyFilter((int16_t*)wav, bufferSize/2);
+ applyFilter((int16_t*)*pWav, *pBufferSize/2);
}
- pJniData->mAudioOut->write(wav, bufferSize);
- memset(wav, 0, bufferSize);
+ pJniData->mAudioOut->write(*pWav, *pBufferSize);
+ memset(*pWav, 0, *pBufferSize);
//LOGV("AudioTrack wrote: %d bytes", bufferSize);
} else {
LOGE("Can't play, null audiotrack");
+ delete pForAfter;
+ pForAfter = NULL;
+ return ANDROID_TTS_CALLBACK_HALT;
}
}
} else if (pForAfter->usageMode == USAGEMODE_WRITE_TO_FILE) {
//LOGV("Save to file");
- if (wav == NULL) {
+ if (*pWav == NULL) {
delete pForAfter;
LOGV("Null: speech has completed");
- return TTS_CALLBACK_HALT;
+ return ANDROID_TTS_CALLBACK_HALT;
}
- if (bufferSize > 0){
+ if (*pBufferSize > 0){
if (bUseFilter) {
- applyFilter((int16_t*)wav, bufferSize/2);
+ applyFilter((int16_t*)*pWav, *pBufferSize/2);
}
- fwrite(wav, 1, bufferSize, pForAfter->outputFile);
- memset(wav, 0, bufferSize);
+ fwrite(*pWav, 1, *pBufferSize, pForAfter->outputFile);
+ memset(*pWav, 0, *pBufferSize);
}
}
// Future update:
@@ -332,7 +352,7 @@ static tts_callback_status ttsSynthDoneCB(void *& userdata, uint32_t rate,
// javaTTSFields.synthProxyMethodPost methode to notify
// playback has completed if the synthesis is done or if a marker has been reached.
- if (status == TTS_SYNTH_DONE) {
+ if (status == ANDROID_TTS_SYNTH_DONE) {
// this struct was allocated in the original android_tts_SynthProxy_speak call,
// all processing matching this call is now done.
LOGV("Speech synthesis done.");
@@ -342,16 +362,16 @@ static tts_callback_status ttsSynthDoneCB(void *& userdata, uint32_t rate,
delete pForAfter;
pForAfter = NULL;
}
- return TTS_CALLBACK_HALT;
+ return ANDROID_TTS_CALLBACK_HALT;
}
// we don't update the wav (output) parameter as we'll let the next callback
// write at the same location, we've consumed the data already, but we need
// to update bufferSize to let the TTS engine know how much it can write the
// next time it calls this function.
- bufferSize = pJniData->mBufferSize;
+ *pBufferSize = pJniData->mBufferSize;
- return TTS_CALLBACK_CONTINUE;
+ return ANDROID_TTS_CALLBACK_CONTINUE;
}
@@ -360,7 +380,7 @@ static int
android_tts_SynthProxy_setLowShelf(JNIEnv *env, jobject thiz, jboolean applyFilter,
jfloat filterGain, jfloat attenuationInDb, jfloat freqInHz, jfloat slope)
{
- int result = TTS_SUCCESS;
+ int result = ANDROID_TTS_SUCCESS;
bUseFilter = applyFilter;
if (applyFilter) {
@@ -373,7 +393,7 @@ android_tts_SynthProxy_setLowShelf(JNIEnv *env, jobject thiz, jboolean applyFilt
initializeEQ();
} else {
LOGE("Invalid slope, can't be null");
- result = TTS_FAILURE;
+ result = ANDROID_TTS_FAILURE;
}
}
@@ -385,7 +405,7 @@ static int
android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz,
jobject weak_this, jstring nativeSoLib, jstring engConfig)
{
- int result = TTS_FAILURE;
+ int result = ANDROID_TTS_FAILURE;
bUseFilter = false;
@@ -402,18 +422,28 @@ android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz,
if (engine_lib_handle == NULL) {
LOGE("android_tts_SynthProxy_native_setup(): engine_lib_handle == NULL");
} else {
- TtsEngine *(*get_TtsEngine)() =
- reinterpret_cast<TtsEngine* (*)()>(dlsym(engine_lib_handle, "getTtsEngine"));
+ android_tts_engine_t * (*get_TtsEngine)() =
+ reinterpret_cast<android_tts_engine_t* (*)()>(dlsym(engine_lib_handle, "android_getTtsEngine"));
+
+ // Support obsolete/legacy binary modules
+ if (get_TtsEngine == NULL) {
+ get_TtsEngine =
+ reinterpret_cast<android_tts_engine_t* (*)()>(dlsym(engine_lib_handle, "getTtsEngine"));
+ }
- pJniStorage->mNativeSynthInterface = (*get_TtsEngine)();
+ pJniStorage->mEngine = (*get_TtsEngine)();
pJniStorage->mEngineLibHandle = engine_lib_handle;
- if (pJniStorage->mNativeSynthInterface) {
+ android_tts_engine_t *engine = pJniStorage->mEngine;
+ if (engine) {
Mutex::Autolock l(engineMutex);
- pJniStorage->mNativeSynthInterface->init(ttsSynthDoneCB, engConfigString);
+ engine->funcs->init(
+ engine,
+ __ttsSynthDoneCB,
+ engConfigString);
}
- result = TTS_SUCCESS;
+ result = ANDROID_TTS_SUCCESS;
}
// we use a weak reference so the SynthProxy object can be garbage collected.
@@ -462,7 +492,7 @@ static int
android_tts_SynthProxy_isLanguageAvailable(JNIEnv *env, jobject thiz, jint jniData,
jstring language, jstring country, jstring variant)
{
- int result = TTS_LANG_NOT_SUPPORTED;
+ int result = ANDROID_TTS_LANG_NOT_SUPPORTED;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_isLanguageAvailable(): invalid JNI data");
@@ -474,8 +504,10 @@ android_tts_SynthProxy_isLanguageAvailable(JNIEnv *env, jobject thiz, jint jniDa
const char *countryNativeString = env->GetStringUTFChars(country, 0);
const char *variantNativeString = env->GetStringUTFChars(variant, 0);
- if (pSynthData->mNativeSynthInterface) {
- result = pSynthData->mNativeSynthInterface->isLanguageAvailable(langNativeString,
+ android_tts_engine_t *engine = pSynthData->mEngine;
+
+ if (engine) {
+ result = engine->funcs->isLanguageAvailable(engine,langNativeString,
countryNativeString, variantNativeString);
}
env->ReleaseStringUTFChars(language, langNativeString);
@@ -487,7 +519,7 @@ android_tts_SynthProxy_isLanguageAvailable(JNIEnv *env, jobject thiz, jint jniDa
static int
android_tts_SynthProxy_setConfig(JNIEnv *env, jobject thiz, jint jniData, jstring engineConfig)
{
- int result = TTS_FAILURE;
+ int result = ANDROID_TTS_FAILURE;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_setConfig(): invalid JNI data");
@@ -498,9 +530,10 @@ android_tts_SynthProxy_setConfig(JNIEnv *env, jobject thiz, jint jniData, jstrin
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
const char *engineConfigNativeString = env->GetStringUTFChars(engineConfig, 0);
+ android_tts_engine_t *engine = pSynthData->mEngine;
- if (pSynthData->mNativeSynthInterface) {
- result = pSynthData->mNativeSynthInterface->setProperty(ANDROID_TTS_ENGINE_PROPERTY_CONFIG,
+ if (engine) {
+ result = engine->funcs->setProperty(engine,ANDROID_TTS_ENGINE_PROPERTY_CONFIG,
engineConfigNativeString, strlen(engineConfigNativeString));
}
env->ReleaseStringUTFChars(engineConfig, engineConfigNativeString);
@@ -512,7 +545,7 @@ static int
android_tts_SynthProxy_setLanguage(JNIEnv *env, jobject thiz, jint jniData,
jstring language, jstring country, jstring variant)
{
- int result = TTS_LANG_NOT_SUPPORTED;
+ int result = ANDROID_TTS_LANG_NOT_SUPPORTED;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_setLanguage(): invalid JNI data");
@@ -525,9 +558,10 @@ android_tts_SynthProxy_setLanguage(JNIEnv *env, jobject thiz, jint jniData,
const char *langNativeString = env->GetStringUTFChars(language, 0);
const char *countryNativeString = env->GetStringUTFChars(country, 0);
const char *variantNativeString = env->GetStringUTFChars(variant, 0);
+ android_tts_engine_t *engine = pSynthData->mEngine;
- if (pSynthData->mNativeSynthInterface) {
- result = pSynthData->mNativeSynthInterface->setLanguage(langNativeString,
+ if (engine) {
+ result = engine->funcs->setLanguage(engine, langNativeString,
countryNativeString, variantNativeString);
}
env->ReleaseStringUTFChars(language, langNativeString);
@@ -541,7 +575,7 @@ static int
android_tts_SynthProxy_loadLanguage(JNIEnv *env, jobject thiz, jint jniData,
jstring language, jstring country, jstring variant)
{
- int result = TTS_LANG_NOT_SUPPORTED;
+ int result = ANDROID_TTS_LANG_NOT_SUPPORTED;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_loadLanguage(): invalid JNI data");
@@ -552,9 +586,10 @@ android_tts_SynthProxy_loadLanguage(JNIEnv *env, jobject thiz, jint jniData,
const char *langNativeString = env->GetStringUTFChars(language, 0);
const char *countryNativeString = env->GetStringUTFChars(country, 0);
const char *variantNativeString = env->GetStringUTFChars(variant, 0);
+ android_tts_engine_t *engine = pSynthData->mEngine;
- if (pSynthData->mNativeSynthInterface) {
- result = pSynthData->mNativeSynthInterface->loadLanguage(langNativeString,
+ if (engine) {
+ result = engine->funcs->loadLanguage(engine, langNativeString,
countryNativeString, variantNativeString);
}
env->ReleaseStringUTFChars(language, langNativeString);
@@ -569,7 +604,7 @@ static int
android_tts_SynthProxy_setSpeechRate(JNIEnv *env, jobject thiz, jint jniData,
jint speechRate)
{
- int result = TTS_FAILURE;
+ int result = ANDROID_TTS_FAILURE;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_setSpeechRate(): invalid JNI data");
@@ -584,9 +619,10 @@ android_tts_SynthProxy_setSpeechRate(JNIEnv *env, jobject thiz, jint jniData,
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
LOGI("setting speech rate to %d", speechRate);
+ android_tts_engine_t *engine = pSynthData->mEngine;
- if (pSynthData->mNativeSynthInterface) {
- result = pSynthData->mNativeSynthInterface->setProperty("rate", buffer, bufSize);
+ if (engine) {
+ result = engine->funcs->setProperty(engine, "rate", buffer, bufSize);
}
return result;
@@ -597,7 +633,7 @@ static int
android_tts_SynthProxy_setPitch(JNIEnv *env, jobject thiz, jint jniData,
jint pitch)
{
- int result = TTS_FAILURE;
+ int result = ANDROID_TTS_FAILURE;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_setPitch(): invalid JNI data");
@@ -612,9 +648,10 @@ android_tts_SynthProxy_setPitch(JNIEnv *env, jobject thiz, jint jniData,
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
LOGI("setting pitch to %d", pitch);
+ android_tts_engine_t *engine = pSynthData->mEngine;
- if (pSynthData->mNativeSynthInterface) {
- result = pSynthData->mNativeSynthInterface->setProperty("pitch", buffer, bufSize);
+ if (engine) {
+ result = engine->funcs->setProperty(engine, "pitch", buffer, bufSize);
}
return result;
@@ -625,7 +662,7 @@ static int
android_tts_SynthProxy_synthesizeToFile(JNIEnv *env, jobject thiz, jint jniData,
jstring textJavaString, jstring filenameJavaString)
{
- int result = TTS_FAILURE;
+ int result = ANDROID_TTS_FAILURE;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_synthesizeToFile(): invalid JNI data");
@@ -633,7 +670,7 @@ android_tts_SynthProxy_synthesizeToFile(JNIEnv *env, jobject thiz, jint jniData,
}
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
- if (!pSynthData->mNativeSynthInterface) {
+ if (!pSynthData->mEngine) {
LOGE("android_tts_SynthProxy_synthesizeToFile(): invalid engine handle");
return result;
}
@@ -643,12 +680,22 @@ android_tts_SynthProxy_synthesizeToFile(JNIEnv *env, jobject thiz, jint jniData,
Mutex::Autolock l(engineMutex);
// Retrieve audio parameters before writing the file header
- AudioSystem::audio_format encoding = DEFAULT_TTS_FORMAT;
+ AudioSystem::audio_format encoding;
uint32_t rate = DEFAULT_TTS_RATE;
int channels = DEFAULT_TTS_NB_CHANNELS;
- pSynthData->mNativeSynthInterface->setAudioFormat(encoding, rate, channels);
-
- if ((encoding != AudioSystem::PCM_16_BIT) && (encoding != AudioSystem::PCM_8_BIT)) {
+ android_tts_engine_t *engine = pSynthData->mEngine;
+ android_tts_audio_format_t format = ANDROID_TTS_AUDIO_FORMAT_DEFAULT;
+
+ engine->funcs->setAudioFormat(engine, &format, &rate, &channels);
+
+ switch (format) {
+ case ANDROID_TTS_AUDIO_FORMAT_PCM_16_BIT:
+ encoding = AudioSystem::PCM_16_BIT;
+ break;
+ case ANDROID_TTS_AUDIO_FORMAT_PCM_8_BIT:
+ encoding = AudioSystem::PCM_8_BIT;
+ break;
+ default:
LOGE("android_tts_SynthProxy_synthesizeToFile(): engine uses invalid format");
return result;
}
@@ -677,7 +724,8 @@ android_tts_SynthProxy_synthesizeToFile(JNIEnv *env, jobject thiz, jint jniData,
unsigned int unique_identifier;
memset(pSynthData->mBuffer, 0, pSynthData->mBufferSize);
- result = pSynthData->mNativeSynthInterface->synthesizeText(textNativeString,
+
+ result = engine->funcs->synthesizeText(engine, textNativeString,
pSynthData->mBuffer, pSynthData->mBufferSize, (void *)pForAfter);
long filelen = ftell(pForAfter->outputFile);
@@ -737,7 +785,7 @@ static int
android_tts_SynthProxy_speak(JNIEnv *env, jobject thiz, jint jniData,
jstring textJavaString, jint javaStreamType)
{
- int result = TTS_FAILURE;
+ int result = ANDROID_TTS_FAILURE;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_speak(): invalid JNI data");
@@ -759,10 +807,12 @@ android_tts_SynthProxy_speak(JNIEnv *env, jobject thiz, jint jniData,
pForAfter->usageMode = USAGEMODE_PLAY_IMMEDIATELY;
pForAfter->streamType = (AudioSystem::stream_type) javaStreamType;
- if (pSynthData->mNativeSynthInterface) {
+ if (pSynthData->mEngine) {
const char *textNativeString = env->GetStringUTFChars(textJavaString, 0);
memset(pSynthData->mBuffer, 0, pSynthData->mBufferSize);
- result = pSynthData->mNativeSynthInterface->synthesizeText(textNativeString,
+ android_tts_engine_t *engine = pSynthData->mEngine;
+
+ result = engine->funcs->synthesizeText(engine, textNativeString,
pSynthData->mBuffer, pSynthData->mBufferSize, (void *)pForAfter);
env->ReleaseStringUTFChars(textJavaString, textNativeString);
}
@@ -774,7 +824,7 @@ android_tts_SynthProxy_speak(JNIEnv *env, jobject thiz, jint jniData,
static int
android_tts_SynthProxy_stop(JNIEnv *env, jobject thiz, jint jniData)
{
- int result = TTS_FAILURE;
+ int result = ANDROID_TTS_FAILURE;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_stop(): invalid JNI data");
@@ -790,8 +840,9 @@ android_tts_SynthProxy_stop(JNIEnv *env, jobject thiz, jint jniData)
}
pSynthData->mPlayLock.unlock();
- if (pSynthData->mNativeSynthInterface) {
- result = pSynthData->mNativeSynthInterface->stop();
+ android_tts_engine_t *engine = pSynthData->mEngine;
+ if (engine) {
+ result = engine->funcs->stop(engine);
}
return result;
@@ -801,7 +852,7 @@ android_tts_SynthProxy_stop(JNIEnv *env, jobject thiz, jint jniData)
static int
android_tts_SynthProxy_stopSync(JNIEnv *env, jobject thiz, jint jniData)
{
- int result = TTS_FAILURE;
+ int result = ANDROID_TTS_FAILURE;
if (jniData == 0) {
LOGE("android_tts_SynthProxy_stop(): invalid JNI data");
@@ -829,7 +880,7 @@ android_tts_SynthProxy_getLanguage(JNIEnv *env, jobject thiz, jint jniData)
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
- if (pSynthData->mNativeSynthInterface) {
+ if (pSynthData->mEngine) {
size_t bufSize = 100;
char lang[bufSize];
char country[bufSize];
@@ -839,7 +890,9 @@ android_tts_SynthProxy_getLanguage(JNIEnv *env, jobject thiz, jint jniData)
memset(variant, 0, bufSize);
jobjectArray retLocale = (jobjectArray)env->NewObjectArray(3,
env->FindClass("java/lang/String"), env->NewStringUTF(""));
- pSynthData->mNativeSynthInterface->getLanguage(lang, country, variant);
+
+ android_tts_engine_t *engine = pSynthData->mEngine;
+ engine->funcs->getLanguage(engine, lang, country, variant);
env->SetObjectArrayElement(retLocale, 0, env->NewStringUTF(lang));
env->SetObjectArrayElement(retLocale, 1, env->NewStringUTF(country));
env->SetObjectArrayElement(retLocale, 2, env->NewStringUTF(variant));
@@ -864,8 +917,9 @@ android_tts_SynthProxy_getRate(JNIEnv *env, jobject thiz, jint jniData)
char buf[bufSize];
memset(buf, 0, bufSize);
// TODO check return codes
- if (pSynthData->mNativeSynthInterface) {
- pSynthData->mNativeSynthInterface->getProperty("rate", buf, &bufSize);
+ android_tts_engine_t *engine = pSynthData->mEngine;
+ if (engine) {
+ engine->funcs->getProperty(engine,"rate", buf, &bufSize);
}
return atoi(buf);
}
diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java
index c977ba3..08bbfb2 100755
--- a/packages/TtsService/src/android/tts/TtsService.java
+++ b/packages/TtsService/src/android/tts/TtsService.java
@@ -496,7 +496,7 @@ public class TtsService extends Service implements OnCompletionListener {
* engines.
*/
private int speak(String callingApp, String text, int queueMode, ArrayList<String> params) {
- Log.v(SERVICE_TAG, "TTS service received " + text);
+ // Log.v(SERVICE_TAG, "TTS service received " + text);
if (queueMode == TextToSpeech.QUEUE_FLUSH) {
stop(callingApp);
} else if (queueMode == 2) {
@@ -705,27 +705,27 @@ public class TtsService extends Service implements OnCompletionListener {
}
}
- public void onCompletion(MediaPlayer arg0) {
- // mCurrentSpeechItem may become null if it is stopped at the same
- // time it completes.
- SpeechItem currentSpeechItemCopy = mCurrentSpeechItem;
- if (currentSpeechItemCopy != null) {
- String callingApp = currentSpeechItemCopy.mCallingApp;
- ArrayList<String> params = currentSpeechItemCopy.mParams;
- String utteranceId = "";
- if (params != null) {
- for (int i = 0; i < params.size() - 1; i = i + 2) {
- String param = params.get(i);
- if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)) {
- utteranceId = params.get(i + 1);
- }
- }
- }
- if (utteranceId.length() > 0) {
- dispatchUtteranceCompletedCallback(utteranceId, callingApp);
- }
- }
- processSpeechQueue();
+ public void onCompletion(MediaPlayer arg0) {
+ // mCurrentSpeechItem may become null if it is stopped at the same
+ // time it completes.
+ SpeechItem currentSpeechItemCopy = mCurrentSpeechItem;
+ if (currentSpeechItemCopy != null) {
+ String callingApp = currentSpeechItemCopy.mCallingApp;
+ ArrayList<String> params = currentSpeechItemCopy.mParams;
+ String utteranceId = "";
+ if (params != null) {
+ for (int i = 0; i < params.size() - 1; i = i + 2) {
+ String param = params.get(i);
+ if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)) {
+ utteranceId = params.get(i + 1);
+ }
+ }
+ }
+ if (utteranceId.length() > 0) {
+ dispatchUtteranceCompletedCallback(utteranceId, callingApp);
+ }
+ }
+ processSpeechQueue();
}
private int playSilence(String callingApp, long duration, int queueMode,
@@ -1064,7 +1064,7 @@ public class TtsService extends Service implements OnCompletionListener {
SoundResource sr = getSoundResource(mCurrentSpeechItem);
// Synth speech as needed - synthesizer should call
// processSpeechQueue to continue running the queue
- Log.v(SERVICE_TAG, "TTS processing: " + mCurrentSpeechItem.mText);
+ // Log.v(SERVICE_TAG, "TTS processing: " + mCurrentSpeechItem.mText);
if (sr == null) {
if (mCurrentSpeechItem.mType == SpeechItem.TEXT) {
mCurrentSpeechItem = splitCurrentTextIfNeeded(mCurrentSpeechItem);
@@ -1462,8 +1462,8 @@ public class TtsService extends Service implements OnCompletionListener {
*
* @return SUCCESS or ERROR as defined in android.speech.tts.TextToSpeech.
*/
- public int setEngineByPackageName(String packageName) {
- return mSelf.setEngine(packageName);
+ public int setEngineByPackageName(String packageName) {
+ return mSelf.setEngine(packageName);
}
/**
diff --git a/packages/VpnServices/res/drawable/vpn_connected.png b/packages/VpnServices/res/drawable/vpn_connected.png
index c920876..65fc6db 100644
--- a/packages/VpnServices/res/drawable/vpn_connected.png
+++ b/packages/VpnServices/res/drawable/vpn_connected.png
Binary files differ
diff --git a/packages/VpnServices/res/drawable/vpn_disconnected.png b/packages/VpnServices/res/drawable/vpn_disconnected.png
index c920876..2440c69 100644
--- a/packages/VpnServices/res/drawable/vpn_disconnected.png
+++ b/packages/VpnServices/res/drawable/vpn_disconnected.png
Binary files differ
diff --git a/packages/VpnServices/res/values-ar/strings.xml b/packages/VpnServices/res/values-ar/strings.xml
new file mode 100644
index 0000000..6bac120
--- /dev/null
+++ b/packages/VpnServices/res/values-ar/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"خدمات الشبكة الظاهرية الخاصة (VPN)"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"تم توصيل الشبكة الظاهرية الخاصة (VPN) لـ <xliff:g id="PROFILENAME">%s</xliff:g>"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"تم فصل الشبكة الظاهرية الخاصة (VPN) لـ <xliff:g id="PROFILENAME">%s</xliff:g>"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"يمكنك اللمس لإعادة الاتصال بالشبكة الظاهرية الخاصة (VPN)."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-bg/strings.xml b/packages/VpnServices/res/values-bg/strings.xml
new file mode 100644
index 0000000..fdcbf64
--- /dev/null
+++ b/packages/VpnServices/res/values-bg/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"VPN услуги"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"Връзката с VPN <xliff:g id="PROFILENAME">%s</xliff:g> бе установена"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"Връзката с VPN <xliff:g id="PROFILENAME">%s</xliff:g> бе прекъсната"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Докоснете за повторно свързване с VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-ca/strings.xml b/packages/VpnServices/res/values-ca/strings.xml
new file mode 100644
index 0000000..b37790a
--- /dev/null
+++ b/packages/VpnServices/res/values-ca/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"Serveis VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"VPN <xliff:g id="PROFILENAME">%s</xliff:g> connectada"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"VPN <xliff:g id="PROFILENAME">%s</xliff:g> desconnectada"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Toqueu-ho per tornar-vos a connectar a una VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-en-rGB/strings.xml b/packages/VpnServices/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..905c265
--- /dev/null
+++ b/packages/VpnServices/res/values-en-rGB/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"VPN Services"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN connected"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN disconnected"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Touch to reconnect to a VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-fa/strings.xml b/packages/VpnServices/res/values-fa/strings.xml
new file mode 100644
index 0000000..7cee16d
--- /dev/null
+++ b/packages/VpnServices/res/values-fa/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"سرویس های VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN وصل شد"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN قطع شد"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"برای اتصال مجدد به VPN لمس کنید."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-fi/strings.xml b/packages/VpnServices/res/values-fi/strings.xml
new file mode 100644
index 0000000..b15202a
--- /dev/null
+++ b/packages/VpnServices/res/values-fi/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"VPN-palvelut"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g>: VPN-yhteys muodostettu"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"<xliff:g id="PROFILENAME">%s</xliff:g>: VPN-yhteys katkaistu"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Yhdistä VPN-verkkoon uudelleen koskettamalla."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-he/strings.xml b/packages/VpnServices/res/values-he/strings.xml
new file mode 100644
index 0000000..74971d6
--- /dev/null
+++ b/packages/VpnServices/res/values-he/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"שירותי VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"VPN של <xliff:g id="PROFILENAME">%s</xliff:g> מחובר"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"VPN של <xliff:g id="PROFILENAME">%s</xliff:g> נותק"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"גע כדי להתחבר שוב ל-VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-hr/strings.xml b/packages/VpnServices/res/values-hr/strings.xml
new file mode 100644
index 0000000..aedb536
--- /dev/null
+++ b/packages/VpnServices/res/values-hr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"VPN usluge"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN priključen"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN je isključen"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Dotaknite za ponovno povezivanje s VPN-om."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-hu/strings.xml b/packages/VpnServices/res/values-hu/strings.xml
new file mode 100644
index 0000000..44f5427
--- /dev/null
+++ b/packages/VpnServices/res/values-hu/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"VPN-szolgáltatások"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"Kapcsolódva a(z) <xliff:g id="PROFILENAME">%s</xliff:g> virtuális magánhálózathoz"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"Kapcsolat bontva a(z) <xliff:g id="PROFILENAME">%s</xliff:g> virtuális magánhálózattal"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Érintse meg az újracsatlakozáshoz."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-id/strings.xml b/packages/VpnServices/res/values-id/strings.xml
new file mode 100644
index 0000000..8b6b4c2
--- /dev/null
+++ b/packages/VpnServices/res/values-id/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"Layanan VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"VPN <xliff:g id="PROFILENAME">%s</xliff:g> terhubung"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"VPN <xliff:g id="PROFILENAME">%s</xliff:g> terputus"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Sentuh untuk terhubung kembali ke suatu VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-lt/strings.xml b/packages/VpnServices/res/values-lt/strings.xml
new file mode 100644
index 0000000..58f1f58
--- /dev/null
+++ b/packages/VpnServices/res/values-lt/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"VPT paslaugos"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g> VPT prijungtas"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"<xliff:g id="PROFILENAME">%s</xliff:g> VPT atjungtas"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Palieskite, kad būtų iš naujo sujungta su VPT."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-lv/strings.xml b/packages/VpnServices/res/values-lv/strings.xml
new file mode 100644
index 0000000..cb80908
--- /dev/null
+++ b/packages/VpnServices/res/values-lv/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"VPN pakalpojumi"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN ir savienots"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN ir atvienots"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Pieskarieties, lai atkārtoti izveidotu savienojumu ar VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-rm/strings.xml b/packages/VpnServices/res/values-rm/strings.xml
new file mode 100644
index 0000000..80f2817
--- /dev/null
+++ b/packages/VpnServices/res/values-rm/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"Servetschs VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"VPN <xliff:g id="PROFILENAME">%s</xliff:g> connectà"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"VPN <xliff:g id="PROFILENAME">%s</xliff:g> deconnectà"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Tutgar per reconnectar ad in VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-ro/strings.xml b/packages/VpnServices/res/values-ro/strings.xml
new file mode 100644
index 0000000..a22792c
--- /dev/null
+++ b/packages/VpnServices/res/values-ro/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"Servicii VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"VPN <xliff:g id="PROFILENAME">%s</xliff:g> conectat"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"VPN <xliff:g id="PROFILENAME">%s</xliff:g> deconectat"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Atingeţi pentru a vă reconecta la o reţea VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-sk/strings.xml b/packages/VpnServices/res/values-sk/strings.xml
new file mode 100644
index 0000000..167b6f3
--- /dev/null
+++ b/packages/VpnServices/res/values-sk/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"Služby VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"Sieť VPN <xliff:g id="PROFILENAME">%s</xliff:g> je pripojená"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"Sieť VPN <xliff:g id="PROFILENAME">%s</xliff:g> odpojená"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Dotykom sa znova pripojíte k sieti VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-sl/strings.xml b/packages/VpnServices/res/values-sl/strings.xml
new file mode 100644
index 0000000..c5b72c4
--- /dev/null
+++ b/packages/VpnServices/res/values-sl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"Storitve VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"VPN profila <xliff:g id="PROFILENAME">%s</xliff:g> je povezan"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"VPN profila <xliff:g id="PROFILENAME">%s</xliff:g> je izklopljen"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Dotaknite se, če želite preklopiti v navidezno zasebno omrežje."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-sr/strings.xml b/packages/VpnServices/res/values-sr/strings.xml
new file mode 100644
index 0000000..bfe6cc8
--- /dev/null
+++ b/packages/VpnServices/res/values-sr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"VPN услуге"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN веза је успостављена"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"<xliff:g id="PROFILENAME">%s</xliff:g> VPN веза је прекинута"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Додирните да бисте се поново повезали са VPN-ом."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-th/strings.xml b/packages/VpnServices/res/values-th/strings.xml
new file mode 100644
index 0000000..3aa9c6e
--- /dev/null
+++ b/packages/VpnServices/res/values-th/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"บริการ VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g> เชื่อมต่อ VPN แล้ว"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"<xliff:g id="PROFILENAME">%s</xliff:g> ตัดการเชื่อมต่อ VPN แล้ว"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"แตะเพื่อเชื่อมต่อกับ VPN อีกครั้ง"</string>
+</resources>
diff --git a/packages/VpnServices/res/values-tl/strings.xml b/packages/VpnServices/res/values-tl/strings.xml
new file mode 100644
index 0000000..bd988a1
--- /dev/null
+++ b/packages/VpnServices/res/values-tl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"Mga serbisyo ng VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"Hindi konektado ang <xliff:g id="PROFILENAME">%s</xliff:g> VPN"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"Hindi konektado ang <xliff:g id="PROFILENAME">%s</xliff:g> VPN"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Galawin upang muling kumonekta sa VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-uk/strings.xml b/packages/VpnServices/res/values-uk/strings.xml
new file mode 100644
index 0000000..208659a
--- /dev/null
+++ b/packages/VpnServices/res/values-uk/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"Служби VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g> підключ. ч-з VPN"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"VPN <xliff:g id="PROFILENAME">%s</xliff:g> роз\'єднано"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Натисн. для повт. з\'єдн. з VPN."</string>
+</resources>
diff --git a/packages/VpnServices/res/values-vi/strings.xml b/packages/VpnServices/res/values-vi/strings.xml
new file mode 100644
index 0000000..3022c9c
--- /dev/null
+++ b/packages/VpnServices/res/values-vi/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4589592829302498102">"Dịch vụ VPN"</string>
+ <string name="vpn_notification_title_connected" msgid="8598654486956133580">"Đã kết nối VPN <xliff:g id="PROFILENAME">%s</xliff:g>"</string>
+ <string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"Đã ngắt kết nối VPN <xliff:g id="PROFILENAME">%s</xliff:g>"</string>
+ <string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Chạm để kết nối lại với VPN."</string>
+</resources>