diff options
-rw-r--r-- | Android.mk | 3 | ||||
-rw-r--r-- | CleanSpec.mk | 1 | ||||
-rw-r--r-- | core/java/android/app/Dialog.java | 2 | ||||
-rw-r--r-- | core/java/android/app/ListActivity.java | 6 | ||||
-rw-r--r-- | core/java/android/app/Notification.java | 38 | ||||
-rw-r--r-- | core/java/android/app/StatusBarManager.java | 34 | ||||
-rw-r--r-- | core/java/android/widget/MediaController.java | 2 | ||||
-rw-r--r-- | core/java/android/widget/RemoteViews.java | 9 | ||||
-rw-r--r-- | core/java/com/android/internal/statusbar/IStatusBar.aidl | 34 | ||||
-rw-r--r-- | core/java/com/android/internal/statusbar/IStatusBarService.aidl | 40 | ||||
-rw-r--r-- | core/java/com/android/internal/statusbar/StatusBarIcon.aidl (renamed from core/java/android/app/IStatusBar.aidl) | 21 | ||||
-rw-r--r-- | core/java/com/android/internal/statusbar/StatusBarIcon.java | 105 | ||||
-rw-r--r-- | core/java/com/android/internal/statusbar/StatusBarIconList.aidl (renamed from services/java/com/android/server/status/StatusBarNotification.java) | 29 | ||||
-rw-r--r-- | core/java/com/android/internal/statusbar/StatusBarIconList.java | 161 | ||||
-rw-r--r-- | core/java/com/android/internal/statusbar/StatusBarNotification.aidl | 20 | ||||
-rw-r--r-- | core/java/com/android/internal/statusbar/StatusBarNotification.java | 116 | ||||
-rw-r--r-- | core/java/com/android/internal/statusbar/StatusBarNotificationList.aidl | 20 | ||||
-rw-r--r-- | core/res/res/drawable-hdpi/battery_charge_fill_empty.9.png | bin | 783 -> 0 bytes | |||
-rw-r--r-- | core/res/res/drawable-hdpi/battery_charge_fill_full.9.png | bin | 756 -> 0 bytes | |||
-rw-r--r-- | core/res/res/drawable-hdpi/battery_charge_fill_warning.9.png | bin | 819 -> 0 bytes | |||
-rw-r--r-- | core/res/res/drawable-hdpi/stat_sys_data_bluetooth.png | bin | 1246 -> 818 bytes | |||
-rw-r--r-- | core/res/res/layout/battery_status.xml | 81 | ||||
-rw-r--r-- | core/res/res/layout/status_bar_latest_event_content.xml | 3 | ||||
-rw-r--r-- | core/res/res/values/arrays.xml | 38 | ||||
-rw-r--r-- | core/res/res/values/config.xml | 3 | ||||
-rw-r--r-- | core/res/res/values/strings.xml | 39 | ||||
-rw-r--r-- | docs/html/guide/topics/data/backup.jd | 2 | ||||
-rw-r--r-- | docs/html/resources/tutorials/views/hello-webview.jd | 4 | ||||
-rw-r--r-- | packages/SystemUI/Android.mk | 13 | ||||
-rw-r--r-- | packages/SystemUI/AndroidManifest.xml | 22 | ||||
-rw-r--r-- | packages/SystemUI/MODULE_LICENSE_APACHE2 | 0 | ||||
-rw-r--r-- | packages/SystemUI/NOTICE | 190 | ||||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/battery_low_battery.png (renamed from core/res/res/drawable-hdpi/battery_low_battery.png) | bin | 4759 -> 4759 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/btn_default_small_normal.9.png | bin | 0 -> 894 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable.9.png | bin | 0 -> 541 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable_focused.9.png | bin | 0 -> 830 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/btn_default_small_pressed.9.png | bin | 0 -> 1301 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/btn_default_small_selected.9.png | bin | 0 -> 1323 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/ic_launcher_settings.png | bin | 0 -> 7529 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png | bin | 0 -> 1014 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/shade_bg.png | bin | 0 -> 1038 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/shade_handlebar.9.png | bin | 0 -> 2368 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/shade_header_background.9.png | bin | 0 -> 204 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.png (renamed from core/res/res/drawable-hdpi/stat_notify_alarm.png) | bin | 1793 -> 1793 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-hdpi/stat_notify_more.png | bin | 0 -> 1102 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png | bin | 0 -> 1246 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png) | bin | 1405 -> 1405 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_connected_1x.png) | bin | 1349 -> 1349 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_connected_3g.png) | bin | 1257 -> 1257 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_connected_e.png) | bin | 1216 -> 1216 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_connected_g.png) | bin | 1212 -> 1212 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_connected_h.png) | bin | 1165 -> 1165 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_in_1x.png) | bin | 1326 -> 1326 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_in_3g.png) | bin | 1226 -> 1226 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_in_e.png) | bin | 1179 -> 1179 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_in_g.png) | bin | 1181 -> 1181 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_in_h.png) | bin | 1148 -> 1148 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_inandout_1x.png) | bin | 1292 -> 1292 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_inandout_3g.png) | bin | 1190 -> 1190 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_inandout_e.png) | bin | 1135 -> 1135 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_inandout_g.png) | bin | 1143 -> 1143 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_inandout_h.png) | bin | 1103 -> 1103 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_out_1x.png) | bin | 1324 -> 1324 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_out_3g.png) | bin | 1220 -> 1220 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_out_e.png) | bin | 1171 -> 1171 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_out_g.png) | bin | 1178 -> 1178 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png (renamed from core/res/res/drawable-hdpi/stat_sys_data_out_h.png) | bin | 1135 -> 1135 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png (renamed from core/res/res/drawable-hdpi/stat_sys_gps_acquiring.png) | bin | 884 -> 884 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png (renamed from core/res/res/drawable-hdpi/stat_sys_no_sim.png) | bin | 1021 -> 1021 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.png (renamed from core/res/res/drawable-hdpi/stat_sys_r_signal_0.png) | bin | 1223 -> 1223 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1.png (renamed from core/res/res/drawable-hdpi/stat_sys_r_signal_1.png) | bin | 1239 -> 1239 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.png (renamed from core/res/res/drawable-hdpi/stat_sys_r_signal_2.png) | bin | 1231 -> 1231 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.png (renamed from core/res/res/drawable-hdpi/stat_sys_r_signal_3.png) | bin | 1206 -> 1206 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.png (renamed from core/res/res/drawable-hdpi/stat_sys_r_signal_4.png) | bin | 1151 -> 1151 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png (renamed from core/res/res/drawable-hdpi/stat_sys_ringer_silent.png) | bin | 1300 -> 1300 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png (renamed from core/res/res/drawable-hdpi/stat_sys_ringer_vibrate.png) | bin | 4980 -> 4980 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png (renamed from core/res/res/drawable-hdpi/stat_sys_roaming_cdma_0.png) | bin | 443 -> 443 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim0.png (renamed from core/res/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim0.png) | bin | 142 -> 142 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim1.png (renamed from core/res/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim1.png) | bin | 443 -> 443 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png (renamed from core/res/res/drawable-hdpi/stat_sys_signal_0.png) | bin | 1058 -> 1058 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png (renamed from core/res/res/drawable-hdpi/stat_sys_signal_1.png) | bin | 1070 -> 1070 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png (renamed from core/res/res/drawable-hdpi/stat_sys_signal_2.png) | bin | 1070 -> 1070 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png (renamed from core/res/res/drawable-hdpi/stat_sys_signal_3.png) | bin | 1042 -> 1042 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png (renamed from core/res/res/drawable-hdpi/stat_sys_signal_4.png) | bin | 986 -> 986 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png (renamed from core/res/res/drawable-hdpi/stat_sys_signal_flightmode.png) | bin | 1492 -> 1492 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png (renamed from core/res/res/drawable-hdpi/stat_sys_signal_null.png) | bin | 1304 -> 1304 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png (renamed from core/res/res/drawable-hdpi/stat_sys_tty_mode.png) | bin | 400 -> 400 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png (renamed from core/res/res/drawable-hdpi/stat_sys_wifi_signal_0.png) | bin | 1217 -> 1217 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png (renamed from core/res/res/drawable-hdpi/stat_sys_wifi_signal_1.png) | bin | 1229 -> 1229 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png (renamed from core/res/res/drawable-hdpi/stat_sys_wifi_signal_2.png) | bin | 1239 -> 1239 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png (renamed from core/res/res/drawable-hdpi/stat_sys_wifi_signal_3.png) | bin | 1240 -> 1240 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png (renamed from core/res/res/drawable-hdpi/stat_sys_wifi_signal_4.png) | bin | 1236 -> 1236 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/status_bar_background.9.png | bin | 0 -> 3233 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/status_bar_item_app_background_normal.9.png | bin | 0 -> 322 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/status_bar_item_background_focus.9.png | bin | 0 -> 1657 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/status_bar_item_background_normal.9.png | bin | 0 -> 197 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/status_bar_item_background_pressed.9.png | bin | 0 -> 1531 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/title_bar_portrait.9.png | bin | 0 -> 215 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png | bin | 0 -> 198 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/battery_low_battery.png (renamed from core/res/res/drawable-mdpi/battery_low_battery.png) | bin | 5306 -> 5306 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/btn_default_small_normal.9.png | bin | 0 -> 679 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable.9.png | bin | 0 -> 456 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable_focused.9.png | bin | 0 -> 648 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/btn_default_small_pressed.9.png | bin | 0 -> 936 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/btn_default_small_selected.9.png | bin | 0 -> 964 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/ic_launcher_settings.png | bin | 0 -> 7043 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png (renamed from core/res/res/drawable-mdpi/battery_charge_fill_full.9.png) | bin | 3409 -> 3201 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/shade_bg.png | bin | 0 -> 3448 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/shade_handlebar.9.png | bin | 0 -> 646 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/shade_header_background.9.png (renamed from core/res/res/drawable-mdpi/battery_charge_fill_warning.9.png) | bin | 3427 -> 2867 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_notify_alarm.png (renamed from core/res/res/drawable-mdpi/stat_notify_alarm.png) | bin | 1035 -> 1035 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_notify_more.png | bin | 0 -> 786 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png) | bin | 967 -> 967 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_connected_1x.png) | bin | 892 -> 892 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_connected_3g.png) | bin | 832 -> 832 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_connected_e.png) | bin | 833 -> 833 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_connected_g.png) | bin | 838 -> 838 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_connected_h.png) | bin | 642 -> 642 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_1x.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_in_1x.png) | bin | 808 -> 808 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_3g.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_in_3g.png) | bin | 757 -> 757 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_e.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_in_e.png) | bin | 719 -> 719 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_g.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_in_g.png) | bin | 724 -> 724 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_h.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_in_h.png) | bin | 669 -> 669 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_1x.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_inandout_1x.png) | bin | 770 -> 770 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_3g.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_inandout_3g.png) | bin | 709 -> 709 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_e.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_inandout_e.png) | bin | 682 -> 682 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_g.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_inandout_g.png) | bin | 683 -> 683 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_h.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_inandout_h.png) | bin | 655 -> 655 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_1x.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_out_1x.png) | bin | 820 -> 820 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_3g.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_out_3g.png) | bin | 768 -> 768 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_e.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_out_e.png) | bin | 735 -> 735 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_g.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_out_g.png) | bin | 739 -> 739 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_h.png (renamed from core/res/res/drawable-mdpi/stat_sys_data_out_h.png) | bin | 654 -> 654 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png (renamed from core/res/res/drawable-mdpi/stat_sys_gps_acquiring.png) | bin | 595 -> 595 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png (renamed from core/res/res/drawable-mdpi/stat_sys_no_sim.png) | bin | 809 -> 809 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0.png (renamed from core/res/res/drawable-mdpi/stat_sys_r_signal_0.png) | bin | 802 -> 802 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1.png (renamed from core/res/res/drawable-mdpi/stat_sys_r_signal_1.png) | bin | 818 -> 818 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2.png (renamed from core/res/res/drawable-mdpi/stat_sys_r_signal_2.png) | bin | 802 -> 802 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3.png (renamed from core/res/res/drawable-mdpi/stat_sys_r_signal_3.png) | bin | 798 -> 798 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4.png (renamed from core/res/res/drawable-mdpi/stat_sys_r_signal_4.png) | bin | 726 -> 726 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png (renamed from core/res/res/drawable-mdpi/stat_sys_ringer_silent.png) | bin | 767 -> 767 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png (renamed from core/res/res/drawable-mdpi/stat_sys_ringer_vibrate.png) | bin | 1255 -> 1255 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png (renamed from core/res/res/drawable-mdpi/stat_sys_roaming_cdma_0.png) | bin | 377 -> 377 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim0.png (renamed from core/res/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim0.png) | bin | 150 -> 150 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim1.png (renamed from core/res/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim1.png) | bin | 377 -> 377 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png (renamed from core/res/res/drawable-mdpi/stat_sys_signal_0.png) | bin | 587 -> 587 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png (renamed from core/res/res/drawable-mdpi/stat_sys_signal_1.png) | bin | 597 -> 597 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png (renamed from core/res/res/drawable-mdpi/stat_sys_signal_2.png) | bin | 595 -> 595 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png (renamed from core/res/res/drawable-mdpi/stat_sys_signal_3.png) | bin | 594 -> 594 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png (renamed from core/res/res/drawable-mdpi/stat_sys_signal_4.png) | bin | 532 -> 532 bytes | |||
-rwxr-xr-x | packages/SystemUI/res/drawable-mdpi/stat_sys_signal_flightmode.png (renamed from core/res/res/drawable-mdpi/stat_sys_signal_flightmode.png) | bin | 898 -> 898 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png (renamed from core/res/res/drawable-mdpi/stat_sys_signal_null.png) | bin | 730 -> 730 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png (renamed from core/res/res/drawable-mdpi/stat_sys_tty_mode.png) | bin | 725 -> 725 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png (renamed from core/res/res/drawable-mdpi/stat_sys_wifi_signal_0.png) | bin | 743 -> 743 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png (renamed from core/res/res/drawable-mdpi/stat_sys_wifi_signal_1.png) | bin | 768 -> 768 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png (renamed from core/res/res/drawable-mdpi/stat_sys_wifi_signal_2.png) | bin | 785 -> 785 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png (renamed from core/res/res/drawable-mdpi/stat_sys_wifi_signal_3.png) | bin | 807 -> 807 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png (renamed from core/res/res/drawable-mdpi/stat_sys_wifi_signal_4.png) | bin | 826 -> 826 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/status_bar_background.9.png | bin | 0 -> 204 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/status_bar_item_app_background_normal.9.png (renamed from core/res/res/drawable-mdpi/battery_charge_fill_empty.9.png) | bin | 3384 -> 3013 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/status_bar_item_background_focus.9.png | bin | 0 -> 11006 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/status_bar_item_background_normal.9.png | bin | 0 -> 186 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/status_bar_item_background_pressed.9.png | bin | 0 -> 11006 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/title_bar_portrait.9.png | bin | 0 -> 202 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png | bin | 0 -> 173 bytes | |||
-rw-r--r-- | packages/SystemUI/res/drawable/btn_default_small.xml | 33 | ||||
-rw-r--r-- | packages/SystemUI/res/drawable/stat_sys_gps_acquiring_anim.xml (renamed from core/res/res/drawable/stat_sys_gps_acquiring_anim.xml) | 2 | ||||
-rw-r--r-- | packages/SystemUI/res/drawable/stat_sys_roaming_cdma_flash.xml (renamed from core/res/res/drawable/stat_sys_roaming_cdma_flash.xml) | 0 | ||||
-rw-r--r-- | packages/SystemUI/res/layout/battery_low.xml (renamed from core/res/res/layout/battery_low.xml) | 0 | ||||
-rw-r--r-- | packages/SystemUI/res/layout/status_bar.xml (renamed from core/res/res/layout/status_bar.xml) | 38 | ||||
-rw-r--r-- | packages/SystemUI/res/layout/status_bar_expanded.xml (renamed from core/res/res/layout/status_bar_expanded.xml) | 37 | ||||
-rw-r--r-- | packages/SystemUI/res/layout/status_bar_icon.xml (renamed from core/res/res/layout/status_bar_icon.xml) | 2 | ||||
-rw-r--r-- | packages/SystemUI/res/layout/status_bar_tracking.xml (renamed from core/res/res/layout/status_bar_tracking.xml) | 14 | ||||
-rw-r--r-- | packages/SystemUI/res/values/arrays.xml | 28 | ||||
-rw-r--r-- | packages/SystemUI/res/values/config.xml (renamed from core/res/res/drawable/status_icon_background.xml) | 16 | ||||
-rw-r--r-- | packages/SystemUI/res/values/defaults.xml | 78 | ||||
-rw-r--r-- | packages/SystemUI/res/values/dimens.xml | 22 | ||||
-rw-r--r-- | packages/SystemUI/res/values/strings.xml | 54 | ||||
-rw-r--r-- | packages/SystemUI/res/values/styles.xml (renamed from core/res/res/drawable/battery_charge_fill.xml) | 17 | ||||
-rw-r--r-- | packages/SystemUI/res/xml/bookmarks.xml | 56 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java (renamed from services/java/com/android/server/status/AnimatedImageView.java) | 2 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/CarrierLabel.java | 117 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/Clock.java | 208 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java (renamed from services/java/com/android/server/status/CloseDragHandle.java) | 4 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java | 201 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/DateView.java (renamed from services/java/com/android/server/status/DateView.java) | 2 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java (renamed from services/java/com/android/server/status/ExpandedView.java) | 9 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/FixedSizeDrawable.java (renamed from services/java/com/android/server/status/FixedSizeDrawable.java) | 2 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java (renamed from services/java/com/android/server/status/IconMerger.java) | 41 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java (renamed from services/java/com/android/server/status/StatusBarException.java) | 19 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java | 126 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/NotificationLinearLayout.java (renamed from services/java/com/android/server/status/NotificationLinearLayout.java) | 2 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/PhoneStatusBarService.java (renamed from services/java/com/android/server/status/StatusBarService.java) | 1110 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java | 134 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java (renamed from services/java/com/android/server/status/StatusBarPolicy.java) | 667 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java | 116 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStarter.java | 38 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java (renamed from services/java/com/android/server/status/StatusBarView.java) | 8 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java (renamed from services/java/com/android/server/status/Ticker.java) | 73 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java (renamed from services/java/com/android/server/status/TickerView.java) | 2 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/TrackingPatternView.java (renamed from services/java/com/android/server/status/TrackingPatternView.java) | 2 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java (renamed from services/java/com/android/server/status/TrackingView.java) | 6 | ||||
-rw-r--r-- | policy/com/android/internal/policy/impl/KeyguardViewMediator.java | 17 | ||||
-rwxr-xr-x | policy/com/android/internal/policy/impl/PhoneWindowManager.java | 22 | ||||
-rw-r--r-- | preloaded-classes | 6 | ||||
-rw-r--r-- | services/java/com/android/server/InputMethodManagerService.java | 25 | ||||
-rwxr-xr-x | services/java/com/android/server/NotificationManagerService.java | 51 | ||||
-rw-r--r-- | services/java/com/android/server/SystemServer.java | 16 | ||||
-rw-r--r-- | services/java/com/android/server/UiModeManagerService.java | 2 | ||||
-rw-r--r-- | services/java/com/android/server/status/IconData.java | 122 | ||||
-rw-r--r-- | services/java/com/android/server/status/NotificationData.java | 44 | ||||
-rw-r--r-- | services/java/com/android/server/status/NotificationViewList.java | 276 | ||||
-rw-r--r-- | services/java/com/android/server/status/StatusBarIcon.java | 183 | ||||
-rw-r--r-- | services/java/com/android/server/status/StatusBarManagerService.java | 465 | ||||
-rw-r--r-- | tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java | 21 | ||||
-rw-r--r-- | tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java | 17 |
216 files changed, 3279 insertions, 2310 deletions
diff --git a/Android.mk b/Android.mk index 5c95d204568e..54ce115ea1cd 100644 --- a/Android.mk +++ b/Android.mk @@ -86,7 +86,6 @@ LOCAL_SRC_FILES += \ core/java/android/app/ISearchManager.aidl \ core/java/android/app/ISearchManagerCallback.aidl \ core/java/android/app/IServiceConnection.aidl \ - core/java/android/app/IStatusBar.aidl \ core/java/android/app/IThumbnailReceiver.aidl \ core/java/android/app/ITransientNotification.aidl \ core/java/android/app/IUiModeManager.aidl \ @@ -155,6 +154,8 @@ LOCAL_SRC_FILES += \ core/java/com/android/internal/backup/IBackupTransport.aidl \ core/java/com/android/internal/os/IDropBoxManagerService.aidl \ core/java/com/android/internal/os/IResultReceiver.aidl \ + core/java/com/android/internal/statusbar/IStatusBar.aidl \ + core/java/com/android/internal/statusbar/IStatusBarService.aidl \ core/java/com/android/internal/view/IInputContext.aidl \ core/java/com/android/internal/view/IInputContextCallback.aidl \ core/java/com/android/internal/view/IInputMethod.aidl \ diff --git a/CleanSpec.mk b/CleanSpec.mk index 6455103a9163..26d8a1b11d02 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -53,6 +53,7 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framew $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/FrameworkTest_intermediates/) $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android.policy*) $(call add-clean-step, rm -rf $(TARGET_OUT_JAVA_LIBRARIES)/android.policy.jar) +$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates) # ************************************************ diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index 02355991a885..da8c9e566977 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -138,7 +138,7 @@ public class Dialog implements DialogInterface, Window.Callback, public Dialog(Context context, int theme) { mContext = new ContextThemeWrapper( context, theme == 0 ? com.android.internal.R.style.Theme_Dialog : theme); - mWindowManager = (WindowManager)context.getSystemService("window"); + mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); Window w = PolicyManager.makeNewWindow(mContext); mWindow = w; w.setCallback(this); diff --git a/core/java/android/app/ListActivity.java b/core/java/android/app/ListActivity.java index 84a57b526a6d..4bf55184af66 100644 --- a/core/java/android/app/ListActivity.java +++ b/core/java/android/app/ListActivity.java @@ -18,9 +18,7 @@ package android.app; import android.os.Bundle; import android.os.Handler; -import android.view.KeyEvent; import android.view.View; -import android.widget.Adapter; import android.widget.AdapterView; import android.widget.ListAdapter; import android.widget.ListView; @@ -68,7 +66,7 @@ import android.widget.ListView; * android:layout_weight="1" * android:drawSelectorOnTop="false"/> * - * <TextView id="@id/android:empty" + * <TextView android:id="@id/android:empty" * android:layout_width="match_parent" * android:layout_height="match_parent" * android:background="#FF0000" @@ -316,7 +314,7 @@ public class ListActivity extends Activity { } private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { - public void onItemClick(AdapterView parent, View v, int position, long id) + public void onItemClick(AdapterView<?> parent, View v, int position, long id) { onListItemClick((ListView)parent, v, position, id); } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 4d72f73cd377..739aca35ff60 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -341,6 +341,44 @@ public class Notification implements Parcelable iconLevel = parcel.readInt(); } + public Notification clone() { + Notification that = new Notification(); + + that.when = this.when; + that.icon = this.icon; + that.number = this.number; + + // PendingIntents are global, so there's no reason (or way) to clone them. + that.contentIntent = this.contentIntent; + that.deleteIntent = this.deleteIntent; + + if (this.tickerText != null) { + that.tickerText = this.tickerText.toString(); + } + if (this.contentView != null) { + that.contentView = this.contentView.clone(); + } + that.iconLevel = that.iconLevel; + that.sound = this.sound; // android.net.Uri is immutable + that.audioStreamType = this.audioStreamType; + + final long[] vibrate = this.vibrate; + if (vibrate != null) { + final int N = vibrate.length; + final long[] vib = that.vibrate = new long[N]; + System.arraycopy(vibrate, 0, vib, 0, N); + } + + that.ledARGB = this.ledARGB; + that.ledOnMS = this.ledOnMS; + that.ledOffMS = this.ledOffMS; + that.defaults = this.defaults; + + that.flags = this.flags; + + return that; + } + public int describeContents() { return 0; } diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 72ec6168cfa2..de544fb5485f 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -23,6 +23,8 @@ import android.os.RemoteException; import android.os.IBinder; import android.os.ServiceManager; +import com.android.internal.statusbar.IStatusBarService; + /** * Allows an app to control the status bar. * @@ -58,12 +60,12 @@ public class StatusBarManager { public static final int DISABLE_NONE = 0x00000000; private Context mContext; - private IStatusBar mService; + private IStatusBarService mService; private IBinder mToken = new Binder(); StatusBarManager(Context context) { mContext = context; - mService = IStatusBar.Stub.asInterface( + mService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); } @@ -85,7 +87,7 @@ public class StatusBarManager { */ public void expand() { try { - mService.activate(); + mService.expand(); } catch (RemoteException ex) { // system process is dead anyway. throw new RuntimeException(ex); @@ -97,46 +99,34 @@ public class StatusBarManager { */ public void collapse() { try { - mService.deactivate(); - } catch (RemoteException ex) { - // system process is dead anyway. - throw new RuntimeException(ex); - } - } - - /** - * Toggle the status bar. - */ - public void toggle() { - try { - mService.toggle(); + mService.collapse(); } catch (RemoteException ex) { // system process is dead anyway. throw new RuntimeException(ex); } } - public IBinder addIcon(String slot, int iconId, int iconLevel) { + public void setIcon(String slot, int iconId, int iconLevel) { try { - return mService.addIcon(slot, mContext.getPackageName(), iconId, iconLevel); + mService.setIcon(slot, mContext.getPackageName(), iconId, iconLevel); } catch (RemoteException ex) { // system process is dead anyway. throw new RuntimeException(ex); } } - public void updateIcon(IBinder key, String slot, int iconId, int iconLevel) { + public void removeIcon(String slot) { try { - mService.updateIcon(key, slot, mContext.getPackageName(), iconId, iconLevel); + mService.removeIcon(slot); } catch (RemoteException ex) { // system process is dead anyway. throw new RuntimeException(ex); } } - public void removeIcon(IBinder key) { + public void setIconVisibility(String slot, boolean visible) { try { - mService.removeIcon(key); + mService.setIconVisibility(slot, visible); } catch (RemoteException ex) { // system process is dead anyway. throw new RuntimeException(ex); diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java index c246c247a53e..39b1377c1e68 100644 --- a/core/java/android/widget/MediaController.java +++ b/core/java/android/widget/MediaController.java @@ -123,7 +123,7 @@ public class MediaController extends FrameLayout { } private void initFloatingWindow() { - mWindowManager = (WindowManager)mContext.getSystemService("window"); + mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); mWindow = PolicyManager.makeNewWindow(mContext); mWindow.setWindowManager(mWindowManager, null, null); mWindow.requestFeature(Window.FEATURE_NO_TITLE); diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 3003580089da..7a70c808293b 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -100,6 +100,7 @@ public class RemoteViews implements Parcelable, Filter { * Base class for all actions that can be performed on an * inflated view. * + * SUBCLASSES MUST BE IMMUTABLE SO CLONE WORKS!!!!! */ private abstract static class Action implements Parcelable { public abstract void apply(View root) throws ActionException; @@ -568,6 +569,14 @@ public class RemoteViews implements Parcelable, Filter { } } + public RemoteViews clone() { + final RemoteViews that = new RemoteViews(mPackage, mLayoutId); + if (mActions != null) { + that.mActions = (ArrayList<Action>)mActions.clone(); + } + return that; + } + public String getPackage() { return mPackage; } diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl new file mode 100644 index 000000000000..4501bd769496 --- /dev/null +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -0,0 +1,34 @@ +/** + * 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. + */ + +package com.android.internal.statusbar; + +import com.android.internal.statusbar.StatusBarIcon; +import com.android.internal.statusbar.StatusBarNotification; + +/** @hide */ +oneway interface IStatusBar +{ + void setIcon(int index, in StatusBarIcon icon); + void removeIcon(int index); + void addNotification(IBinder key, in StatusBarNotification notification); + void updateNotification(IBinder key, in StatusBarNotification notification); + void removeNotification(IBinder key); + void disable(int state); + void animateExpand(); + void animateCollapse(); +} + diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl new file mode 100644 index 000000000000..1f25b37cb6a0 --- /dev/null +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -0,0 +1,40 @@ +/** + * 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. + */ + +package com.android.internal.statusbar; + +import com.android.internal.statusbar.IStatusBar; +import com.android.internal.statusbar.StatusBarIcon; +import com.android.internal.statusbar.StatusBarIconList; +import com.android.internal.statusbar.StatusBarNotification; + +/** @hide */ +interface IStatusBarService +{ + void expand(); + void collapse(); + void disable(int what, IBinder token, String pkg); + void setIcon(String slot, String iconPackage, int iconId, int iconLevel); + void setIconVisibility(String slot, boolean visible); + void removeIcon(String slot); + + // ---- Methods below are for use by the status bar policy services ---- + void registerStatusBar(IStatusBar callbacks, out StatusBarIconList iconList, + out List<IBinder> notificationKeys, out List<StatusBarNotification> notifications); + void visibilityChanged(boolean visible); + void onNotificationClick(String pkg, String tag, int id); + void onClearAllNotifications(); +} diff --git a/core/java/android/app/IStatusBar.aidl b/core/java/com/android/internal/statusbar/StatusBarIcon.aidl index c64fa50f1dcd..311a0770ad36 100644 --- a/core/java/android/app/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/StatusBarIcon.aidl @@ -1,5 +1,5 @@ -/** - * Copyright (c) 2007, 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. @@ -13,17 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package android.app; -/** @hide */ -interface IStatusBar -{ - void activate(); - void deactivate(); - void toggle(); - void disable(int what, IBinder token, String pkg); - IBinder addIcon(String slot, String iconPackage, int iconId, int iconLevel); - void updateIcon(IBinder key, String slot, String iconPackage, int iconId, int iconLevel); - void removeIcon(IBinder key); -} +package com.android.internal.statusbar; + +parcelable StatusBarIcon; + diff --git a/core/java/com/android/internal/statusbar/StatusBarIcon.java b/core/java/com/android/internal/statusbar/StatusBarIcon.java new file mode 100644 index 000000000000..ae2cac2a68f7 --- /dev/null +++ b/core/java/com/android/internal/statusbar/StatusBarIcon.java @@ -0,0 +1,105 @@ +/* + * 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.internal.statusbar; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * @hide + */ +public class StatusBarIcon implements Parcelable { + public String iconPackage; + public int iconId; + public int iconLevel; + public boolean visible = true; + public int number; + + private StatusBarIcon() { + } + + public StatusBarIcon(String iconPackage, int iconId, int iconLevel) { + this.iconPackage = iconPackage; + this.iconId = iconId; + this.iconLevel = iconLevel; + } + + public StatusBarIcon(String iconPackage, int iconId, int iconLevel, int number) { + this.iconPackage = iconPackage; + this.iconId = iconId; + this.iconLevel = iconLevel; + this.number = number; + } + + public String toString() { + return "StatusBarIcon(pkg=" + this.iconPackage + " id=0x" + Integer.toHexString(this.iconId) + + " level=" + this.iconLevel + " visible=" + visible + + " num=" + this.number + " )"; + } + + public StatusBarIcon clone() { + StatusBarIcon that = new StatusBarIcon(this.iconPackage, this.iconId, this.iconLevel); + that.visible = this.visible; + that.number = this.number; + return that; + } + + /** + * Unflatten the StatusBarIcon from a parcel. + */ + public StatusBarIcon(Parcel in) { + readFromParcel(in); + } + + public void readFromParcel(Parcel in) { + this.iconPackage = in.readString(); + this.iconId = in.readInt(); + this.iconLevel = in.readInt(); + this.visible = in.readInt() != 0; + this.number = in.readInt(); + } + + public void writeToParcel(Parcel out, int flags) { + out.writeString(this.iconPackage); + out.writeInt(this.iconId); + out.writeInt(this.iconLevel); + out.writeInt(this.visible ? 1 : 0); + out.writeInt(this.number); + } + + public int describeContents() { + return 0; + } + + /** + * Parcelable.Creator that instantiates StatusBarIcon objects + */ + public static final Parcelable.Creator<StatusBarIcon> CREATOR + = new Parcelable.Creator<StatusBarIcon>() + { + public StatusBarIcon createFromParcel(Parcel parcel) + { + return new StatusBarIcon(parcel); + } + + public StatusBarIcon[] newArray(int size) + { + return new StatusBarIcon[size]; + } + }; +} + diff --git a/services/java/com/android/server/status/StatusBarNotification.java b/core/java/com/android/internal/statusbar/StatusBarIconList.aidl index e5773f7c8fe5..c74512050092 100644 --- a/services/java/com/android/server/status/StatusBarNotification.java +++ b/core/java/com/android/internal/statusbar/StatusBarIconList.aidl @@ -1,27 +1,20 @@ /* - * 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. - * 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. */ -package com.android.server.status; +package com.android.internal.statusbar; -import android.os.IBinder; -import android.view.View; +parcelable StatusBarIconList; -class StatusBarNotification { - IBinder key; - NotificationData data; - View view; - View contentView; -} diff --git a/core/java/com/android/internal/statusbar/StatusBarIconList.java b/core/java/com/android/internal/statusbar/StatusBarIconList.java new file mode 100644 index 000000000000..478d245eb8cd --- /dev/null +++ b/core/java/com/android/internal/statusbar/StatusBarIconList.java @@ -0,0 +1,161 @@ +/* + * 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. + */ + +package com.android.internal.statusbar; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.io.PrintWriter; + +public class StatusBarIconList implements Parcelable { + private String[] mSlots; + private StatusBarIcon[] mIcons; + + public StatusBarIconList() { + } + + public StatusBarIconList(Parcel in) { + readFromParcel(in); + } + + public void readFromParcel(Parcel in) { + this.mSlots = in.readStringArray(); + final int N = in.readInt(); + if (N < 0) { + mIcons = null; + } else { + mIcons = new StatusBarIcon[N]; + for (int i=0; i<N; i++) { + if (in.readInt() != 0) { + mIcons[i] = new StatusBarIcon(in); + } + } + } + } + + public void writeToParcel(Parcel out, int flags) { + out.writeStringArray(mSlots); + if (mIcons == null) { + out.writeInt(-1); + } else { + final int N = mIcons.length; + out.writeInt(N); + for (int i=0; i<N; i++) { + StatusBarIcon ic = mIcons[i]; + if (ic == null) { + out.writeInt(0); + } else { + out.writeInt(1); + ic.writeToParcel(out, flags); + } + } + } + } + + public int describeContents() { + return 0; + } + + /** + * Parcelable.Creator that instantiates StatusBarIconList objects + */ + public static final Parcelable.Creator<StatusBarIconList> CREATOR + = new Parcelable.Creator<StatusBarIconList>() + { + public StatusBarIconList createFromParcel(Parcel parcel) + { + return new StatusBarIconList(parcel); + } + + public StatusBarIconList[] newArray(int size) + { + return new StatusBarIconList[size]; + } + }; + + public void defineSlots(String[] slots) { + final int N = slots.length; + String[] s = mSlots = new String[N]; + for (int i=0; i<N; i++) { + s[i] = slots[i]; + } + mIcons = new StatusBarIcon[N]; + } + + public int getSlotIndex(String slot) { + final int N = mSlots.length; + for (int i=0; i<N; i++) { + if (slot.equals(mSlots[i])) { + return i; + } + } + return -1; + } + + public int size() { + return mSlots.length; + } + + public void setIcon(int index, StatusBarIcon icon) { + mIcons[index] = icon.clone(); + } + + public void removeIcon(int index) { + mIcons[index] = null; + } + + public String getSlot(int index) { + return mSlots[index]; + } + + public StatusBarIcon getIcon(int index) { + return mIcons[index]; + } + + public int getViewIndex(int index) { + int count = 0; + for (int i=0; i<index; i++) { + if (mIcons[i] != null) { + count++; + } + } + return count; + } + + public void copyFrom(StatusBarIconList that) { + if (that.mSlots == null) { + this.mSlots = null; + this.mIcons = null; + } else { + final int N = that.mSlots.length; + this.mSlots = new String[N]; + this.mIcons = new StatusBarIcon[N]; + for (int i=0; i<N; i++) { + this.mSlots[i] = that.mSlots[i]; + this.mIcons[i] = that.mIcons[i] != null ? that.mIcons[i].clone() : null; + } + } + } + + public void dump(PrintWriter pw) { + final int N = mSlots.length; + pw.println("Icon list:"); + for (int i=0; i<N; i++) { + pw.printf(" %2d: (%s) %s\n", i, mSlots[i], mIcons[i]); + } + } +} diff --git a/core/java/com/android/internal/statusbar/StatusBarNotification.aidl b/core/java/com/android/internal/statusbar/StatusBarNotification.aidl new file mode 100644 index 000000000000..bd9e89ce8a42 --- /dev/null +++ b/core/java/com/android/internal/statusbar/StatusBarNotification.aidl @@ -0,0 +1,20 @@ +/* + * 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.internal.statusbar; + +parcelable StatusBarNotification; + diff --git a/core/java/com/android/internal/statusbar/StatusBarNotification.java b/core/java/com/android/internal/statusbar/StatusBarNotification.java new file mode 100644 index 000000000000..5499676467d3 --- /dev/null +++ b/core/java/com/android/internal/statusbar/StatusBarNotification.java @@ -0,0 +1,116 @@ +/* + * 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.internal.statusbar; + +import android.app.Notification; +import android.os.Parcel; +import android.os.Parcelable; +import android.widget.RemoteViews; + + +/* +boolean clearable = !n.ongoingEvent && ((notification.flags & Notification.FLAG_NO_CLEAR) == 0); + + +// TODO: make this restriction do something smarter like never fill +// more than two screens. "Why would anyone need more than 80 characters." :-/ +final int maxTickerLen = 80; +if (truncatedTicker != null && truncatedTicker.length() > maxTickerLen) { + truncatedTicker = truncatedTicker.subSequence(0, maxTickerLen); +} +*/ + +public class StatusBarNotification implements Parcelable { + public String pkg; + public int id; + public String tag; + public Notification notification; + + public StatusBarNotification() { + } + + public StatusBarNotification(String pkg, int id, String tag, Notification notification) { + if (pkg == null) throw new NullPointerException(); + if (notification == null) throw new NullPointerException(); + + this.pkg = pkg; + this.id = id; + this.tag = tag; + this.notification = notification; + } + + public StatusBarNotification(Parcel in) { + readFromParcel(in); + } + + public void readFromParcel(Parcel in) { + this.pkg = in.readString(); + this.id = in.readInt(); + if (in.readInt() != 0) { + this.tag = in.readString(); + } else { + this.tag = null; + } + this.notification = new Notification(in); + } + + public void writeToParcel(Parcel out, int flags) { + out.writeString(this.pkg); + out.writeInt(this.id); + if (this.tag != null) { + out.writeInt(1); + out.writeString(this.tag); + } else { + out.writeInt(0); + } + this.notification.writeToParcel(out, flags); + } + + public int describeContents() { + return 0; + } + + public static final Parcelable.Creator<StatusBarNotification> CREATOR + = new Parcelable.Creator<StatusBarNotification>() + { + public StatusBarNotification createFromParcel(Parcel parcel) + { + return new StatusBarNotification(parcel); + } + + public StatusBarNotification[] newArray(int size) + { + return new StatusBarNotification[size]; + } + }; + + public StatusBarNotification clone() { + return new StatusBarNotification(this.pkg, this.id, this.tag, this.notification.clone()); + } + + public String toString() { + return "StatusBarNotification(package=" + pkg + " id=" + id + " tag=" + tag + + " notification=" + notification + ")"; + } + + public boolean isOngoing() { + return (notification.flags & Notification.FLAG_ONGOING_EVENT) != 0; + } + +} + + diff --git a/core/java/com/android/internal/statusbar/StatusBarNotificationList.aidl b/core/java/com/android/internal/statusbar/StatusBarNotificationList.aidl new file mode 100644 index 000000000000..10abeee94e15 --- /dev/null +++ b/core/java/com/android/internal/statusbar/StatusBarNotificationList.aidl @@ -0,0 +1,20 @@ +/* + * 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.internal.statusbar; + +parcelable StatusBarNotificationList; + diff --git a/core/res/res/drawable-hdpi/battery_charge_fill_empty.9.png b/core/res/res/drawable-hdpi/battery_charge_fill_empty.9.png Binary files differdeleted file mode 100644 index c4e70a81754a..000000000000 --- a/core/res/res/drawable-hdpi/battery_charge_fill_empty.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/battery_charge_fill_full.9.png b/core/res/res/drawable-hdpi/battery_charge_fill_full.9.png Binary files differdeleted file mode 100644 index ac66f5a8dbc9..000000000000 --- a/core/res/res/drawable-hdpi/battery_charge_fill_full.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/battery_charge_fill_warning.9.png b/core/res/res/drawable-hdpi/battery_charge_fill_warning.9.png Binary files differdeleted file mode 100644 index 32d99c686976..000000000000 --- a/core/res/res/drawable-hdpi/battery_charge_fill_warning.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/stat_sys_data_bluetooth.png b/core/res/res/drawable-hdpi/stat_sys_data_bluetooth.png Binary files differindex 96dc0855b80c..7a8b78f6e8db 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_bluetooth.png +++ b/core/res/res/drawable-hdpi/stat_sys_data_bluetooth.png diff --git a/core/res/res/layout/battery_status.xml b/core/res/res/layout/battery_status.xml deleted file mode 100644 index 7cfec0546507..000000000000 --- a/core/res/res/layout/battery_status.xml +++ /dev/null @@ -1,81 +0,0 @@ -<?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. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/frame" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="vertical" - android:gravity="center_horizontal" - > - - <FrameLayout - android:layout_width="141px" - android:layout_height="184px" - android:background="@drawable/battery_charge_background" - android:paddingTop="25px" - android:paddingLeft="1px" - > - - <LinearLayout - android:id="@+id/meter" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - > - - <ImageView - android:layout_width="match_parent" - android:layout_height="15dip" - /> - <ImageView - android:id="@+id/spacer" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - /> - <ImageView - android:id="@+id/level" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - /> - - </LinearLayout> - - <TextView android:id="@+id/level_percent" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:textStyle="bold" - android:textSize="48dp" - android:textColor="#ffffffff" - android:gravity="center" - /> - </FrameLayout> - - <TextView android:id="@+id/status" - android:paddingTop="35dp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:singleLine="true" - android:textStyle="bold" - android:textSize="30dp" - android:textColor="#ffffffff" - android:gravity="center_horizontal" - android:text="@string/battery_status_charging" - /> - -</LinearLayout> - - diff --git a/core/res/res/layout/status_bar_latest_event_content.xml b/core/res/res/layout/status_bar_latest_event_content.xml index ea6200af6123..c64b90ea1daa 100644 --- a/core/res/res/layout/status_bar_latest_event_content.xml +++ b/core/res/res/layout/status_bar_latest_event_content.xml @@ -12,7 +12,8 @@ android:orientation="horizontal" android:paddingTop="3dp" > - <com.android.server.status.AnimatedImageView android:id="@+id/icon" + <!--com.android.server.status.AnimatedImageView android:id="@+id/icon" --> + <ImageView android:id="@+id/icon" android:layout_width="25dp" android:layout_height="25dp" android:scaleType="fitCenter" diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml index a0bc5b36923f..0493756511d6 100644 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -120,25 +120,25 @@ <!-- Do not translate. Defines the slots for the right-hand side icons. That is to say, the icons in the status bar that are not notifications. --> <string-array name="status_bar_icon_order"> - <item><xliff:g id="id">clock</xliff:g></item> - <item><xliff:g id="id">secure</xliff:g></item> - <item><xliff:g id="id">alarm_clock</xliff:g></item> - <item><xliff:g id="id">battery</xliff:g></item> - <item><xliff:g id="id">phone_signal</xliff:g></item> - <item><xliff:g id="id">phone_evdo_signal</xliff:g></item> - <item><xliff:g id="id">data_connection</xliff:g></item> - <item><xliff:g id="id">cdma_eri</xliff:g></item> - <item><xliff:g id="id">wifi</xliff:g></item> - <item><xliff:g id="id">tty</xliff:g></item> - <item><xliff:g id="id">volume</xliff:g></item> - <item><xliff:g id="id">mute</xliff:g></item> - <item><xliff:g id="id">speakerphone</xliff:g></item> - <item><xliff:g id="id">tty</xliff:g></item> - <item><xliff:g id="id">bluetooth</xliff:g></item> - <item><xliff:g id="id">gps</xliff:g></item> - <item><xliff:g id="id">sync_active</xliff:g></item> - <item><xliff:g id="id">sync_failing</xliff:g></item> - <item><xliff:g id="id">ime</xliff:g></item> + <item><xliff:g id="id">ime</xliff:g></item> + <item><xliff:g id="id">sync_failing</xliff:g></item> + <item><xliff:g id="id">sync_active</xliff:g></item> + <item><xliff:g id="id">gps</xliff:g></item> + <item><xliff:g id="id">bluetooth</xliff:g></item> + <item><xliff:g id="id">tty</xliff:g></item> + <item><xliff:g id="id">speakerphone</xliff:g></item> + <item><xliff:g id="id">mute</xliff:g></item> + <item><xliff:g id="id">volume</xliff:g></item> + <item><xliff:g id="id">tty</xliff:g></item> + <item><xliff:g id="id">wifi</xliff:g></item> + <item><xliff:g id="id">cdma_eri</xliff:g></item> + <item><xliff:g id="id">data_connection</xliff:g></item> + <item><xliff:g id="id">phone_evdo_signal</xliff:g></item> + <item><xliff:g id="id">phone_signal</xliff:g></item> + <item><xliff:g id="id">battery</xliff:g></item> + <item><xliff:g id="id">alarm_clock</xliff:g></item> + <item><xliff:g id="id">secure</xliff:g></item> + <item><xliff:g id="id">clock</xliff:g></item> </string-array> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 64f05fefd291..cd47ae956194 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -220,9 +220,6 @@ <!-- Allow the menu hard key to be disabled in LockScreen on some devices --> <bool name="config_disableMenuKeyInLockScreen">false</bool> - <!-- Control whether status bar should distinguish HSPA data icon form UMTS data icon on devices --> - <bool name="config_hspa_data_distinguishable">false</bool> - <!-- Array of light sensor LUX values to define our levels for auto backlight brightness support. The N entries of this array define N + 1 zones as follows: diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 1e007d3654c0..613a9a29a7cd 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1567,45 +1567,6 @@ <!-- A format string for 12-hour time of day, just the hour, not the minute, with capital "AM" or "PM" (example: "3PM"). --> <string name="hour_cap_ampm">"<xliff:g id="hour" example="3">%-l</xliff:g><xliff:g id="ampm" example="PM">%p</xliff:g>"</string> - <!-- 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</string> - - <!-- The label in the bar at the top of the status bar when there are no notifications - showing. --> - <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. --> - <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. --> - <string name="status_bar_latest_events_title">Notifications</string> - - <!-- The big percent text in the middle of the battery icon that appears when you plug in - the charger. --> - <string name="battery_status_text_percent_format"><xliff:g id="number" example="50">%d</xliff:g><xliff:g id="percent" example="%">%%</xliff:g></string> - - <!-- The big percent text in the middle of the battery icon that appears when you plug in - the charger. This indicates the current status of the battery. --> - <string name="battery_status_charging">Charging\u2026</string> - - <!-- When the battery is low, this is displayed to the user in a dialog. The title of the low battery alert. --> - <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> - - <!-- 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> - - <!-- 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. --> - <string name="battery_low_why">Battery use</string> - <!-- Title of the alert when something went wrong in the factory test. --> <string name="factorytest_failed">Factory test failed</string> <!-- Error message displayed when a non-system application tries to start a factory test. --> diff --git a/docs/html/guide/topics/data/backup.jd b/docs/html/guide/topics/data/backup.jd index 74117d6fae7c..aad0f923c41d 100644 --- a/docs/html/guide/topics/data/backup.jd +++ b/docs/html/guide/topics/data/backup.jd @@ -445,7 +445,7 @@ onBackup()}. <p>For an example implementation of {@link android.app.backup.BackupAgent}, see the <a href="{@docRoot}resources/samples/BackupRestore/src/com/example/android/backuprestore/ExampleAgent.html">{@code ExampleAgent}</a> class in the <a -href="{@docRoot}}resources/samples/BackupRestore/index.html">Backup and Restore</a> sample +href="{@docRoot}resources/samples/BackupRestore/index.html">Backup and Restore</a> sample application.</p> </div> diff --git a/docs/html/resources/tutorials/views/hello-webview.jd b/docs/html/resources/tutorials/views/hello-webview.jd index 17b26465749f..2d07647382d0 100644 --- a/docs/html/resources/tutorials/views/hello-webview.jd +++ b/docs/html/resources/tutorials/views/hello-webview.jd @@ -12,7 +12,7 @@ that can view and navigate web pages.</p> <li>Open the <code>res/layout/main.xml</code> file and insert the following: <pre> <?xml version="1.0" encoding="utf-8"?> -<WebView +<WebView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" @@ -79,7 +79,7 @@ private class HelloWebViewClient extends WebViewClient { </li> <li>Then towards the end of the {@link android.app.Activity#onCreate(Bundle)} method, set an instance of the <code>HelloWebViewClient</code> as the {@link android.webkit.WebViewClient}: - <pre>mWebView.setWebViewClient(new WebViewClientDemo());</pre> + <pre>mWebView.setWebViewClient(new HelloWebViewClient());</pre> <p>This line can go anywhere following the initialization of the {@link android.webkit.WebView} object.</p> diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk new file mode 100644 index 000000000000..4c83768d9cee --- /dev/null +++ b/packages/SystemUI/Android.mk @@ -0,0 +1,13 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_JAVA_LIBRARIES := services + +LOCAL_PACKAGE_NAME := SystemUI +LOCAL_CERTIFICATE := platform + +include $(BUILD_PACKAGE) diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml new file mode 100644 index 000000000000..3f5b69d84ae3 --- /dev/null +++ b/packages/SystemUI/AndroidManifest.xml @@ -0,0 +1,22 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.systemui" + android:sharedUserId="android.uid.system"> + + <application + android:allowClearUserData="false" + android:label="@string/app_label" + android:icon="@drawable/ic_launcher_settings"> + + <receiver + android:name=".statusbar.StatusBarStarter" + > + <intent-filter> + <action android:name="com.android.internal.policy.statusbar.START" /> + </intent-filter> + </receiver> + <service + android:name=".statusbar.PhoneStatusBarService" + android:exported="false" + /> + </application> +</manifest> diff --git a/packages/SystemUI/MODULE_LICENSE_APACHE2 b/packages/SystemUI/MODULE_LICENSE_APACHE2 new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/packages/SystemUI/MODULE_LICENSE_APACHE2 diff --git a/packages/SystemUI/NOTICE b/packages/SystemUI/NOTICE new file mode 100644 index 000000000000..c5b1efa7aac7 --- /dev/null +++ b/packages/SystemUI/NOTICE @@ -0,0 +1,190 @@ + + Copyright (c) 2005-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. + + 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. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/core/res/res/drawable-hdpi/battery_low_battery.png b/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png Binary files differindex d894f7bbe894..d894f7bbe894 100644 --- a/core/res/res/drawable-hdpi/battery_low_battery.png +++ b/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal.9.png Binary files differnew file mode 100644 index 000000000000..baafed647bc7 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable.9.png Binary files differnew file mode 100644 index 000000000000..175197bb2ec7 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable_focused.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable_focused.9.png Binary files differnew file mode 100644 index 000000000000..ec1feff39597 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable_focused.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_pressed.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_pressed.9.png Binary files differnew file mode 100644 index 000000000000..c1f9a0f20113 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/btn_default_small_pressed.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_selected.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_selected.9.png Binary files differnew file mode 100644 index 000000000000..0ea3f4050cca --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/btn_default_small_selected.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_launcher_settings.png b/packages/SystemUI/res/drawable-hdpi/ic_launcher_settings.png Binary files differnew file mode 100644 index 000000000000..ff34a7ffcc4f --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_launcher_settings.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png Binary files differnew file mode 100644 index 000000000000..744178f1abeb --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/shade_bg.png b/packages/SystemUI/res/drawable-hdpi/shade_bg.png Binary files differnew file mode 100644 index 000000000000..3d00cd0f9a5e --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/shade_bg.png diff --git a/packages/SystemUI/res/drawable-hdpi/shade_handlebar.9.png b/packages/SystemUI/res/drawable-hdpi/shade_handlebar.9.png Binary files differnew file mode 100644 index 000000000000..f313ffba5769 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/shade_handlebar.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/shade_header_background.9.png b/packages/SystemUI/res/drawable-hdpi/shade_header_background.9.png Binary files differnew file mode 100644 index 000000000000..37b5fef592d1 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/shade_header_background.9.png diff --git a/core/res/res/drawable-hdpi/stat_notify_alarm.png b/packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.png Binary files differindex 89daee190668..89daee190668 100644 --- a/core/res/res/drawable-hdpi/stat_notify_alarm.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_notify_more.png b/packages/SystemUI/res/drawable-hdpi/stat_notify_more.png Binary files differnew file mode 100755 index 000000000000..1c7f9dbf4b73 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_notify_more.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png Binary files differnew file mode 100644 index 000000000000..96dc0855b80c --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png Binary files differindex 1e4bbf52c4f5..1e4bbf52c4f5 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png Binary files differindex 12d4ac411e97..12d4ac411e97 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_connected_1x.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png Binary files differindex 4f1f3774d7dc..4f1f3774d7dc 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_connected_3g.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png Binary files differindex c65f56ae0179..c65f56ae0179 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_connected_e.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png Binary files differindex 4aca0c7dda99..4aca0c7dda99 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_connected_g.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png Binary files differindex 24e07aba1dee..24e07aba1dee 100755 --- a/core/res/res/drawable-hdpi/stat_sys_data_connected_h.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_in_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png Binary files differindex 511e22a1f93f..511e22a1f93f 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_in_1x.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_in_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png Binary files differindex 64f8087f4e11..64f8087f4e11 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_in_3g.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_in_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png Binary files differindex 90aaf71a994d..90aaf71a994d 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_in_e.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_in_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png Binary files differindex c21387e27f63..c21387e27f63 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_in_g.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_in_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png Binary files differindex f2f6daa29309..f2f6daa29309 100755 --- a/core/res/res/drawable-hdpi/stat_sys_data_in_h.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_inandout_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.png Binary files differindex 19ea80c5de9b..19ea80c5de9b 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_inandout_1x.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_inandout_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png Binary files differindex ebfa6fb6ee7f..ebfa6fb6ee7f 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_inandout_3g.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_inandout_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png Binary files differindex 7ccd7dea45ad..7ccd7dea45ad 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_inandout_e.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_inandout_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png Binary files differindex c614d0d84187..c614d0d84187 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_inandout_g.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_inandout_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png Binary files differindex 5d6ef05c0fb1..5d6ef05c0fb1 100755 --- a/core/res/res/drawable-hdpi/stat_sys_data_inandout_h.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_out_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png Binary files differindex adf5f955c493..adf5f955c493 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_out_1x.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_out_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png Binary files differindex 9936f2ab7377..9936f2ab7377 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_out_3g.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_out_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png Binary files differindex 904c5650e1a1..904c5650e1a1 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_out_e.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_out_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png Binary files differindex 1261c152a3ad..1261c152a3ad 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_out_g.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_out_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png Binary files differindex 5e3122d612d6..5e3122d612d6 100755 --- a/core/res/res/drawable-hdpi/stat_sys_data_out_h.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png diff --git a/core/res/res/drawable-hdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png Binary files differindex 9003d671b164..9003d671b164 100644 --- a/core/res/res/drawable-hdpi/stat_sys_gps_acquiring.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png diff --git a/core/res/res/drawable-hdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png Binary files differindex 157491e8e5c7..157491e8e5c7 100644 --- a/core/res/res/drawable-hdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png diff --git a/core/res/res/drawable-hdpi/stat_sys_r_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.png Binary files differindex 95ba18137f6b..95ba18137f6b 100644 --- a/core/res/res/drawable-hdpi/stat_sys_r_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.png diff --git a/core/res/res/drawable-hdpi/stat_sys_r_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1.png Binary files differindex adf668d1c507..adf668d1c507 100644 --- a/core/res/res/drawable-hdpi/stat_sys_r_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1.png diff --git a/core/res/res/drawable-hdpi/stat_sys_r_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.png Binary files differindex 7bf6b51066fe..7bf6b51066fe 100644 --- a/core/res/res/drawable-hdpi/stat_sys_r_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.png diff --git a/core/res/res/drawable-hdpi/stat_sys_r_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.png Binary files differindex 78738ac73ec7..78738ac73ec7 100644 --- a/core/res/res/drawable-hdpi/stat_sys_r_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.png diff --git a/core/res/res/drawable-hdpi/stat_sys_r_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.png Binary files differindex ac881431aae2..ac881431aae2 100644 --- a/core/res/res/drawable-hdpi/stat_sys_r_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.png diff --git a/core/res/res/drawable-hdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png Binary files differindex bdd37e10d8e3..bdd37e10d8e3 100644 --- a/core/res/res/drawable-hdpi/stat_sys_ringer_silent.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png diff --git a/core/res/res/drawable-hdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png Binary files differindex 21c1c0846946..21c1c0846946 100644 --- a/core/res/res/drawable-hdpi/stat_sys_ringer_vibrate.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png diff --git a/core/res/res/drawable-hdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png Binary files differindex adde938b24f1..adde938b24f1 100644 --- a/core/res/res/drawable-hdpi/stat_sys_roaming_cdma_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png diff --git a/core/res/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim0.png Binary files differindex 245677b6a725..245677b6a725 100644 --- a/core/res/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim0.png diff --git a/core/res/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim1.png Binary files differindex adde938b24f1..adde938b24f1 100644 --- a/core/res/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_flash_anim1.png diff --git a/core/res/res/drawable-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png Binary files differindex 3e317ddfa7e4..3e317ddfa7e4 100644 --- a/core/res/res/drawable-hdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png diff --git a/core/res/res/drawable-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png Binary files differindex 72329f82a731..72329f82a731 100644 --- a/core/res/res/drawable-hdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png diff --git a/core/res/res/drawable-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png Binary files differindex 558c49cd7caa..558c49cd7caa 100644 --- a/core/res/res/drawable-hdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png diff --git a/core/res/res/drawable-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png Binary files differindex 6440bddb6927..6440bddb6927 100644 --- a/core/res/res/drawable-hdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png diff --git a/core/res/res/drawable-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png Binary files differindex fe204230c736..fe204230c736 100644 --- a/core/res/res/drawable-hdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png diff --git a/core/res/res/drawable-hdpi/stat_sys_signal_flightmode.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png Binary files differindex 7a419f1616e0..7a419f1616e0 100644 --- a/core/res/res/drawable-hdpi/stat_sys_signal_flightmode.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png diff --git a/core/res/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png Binary files differindex 1adc05aa0831..1adc05aa0831 100644 --- a/core/res/res/drawable-hdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png diff --git a/core/res/res/drawable-hdpi/stat_sys_tty_mode.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png Binary files differindex 4e161c6f6e4c..4e161c6f6e4c 100644 --- a/core/res/res/drawable-hdpi/stat_sys_tty_mode.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png diff --git a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png Binary files differindex 55a2ad82f976..55a2ad82f976 100644 --- a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png diff --git a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png Binary files differindex d16b3e8d8e78..d16b3e8d8e78 100644 --- a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png diff --git a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png Binary files differindex 2511083e9a16..2511083e9a16 100644 --- a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png diff --git a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png Binary files differindex e0799a573c89..e0799a573c89 100644 --- a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png diff --git a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png Binary files differindex 2385c3a492ed..2385c3a492ed 100644 --- a/core/res/res/drawable-hdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_background.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_background.9.png Binary files differnew file mode 100644 index 000000000000..a4be29879663 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/status_bar_background.9.png 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 Binary files differnew file mode 100644 index 000000000000..4fbfa4f0ecc7 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/status_bar_item_app_background_normal.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_item_background_focus.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_item_background_focus.9.png Binary files differnew file mode 100644 index 000000000000..0876bc6e2f05 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/status_bar_item_background_focus.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_item_background_normal.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_item_background_normal.9.png Binary files differnew file mode 100644 index 000000000000..c01c018683f2 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/status_bar_item_background_normal.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_item_background_pressed.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_item_background_pressed.9.png Binary files differnew file mode 100644 index 000000000000..343e4ca7f927 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/status_bar_item_background_pressed.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/title_bar_portrait.9.png b/packages/SystemUI/res/drawable-hdpi/title_bar_portrait.9.png Binary files differnew file mode 100644 index 000000000000..70f7cc2987a4 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/title_bar_portrait.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png b/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png Binary files differnew file mode 100644 index 000000000000..e6dab63b593c --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png diff --git a/core/res/res/drawable-mdpi/battery_low_battery.png b/packages/SystemUI/res/drawable-mdpi/battery_low_battery.png Binary files differindex 60bbe6c1f85f..60bbe6c1f85f 100644 --- a/core/res/res/drawable-mdpi/battery_low_battery.png +++ b/packages/SystemUI/res/drawable-mdpi/battery_low_battery.png diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal.9.png Binary files differnew file mode 100644 index 000000000000..bcedd5f0ff38 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable.9.png Binary files differnew file mode 100644 index 000000000000..ac6260f906c8 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable_focused.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable_focused.9.png Binary files differnew file mode 100644 index 000000000000..4ee1b3fb17a7 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable_focused.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_pressed.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_pressed.9.png Binary files differnew file mode 100644 index 000000000000..25e38f4e7635 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/btn_default_small_pressed.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_selected.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_selected.9.png Binary files differnew file mode 100644 index 000000000000..cc209c6a21c5 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/btn_default_small_selected.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_launcher_settings.png b/packages/SystemUI/res/drawable-mdpi/ic_launcher_settings.png Binary files differnew file mode 100644 index 000000000000..b08ad3bd494b --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_launcher_settings.png diff --git a/core/res/res/drawable-mdpi/battery_charge_fill_full.9.png b/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png Binary files differindex 8e6aaca1e7dc..1a3063c4b3fd 100644 --- a/core/res/res/drawable-mdpi/battery_charge_fill_full.9.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/shade_bg.png b/packages/SystemUI/res/drawable-mdpi/shade_bg.png Binary files differnew file mode 100644 index 000000000000..941d3b1fb69b --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/shade_bg.png diff --git a/packages/SystemUI/res/drawable-mdpi/shade_handlebar.9.png b/packages/SystemUI/res/drawable-mdpi/shade_handlebar.9.png Binary files differnew file mode 100644 index 000000000000..9cbd9fe5036b --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/shade_handlebar.9.png diff --git a/core/res/res/drawable-mdpi/battery_charge_fill_warning.9.png b/packages/SystemUI/res/drawable-mdpi/shade_header_background.9.png Binary files differindex d3287db975d2..fa9a90c1ee45 100644 --- a/core/res/res/drawable-mdpi/battery_charge_fill_warning.9.png +++ b/packages/SystemUI/res/drawable-mdpi/shade_header_background.9.png diff --git a/core/res/res/drawable-mdpi/stat_notify_alarm.png b/packages/SystemUI/res/drawable-mdpi/stat_notify_alarm.png Binary files differindex 1b01b850619d..1b01b850619d 100644 --- a/core/res/res/drawable-mdpi/stat_notify_alarm.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_notify_alarm.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_notify_more.png b/packages/SystemUI/res/drawable-mdpi/stat_notify_more.png Binary files differnew file mode 100644 index 000000000000..e129ba9723a6 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/stat_notify_more.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png Binary files differindex f09b83bfad67..f09b83bfad67 100755 --- a/core/res/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth_connected.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png Binary files differindex 130724fd0550..130724fd0550 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_connected_1x.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png Binary files differindex a1092807a9cf..a1092807a9cf 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_connected_3g.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png Binary files differindex c55264447967..c55264447967 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_connected_e.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png Binary files differindex f7edb49954c4..f7edb49954c4 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_connected_g.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png Binary files differindex 7d5413afcb6c..7d5413afcb6c 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_connected_h.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_in_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_1x.png Binary files differindex 3155e632fe7b..3155e632fe7b 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_in_1x.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_1x.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_in_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_3g.png Binary files differindex 01b003ce85ef..01b003ce85ef 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_in_3g.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_3g.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_in_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_e.png Binary files differindex bffa0eb1a5b1..bffa0eb1a5b1 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_in_e.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_e.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_in_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_g.png Binary files differindex 8884b482e3b4..8884b482e3b4 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_in_g.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_g.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_in_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_h.png Binary files differindex 695b80c36bcf..695b80c36bcf 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_in_h.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_in_h.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_inandout_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_1x.png Binary files differindex 1017e3bb4166..1017e3bb4166 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_inandout_1x.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_1x.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_inandout_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_3g.png Binary files differindex 365130064ebe..365130064ebe 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_inandout_3g.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_3g.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_inandout_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_e.png Binary files differindex 99533e0cade9..99533e0cade9 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_inandout_e.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_e.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_inandout_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_g.png Binary files differindex f4e5a12ed445..f4e5a12ed445 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_inandout_g.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_g.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_inandout_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_h.png Binary files differindex 467acd137a1c..467acd137a1c 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_inandout_h.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_inandout_h.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_out_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_1x.png Binary files differindex 54187912f6b8..54187912f6b8 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_out_1x.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_1x.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_out_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_3g.png Binary files differindex f7f0f894d68d..f7f0f894d68d 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_out_3g.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_3g.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_out_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_e.png Binary files differindex c91542635862..c91542635862 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_out_e.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_e.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_out_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_g.png Binary files differindex 5d36035158b9..5d36035158b9 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_out_g.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_g.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_out_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_h.png Binary files differindex da503054bf6f..da503054bf6f 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_out_h.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_out_h.png diff --git a/core/res/res/drawable-mdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png Binary files differindex 31bc94ec1e56..31bc94ec1e56 100644 --- a/core/res/res/drawable-mdpi/stat_sys_gps_acquiring.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png diff --git a/core/res/res/drawable-mdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png Binary files differindex 2134d490fd01..2134d490fd01 100644 --- a/core/res/res/drawable-mdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png diff --git a/core/res/res/drawable-mdpi/stat_sys_r_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0.png Binary files differindex bfbf18e63bde..bfbf18e63bde 100644 --- a/core/res/res/drawable-mdpi/stat_sys_r_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0.png diff --git a/core/res/res/drawable-mdpi/stat_sys_r_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1.png Binary files differindex 896ba4d5e206..896ba4d5e206 100644 --- a/core/res/res/drawable-mdpi/stat_sys_r_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1.png diff --git a/core/res/res/drawable-mdpi/stat_sys_r_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2.png Binary files differindex af79eff67ff6..af79eff67ff6 100644 --- a/core/res/res/drawable-mdpi/stat_sys_r_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2.png diff --git a/core/res/res/drawable-mdpi/stat_sys_r_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3.png Binary files differindex 92c09c8c8728..92c09c8c8728 100644 --- a/core/res/res/drawable-mdpi/stat_sys_r_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3.png diff --git a/core/res/res/drawable-mdpi/stat_sys_r_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4.png Binary files differindex f04fb11b4e73..f04fb11b4e73 100644 --- a/core/res/res/drawable-mdpi/stat_sys_r_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4.png diff --git a/core/res/res/drawable-mdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png Binary files differindex d62f32d72b19..d62f32d72b19 100644 --- a/core/res/res/drawable-mdpi/stat_sys_ringer_silent.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png diff --git a/core/res/res/drawable-mdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png Binary files differindex 665ca38fefbd..665ca38fefbd 100644 --- a/core/res/res/drawable-mdpi/stat_sys_ringer_vibrate.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png diff --git a/core/res/res/drawable-mdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png Binary files differindex c61cce774ec7..c61cce774ec7 100755 --- a/core/res/res/drawable-mdpi/stat_sys_roaming_cdma_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png diff --git a/core/res/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim0.png Binary files differindex d62502dcb78d..d62502dcb78d 100755 --- a/core/res/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim0.png diff --git a/core/res/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim1.png Binary files differindex c61cce774ec7..c61cce774ec7 100755 --- a/core/res/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_flash_anim1.png diff --git a/core/res/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png Binary files differindex cb7b7b34bf08..cb7b7b34bf08 100644 --- a/core/res/res/drawable-mdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png diff --git a/core/res/res/drawable-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png Binary files differindex 5376e9258d60..5376e9258d60 100644 --- a/core/res/res/drawable-mdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png diff --git a/core/res/res/drawable-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png Binary files differindex fd543636c9d5..fd543636c9d5 100644 --- a/core/res/res/drawable-mdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png diff --git a/core/res/res/drawable-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png Binary files differindex 6c4873af3bdf..6c4873af3bdf 100644 --- a/core/res/res/drawable-mdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png diff --git a/core/res/res/drawable-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png Binary files differindex a3320cbb4fd2..a3320cbb4fd2 100644 --- a/core/res/res/drawable-mdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png diff --git a/core/res/res/drawable-mdpi/stat_sys_signal_flightmode.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_flightmode.png Binary files differindex 2f4fd4fe1f57..2f4fd4fe1f57 100755 --- a/core/res/res/drawable-mdpi/stat_sys_signal_flightmode.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_flightmode.png diff --git a/core/res/res/drawable-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png Binary files differindex 5aa23f6c7348..5aa23f6c7348 100644 --- a/core/res/res/drawable-mdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png diff --git a/core/res/res/drawable-mdpi/stat_sys_tty_mode.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png Binary files differindex ed157a8722a4..ed157a8722a4 100644 --- a/core/res/res/drawable-mdpi/stat_sys_tty_mode.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png diff --git a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png Binary files differindex 8ee3421fb72b..8ee3421fb72b 100644 --- a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png diff --git a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png Binary files differindex 184fa366ed04..184fa366ed04 100644 --- a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png diff --git a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png Binary files differindex 79935bb7e3d1..79935bb7e3d1 100644 --- a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png diff --git a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png Binary files differindex d2099e616a41..d2099e616a41 100644 --- a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png diff --git a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png Binary files differindex 2062aada3e3e..2062aada3e3e 100644 --- a/core/res/res/drawable-mdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_background.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_background.9.png Binary files differnew file mode 100644 index 000000000000..eb7c1a4d7819 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/status_bar_background.9.png diff --git a/core/res/res/drawable-mdpi/battery_charge_fill_empty.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_item_app_background_normal.9.png Binary files differindex 9ed20ba23bac..c0796153ec06 100644 --- a/core/res/res/drawable-mdpi/battery_charge_fill_empty.9.png +++ b/packages/SystemUI/res/drawable-mdpi/status_bar_item_app_background_normal.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_item_background_focus.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_item_background_focus.9.png Binary files differnew file mode 100644 index 000000000000..c3e241586642 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/status_bar_item_background_focus.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_item_background_normal.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_item_background_normal.9.png Binary files differnew file mode 100644 index 000000000000..b8e399d9d514 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/status_bar_item_background_normal.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_item_background_pressed.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_item_background_pressed.9.png Binary files differnew file mode 100644 index 000000000000..02b4e9a536fe --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/status_bar_item_background_pressed.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/title_bar_portrait.9.png b/packages/SystemUI/res/drawable-mdpi/title_bar_portrait.9.png Binary files differnew file mode 100644 index 000000000000..13b18d84ba11 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/title_bar_portrait.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png b/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png Binary files differnew file mode 100644 index 000000000000..dbcefee17a32 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png diff --git a/packages/SystemUI/res/drawable/btn_default_small.xml b/packages/SystemUI/res/drawable/btn_default_small.xml new file mode 100644 index 000000000000..5485ea03027b --- /dev/null +++ b/packages/SystemUI/res/drawable/btn_default_small.xml @@ -0,0 +1,33 @@ +<?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_window_focused="false" android:state_enabled="true" + android:drawable="@drawable/btn_default_small_normal" /> + <item android:state_window_focused="false" android:state_enabled="false" + android:drawable="@drawable/btn_default_small_normal_disable" /> + <item android:state_pressed="true" + android:drawable="@drawable/btn_default_small_pressed" /> + <item android:state_focused="true" android:state_enabled="true" + android:drawable="@drawable/btn_default_small_selected" /> + <item android:state_enabled="true" + android:drawable="@drawable/btn_default_small_normal" /> + <item android:state_focused="true" + android:drawable="@drawable/btn_default_small_normal_disable_focused" /> + <item + android:drawable="@drawable/btn_default_small_normal_disable" /> +</selector> + diff --git a/core/res/res/drawable/stat_sys_gps_acquiring_anim.xml b/packages/SystemUI/res/drawable/stat_sys_gps_acquiring_anim.xml index 954c19ce10eb..393697cb3508 100644 --- a/core/res/res/drawable/stat_sys_gps_acquiring_anim.xml +++ b/packages/SystemUI/res/drawable/stat_sys_gps_acquiring_anim.xml @@ -21,5 +21,5 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/stat_sys_gps_acquiring" android:duration="500" /> - <item android:drawable="@drawable/stat_sys_gps_on" android:duration="500" /> + <item android:drawable="@*android:drawable/stat_sys_gps_on" android:duration="500" /> </animation-list> diff --git a/core/res/res/drawable/stat_sys_roaming_cdma_flash.xml b/packages/SystemUI/res/drawable/stat_sys_roaming_cdma_flash.xml index 07dc4465ee32..07dc4465ee32 100644 --- a/core/res/res/drawable/stat_sys_roaming_cdma_flash.xml +++ b/packages/SystemUI/res/drawable/stat_sys_roaming_cdma_flash.xml diff --git a/core/res/res/layout/battery_low.xml b/packages/SystemUI/res/layout/battery_low.xml index 3b62fb0c78de..3b62fb0c78de 100644 --- a/core/res/res/layout/battery_low.xml +++ b/packages/SystemUI/res/layout/battery_low.xml diff --git a/core/res/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index 2237ee43b716..5fe8e79f8145 100644 --- a/core/res/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -19,8 +19,9 @@ --> <!-- android:background="@drawable/status_bar_closed_default_background" --> -<com.android.server.status.StatusBarView xmlns:android="http://schemas.android.com/apk/res/android" - android:background="@drawable/statusbar_background" +<com.android.systemui.statusbar.StatusBarView + xmlns:android="http://schemas.android.com/apk/res/android" + android:background="@drawable/status_bar_background" android:orientation="vertical" android:focusable="true" android:descendantFocusability="afterDescendants" @@ -31,7 +32,7 @@ android:layout_height="match_parent" android:orientation="horizontal"> - <com.android.server.status.IconMerger android:id="@+id/notificationIcons" + <com.android.systemui.statusbar.IconMerger android:id="@+id/notificationIcons" android:layout_width="0dip" android:layout_weight="1" android:layout_height="match_parent" @@ -47,6 +48,17 @@ android:paddingRight="6dip" android:gravity="center_vertical" android:orientation="horizontal"/> + + <com.android.systemui.statusbar.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> <LinearLayout android:id="@+id/ticker" @@ -60,44 +72,44 @@ android:layout_height="match_parent" android:layout_marginRight="8dip" > - <com.android.server.status.AnimatedImageView + <com.android.systemui.statusbar.AnimatedImageView android:layout_width="25dip" android:layout_height="25dip" /> - <com.android.server.status.AnimatedImageView + <com.android.systemui.statusbar.AnimatedImageView android:layout_width="25dip" android:layout_height="25dip" /> </ImageSwitcher> - <com.android.server.status.TickerView android:id="@+id/tickerText" + <com.android.systemui.statusbar.TickerView android:id="@+id/tickerText" android:layout_width="0dip" android:layout_weight="1" android:layout_height="wrap_content" android:paddingTop="2dip" android:paddingRight="10dip"> <TextView - android:textAppearance="@style/TextAppearance.StatusBar.Ticker" + android:textAppearance="@*android:style/TextAppearance.StatusBar.Ticker" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" /> <TextView - android:textAppearance="@style/TextAppearance.StatusBar.Ticker" + android:textAppearance="@*android:style/TextAppearance.StatusBar.Ticker" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" /> - </com.android.server.status.TickerView> + </com.android.systemui.statusbar.TickerView> </LinearLayout> - <com.android.server.status.DateView android:id="@+id/date" - android:textAppearance="@style/TextAppearance.StatusBar.Icon" + <com.android.systemui.statusbar.DateView android:id="@+id/date" + android:textAppearance="@*android:style/TextAppearance.StatusBar.Icon" android:layout_width="wrap_content" android:layout_height="match_parent" android:singleLine="true" android:gravity="center_vertical|left" android:paddingLeft="6px" android:paddingRight="6px" - android:background="@drawable/statusbar_background" + android:background="@drawable/status_bar_background" /> -</com.android.server.status.StatusBarView> +</com.android.systemui.statusbar.StatusBarView> diff --git a/core/res/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index 68eb9222bb4b..b5b1b507988a 100644 --- a/core/res/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -18,7 +18,7 @@ */ --> -<com.android.server.status.ExpandedView xmlns:android="http://schemas.android.com/apk/res/android" +<com.android.systemui.statusbar.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/status_bar_header_background" + android:background="@drawable/shade_header_background" > - <LinearLayout + <com.android.systemui.statusbar.CarrierLabel android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" @@ -41,25 +41,10 @@ android:layout_marginLeft="5dp" android:layout_gravity="center_vertical" android:paddingBottom="1dp" - android:orientation="vertical" - > - <TextView android:id="@+id/plmnLabel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:textAppearance="?android:attr/textAppearanceLarge" - android:textColor="?android:attr/textColorSecondary" - android:paddingLeft="4dp" - /> - <TextView android:id="@+id/spnLabel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:textAppearance="?android:attr/textAppearanceLarge" - android:textColor="?android:attr/textColorSecondary" - android:paddingLeft="4dp" - /> - </LinearLayout> + android:paddingLeft="4dp" + android:textAppearance="?android:attr/textAppearanceLarge" + android:textColor="?android:attr/textColorSecondary" + /> <TextView android:id="@+id/clear_all_button" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -67,7 +52,7 @@ android:layout_marginTop="4dp" android:layout_marginBottom="1dp" android:textSize="14sp" - android:textColor="?android:attr/textColorPrimaryInverse" + android:textColor="#ff000000" android:text="@string/status_bar_clear_all_button" style="?android:attr/buttonStyle" android:paddingLeft="15dp" @@ -87,7 +72,7 @@ android:layout_height="match_parent" android:fadingEdge="none" > - <com.android.server.status.NotificationLinearLayout + <com.android.systemui.statusbar.NotificationLinearLayout android:id="@+id/notificationLinearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -130,7 +115,7 @@ android:layout_height="wrap_content" android:orientation="vertical" /> - </com.android.server.status.NotificationLinearLayout> + </com.android.systemui.statusbar.NotificationLinearLayout> </ScrollView> <ImageView @@ -141,4 +126,4 @@ /> </FrameLayout> -</com.android.server.status.ExpandedView> +</com.android.systemui.statusbar.ExpandedView> diff --git a/core/res/res/layout/status_bar_icon.xml b/packages/SystemUI/res/layout/status_bar_icon.xml index 05367923c397..21d606f0db94 100644 --- a/core/res/res/layout/status_bar_icon.xml +++ b/packages/SystemUI/res/layout/status_bar_icon.xml @@ -25,7 +25,7 @@ android:layout_height="25dp" > - <com.android.server.status.AnimatedImageView android:id="@+id/image" + <com.android.systemui.statusbar.AnimatedImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="match_parent" /> diff --git a/core/res/res/layout/status_bar_tracking.xml b/packages/SystemUI/res/layout/status_bar_tracking.xml index c0a7a977545f..a2b40e601316 100644 --- a/core/res/res/layout/status_bar_tracking.xml +++ b/packages/SystemUI/res/layout/status_bar_tracking.xml @@ -15,7 +15,8 @@ limitations under the License. --> -<com.android.server.status.TrackingView xmlns:android="http://schemas.android.com/apk/res/android" +<com.android.systemui.statusbar.TrackingView + xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:visibility="gone" android:focusable="true" @@ -25,13 +26,13 @@ android:paddingRight="0px" > - <com.android.server.status.TrackingPatternView + <com.android.systemui.statusbar.TrackingPatternView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" /> - <com.android.server.status.CloseDragHandle android:id="@+id/close" + <com.android.systemui.statusbar.CloseDragHandle android:id="@+id/close" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" @@ -41,8 +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.server.status.CloseDragHandle> + </com.android.systemui.statusbar.CloseDragHandle> -</com.android.server.status.TrackingView> +</com.android.systemui.statusbar.TrackingView> diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml new file mode 100644 index 000000000000..dbb0e0f4cc83 --- /dev/null +++ b/packages/SystemUI/res/values/arrays.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/colors.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. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Do not translate. Defines the slots for the right-hand side icons. That is to say, the + icons in the status bar that are not notifications. --> + <string-array name="status_bar_icon_order"> + <item><xliff:g id="id">TODO: Remove; not used.</xliff:g></item> + </string-array> + +</resources> diff --git a/core/res/res/drawable/status_icon_background.xml b/packages/SystemUI/res/values/config.xml index 9846165e1253..8ea46e583a95 100644 --- a/core/res/res/drawable/status_icon_background.xml +++ b/packages/SystemUI/res/values/config.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <!-- -/* //device/apps/common/res/drawable/status_icon_background.xml -** -** Copyright 2007, The Android Open Source Project +/* +** 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. @@ -18,7 +17,10 @@ */ --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_selected="true" android:drawable="@drawable/icon_highlight_rectangle" /> - <item android:drawable="@color/transparent" /> -</selector> +<!-- 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 --> + <bool name="config_hspa_data_distinguishable">false</bool> +</resources> + diff --git a/packages/SystemUI/res/values/defaults.xml b/packages/SystemUI/res/values/defaults.xml new file mode 100644 index 000000000000..34302c4792ab --- /dev/null +++ b/packages/SystemUI/res/values/defaults.xml @@ -0,0 +1,78 @@ +<?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> + <bool name="def_dim_screen">true</bool> + <integer name="def_screen_off_timeout">60000</integer> + <bool name="def_airplane_mode_on">false</bool> + <!-- Comma-separated list of bluetooth, wifi, and cell. --> + <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi</string> + <string name="airplane_mode_toggleable_radios" translatable="false">wifi</string> + <bool name="def_auto_time">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> + <bool name="def_screen_brightness_automatic_mode">false</bool> + <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. + Network location is off by default because it requires + 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> + <!-- 0 == mobile, 1 == wifi. --> + <integer name="def_network_preference">1</integer> + <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"></string> + <!-- Default value for whether or not to pulse the notification LED when there is a + pending notification --> + <bool name="def_notification_pulse">true</bool> + + <bool name="def_mount_play_notification_snd">true</bool> + <bool name="def_mount_ums_autostart">false</bool> + <bool name="def_mount_ums_prompt">true</bool> + <bool name="def_mount_ums_notify_enabled">true</bool> + <!-- Enable User preference for setting install location --> + <bool name="set_install_location">true</bool> + <!-- Default install location if user preference for setting install location is turned on. --> + <integer name="def_install_location">2</integer> + + <!-- user interface sound effects --> + <integer name="def_power_sounds_enabled">1</integer> + <string name="def_low_battery_sound" translatable="false">/system/media/audio/ui/LowBattery.ogg</string> + <integer name="def_dock_sounds_enabled">0</integer> + <string name="def_desk_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string> + <string name="def_desk_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string> + <string name="def_car_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string> + <string name="def_car_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string> + <integer name="def_lockscreen_sounds_enabled">0</integer> + <string name="def_lock_sound" translatable="false">/system/media/audio/ui/Lock.ogg</string> + <string name="def_unlock_sound" translatable="false">/system/media/audio/ui/Unlock.ogg</string> + + <!-- Default for Settings.System.VIBRATE_IN_SILENT --> + <bool name="def_vibrate_in_silent">true</bool> +</resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml new file mode 100644 index 000000000000..93cf3778bc9c --- /dev/null +++ b/packages/SystemUI/res/values/dimens.xml @@ -0,0 +1,22 @@ +<?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> + <!-- Margin at the edge of the screen to ignore touch events for in the windowshade. --> + <dimen name="status_bar_edge_ignore">5dp</dimen> +</resources> + diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml new file mode 100644 index 000000000000..ba3a3d1d3538 --- /dev/null +++ b/packages/SystemUI/res/values/strings.xml @@ -0,0 +1,54 @@ +<?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: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> + + <!-- 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</string> + + <!-- The label in the bar at the top of the status bar when there are no notifications + showing. --> + <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. --> + <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. --> + <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. --> + <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> + + <!-- 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> + + <!-- 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. --> + <string name="battery_low_why">Battery use</string> + +</resources> diff --git a/core/res/res/drawable/battery_charge_fill.xml b/packages/SystemUI/res/values/styles.xml index 7f6573346af2..10fa9309b5a7 100644 --- a/core/res/res/drawable/battery_charge_fill.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2008 The Android Open Source Project +<!-- 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. @@ -14,9 +14,14 @@ limitations under the License. --> -<level-list xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:maxLevel="29" android:drawable="@android:drawable/battery_charge_fill_empty" /> - <item android:maxLevel="49" android:drawable="@android:drawable/battery_charge_fill_warning" /> - <item android:maxLevel="100" android:drawable="@android:drawable/battery_charge_fill_full" /> -</level-list> +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + <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">?android:attr/textColorPrimary</item> + </style> + + + +</resources> diff --git a/packages/SystemUI/res/xml/bookmarks.xml b/packages/SystemUI/res/xml/bookmarks.xml new file mode 100644 index 000000000000..dfaeeaf6553c --- /dev/null +++ b/packages/SystemUI/res/xml/bookmarks.xml @@ -0,0 +1,56 @@ +<?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. +--> + +<bookmarks> + <bookmark + package="com.android.browser" + class="com.android.browser.BrowserActivity" + shortcut="b" /> + <bookmark + package="com.android.contacts" + class="com.android.contacts.DialtactsContactsEntryActivity" + shortcut="c" /> + <bookmark + package="com.android.email" + class="com.android.email.activity.Welcome" + shortcut="e" /> + <bookmark + package="com.google.android.gm" + class="com.google.android.gm.ConversationListActivityGmail" + shortcut="g" /> + <bookmark + package="com.android.im" + class="com.android.im.app.LandingPage" + shortcut="i" /> + <bookmark + package="com.android.calendar" + class="com.android.calendar.LaunchActivity" + shortcut="l" /> +<!-- + <bookmark + package="com.google.android.apps.maps" + class="com.google.android.maps.MapsActivity" + shortcut="m" /> +--> + <bookmark + package="com.android.music" + class="com.android.music.MusicBrowserActivity" + shortcut="p" /> + <bookmark + package="com.android.mms" + class="com.android.mms.ui.ConversationList" + shortcut="s" /> +</bookmarks> diff --git a/services/java/com/android/server/status/AnimatedImageView.java b/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java index 97df065362cc..70d4d6a8b207 100644 --- a/services/java/com/android/server/status/AnimatedImageView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.content.Context; import android.graphics.drawable.AnimationDrawable; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CarrierLabel.java b/packages/SystemUI/src/com/android/systemui/statusbar/CarrierLabel.java new file mode 100644 index 000000000000..d89d0933697b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CarrierLabel.java @@ -0,0 +1,117 @@ +/* + * 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; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.provider.Telephony; +import android.util.AttributeSet; +import android.util.Slog; +import android.view.View; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.TimeZone; + +import com.android.internal.R; + +/** + * This widget display an analogic clock with two hands for hours and + * minutes. + */ +public class CarrierLabel extends TextView { + private boolean mAttached; + + public CarrierLabel(Context context) { + this(context, null); + } + + public CarrierLabel(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CarrierLabel(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + updateNetworkName(false, null, false, null); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + + if (!mAttached) { + mAttached = true; + IntentFilter filter = new IntentFilter(); + filter.addAction(Telephony.Intents.SPN_STRINGS_UPDATED_ACTION); + getContext().registerReceiver(mIntentReceiver, filter, null, getHandler()); + } + } + + @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 (Telephony.Intents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { + updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false), + intent.getStringExtra(Telephony.Intents.EXTRA_SPN), + intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false), + intent.getStringExtra(Telephony.Intents.EXTRA_PLMN)); + } + } + }; + + void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) { + if (false) { + Slog.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn + + " showPlmn=" + showPlmn + " plmn=" + plmn); + } + StringBuilder str = new StringBuilder(); + boolean something = false; + if (showPlmn && plmn != null) { + str.append(plmn); + something = true; + } + if (showSpn && spn != null) { + if (something) { + str.append(' '); + } + str.append(spn); + something = true; + } + if (something) { + setText(str.toString()); + } else { + setText(com.android.internal.R.string.lockscreen_carrier_default); + } + } + + +} + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/Clock.java new file mode 100644 index 000000000000..9fc8df5579f5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/Clock.java @@ -0,0 +1,208 @@ +/* + * 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; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +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.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.TimeZone; + +import com.android.internal.R; + +/** + * This widget display an analogic clock with two hands for hours and + * minutes. + */ +public class Clock extends TextView { + private boolean mAttached; + private Calendar mCalendar; + private String mClockFormatString; + private SimpleDateFormat mClockFormat; + + private static final int AM_PM_STYLE_NORMAL = 0; + private static final int AM_PM_STYLE_SMALL = 1; + private static final int AM_PM_STYLE_GONE = 2; + + private static final int AM_PM_STYLE = AM_PM_STYLE_GONE; + + public Clock(Context context) { + this(context, null); + } + + public Clock(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public Clock(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @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()); + setText(getSmallTime()); + } + + private final CharSequence getSmallTime() { + Context context = getContext(); + boolean b24 = DateFormat.is24HourFormat(context); + int res; + + if (b24) { + res = R.string.twenty_four_hour_time_format; + } else { + res = R.string.twelve_hour_time_format; + } + + final char MAGIC1 = '\uEF00'; + final char MAGIC2 = '\uEF01'; + + SimpleDateFormat sdf; + String format = context.getString(res); + if (!format.equals(mClockFormatString)) { + /* + * Search for an unquoted "a" in the format string, so we can + * add dummy characters around it to let us find it again after + * formatting and change its size. + */ + if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { + int a = -1; + boolean quoted = false; + for (int i = 0; i < format.length(); i++) { + char c = format.charAt(i); + + if (c == '\'') { + quoted = !quoted; + } + if (!quoted && c == 'a') { + a = i; + break; + } + } + + if (a >= 0) { + // Move a back so any whitespace before AM/PM is also in the alternate size. + final int b = a; + while (a > 0 && Character.isWhitespace(format.charAt(a-1))) { + a--; + } + format = format.substring(0, a) + MAGIC1 + format.substring(a, b) + + "a" + MAGIC2 + format.substring(b + 1); + } + } + + mClockFormat = sdf = new SimpleDateFormat(format); + mClockFormatString = format; + } else { + sdf = mClockFormat; + } + String result = sdf.format(mCalendar.getTime()); + + if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { + int magic1 = result.indexOf(MAGIC1); + int magic2 = result.indexOf(MAGIC2); + if (magic1 >= 0 && magic2 > magic1) { + SpannableStringBuilder formatted = new SpannableStringBuilder(result); + if (AM_PM_STYLE == AM_PM_STYLE_GONE) { + formatted.delete(magic1, magic2+1); + } else { + if (AM_PM_STYLE == AM_PM_STYLE_SMALL) { + CharacterStyle style = new RelativeSizeSpan(0.7f); + formatted.setSpan(style, magic1, magic2, + Spannable.SPAN_EXCLUSIVE_INCLUSIVE); + } + formatted.delete(magic2, magic2 + 1); + formatted.delete(magic1, magic1 + 1); + } + return formatted; + } + } + + return result; + + } +} + diff --git a/services/java/com/android/server/status/CloseDragHandle.java b/packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java index ad1ac4d5ea63..0f6723e06e1b 100644 --- a/services/java/com/android/server/status/CloseDragHandle.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.content.Context; import android.util.AttributeSet; @@ -23,7 +23,7 @@ import android.widget.LinearLayout; public class CloseDragHandle extends LinearLayout { - StatusBarService mService; + PhoneStatusBarService mService; public CloseDragHandle(Context context, AttributeSet attrs) { super(context, attrs); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java new file mode 100644 index 000000000000..f9347b1377ac --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -0,0 +1,201 @@ +/* + * 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.os.Handler; +import android.os.IBinder; +import android.os.Message; + +import com.android.internal.statusbar.IStatusBar; +import com.android.internal.statusbar.StatusBarIcon; +import com.android.internal.statusbar.StatusBarIconList; +import com.android.internal.statusbar.StatusBarNotification; + +/** + * This class takes the functions from IStatusBar that come in on + * binder pool threads and posts messages to get them onto the main + * thread, and calls onto Callbacks. It also takes care of + * 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 { + private static final String TAG = "StatusBar.CommandQueue"; + + private static final int MSG_MASK = 0xffff0000; + private static final int INDEX_MASK = 0x0000ffff; + + private static final int MSG_ICON = 0x00010000; + private static final int OP_SET_ICON = 1; + private static final int OP_REMOVE_ICON = 2; + + private static final int MSG_ADD_NOTIFICATION = 0x00020000; + private static final int MSG_UPDATE_NOTIFICATION = 0x00030000; + private static final int MSG_REMOVE_NOTIFICATION = 0x00040000; + + private static final int MSG_DISABLE = 0x00050000; + + private static final int MSG_SET_VISIBILITY = 0x00060000; + private static final int OP_EXPAND = 1; + private static final int OP_COLLAPSE = 2; + + private StatusBarIconList mList; + private Callbacks mCallbacks; + private Handler mHandler = new H(); + + private class NotificationQueueEntry { + IBinder key; + StatusBarNotification notification; + } + + /** + * These methods are called back on the main thread. + */ + public interface Callbacks { + public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon); + public void updateIcon(String slot, int index, int viewIndex, + StatusBarIcon old, StatusBarIcon icon); + public void removeIcon(String slot, int index, int viewIndex); + public void addNotification(IBinder key, StatusBarNotification notification); + public void updateNotification(IBinder key, StatusBarNotification notification); + public void removeNotification(IBinder key); + public void disable(int state); + public void animateExpand(); + public void animateCollapse(); + } + + public CommandQueue(Callbacks callbacks, StatusBarIconList list) { + mCallbacks = callbacks; + mList = list; + } + + public void setIcon(int index, StatusBarIcon icon) { + synchronized (mList) { + int what = MSG_ICON | index; + mHandler.removeMessages(what); + mHandler.obtainMessage(what, OP_SET_ICON, 0, icon.clone()).sendToTarget(); + } + } + + public void removeIcon(int index) { + synchronized (mList) { + int what = MSG_ICON | index; + mHandler.removeMessages(what); + mHandler.obtainMessage(what, OP_REMOVE_ICON, 0, null).sendToTarget(); + } + } + + public void addNotification(IBinder key, StatusBarNotification notification) { + synchronized (mList) { + NotificationQueueEntry ne = new NotificationQueueEntry(); + ne.key = key; + ne.notification = notification; + mHandler.obtainMessage(MSG_ADD_NOTIFICATION, 0, 0, ne).sendToTarget(); + } + } + + public void updateNotification(IBinder key, StatusBarNotification notification) { + synchronized (mList) { + NotificationQueueEntry ne = new NotificationQueueEntry(); + ne.key = key; + ne.notification = notification; + mHandler.obtainMessage(MSG_UPDATE_NOTIFICATION, 0, 0, ne).sendToTarget(); + } + } + + public void removeNotification(IBinder key) { + synchronized (mList) { + mHandler.obtainMessage(MSG_REMOVE_NOTIFICATION, 0, 0, key).sendToTarget(); + } + } + + public void disable(int state) { + synchronized (mList) { + mHandler.removeMessages(MSG_DISABLE); + mHandler.obtainMessage(MSG_DISABLE, state, 0, null).sendToTarget(); + } + } + + public void animateExpand() { + synchronized (mList) { + mHandler.removeMessages(MSG_SET_VISIBILITY); + mHandler.obtainMessage(MSG_SET_VISIBILITY, OP_EXPAND, 0, null).sendToTarget(); + } + } + + public void animateCollapse() { + synchronized (mList) { + mHandler.removeMessages(MSG_SET_VISIBILITY); + mHandler.obtainMessage(MSG_SET_VISIBILITY, OP_COLLAPSE, 0, null).sendToTarget(); + } + } + + private final class H extends Handler { + public void handleMessage(Message msg) { + final int what = msg.what & MSG_MASK; + switch (what) { + case MSG_ICON: { + final int index = msg.what & INDEX_MASK; + final int viewIndex = mList.getViewIndex(index); + switch (msg.arg1) { + case OP_SET_ICON: { + StatusBarIcon icon = (StatusBarIcon)msg.obj; + StatusBarIcon old = mList.getIcon(index); + if (old == null) { + mList.setIcon(index, icon); + mCallbacks.addIcon(mList.getSlot(index), index, viewIndex, icon); + } else { + mList.setIcon(index, icon); + mCallbacks.updateIcon(mList.getSlot(index), index, viewIndex, + old, icon); + } + break; + } + case OP_REMOVE_ICON: + mList.removeIcon(index); + mCallbacks.removeIcon(mList.getSlot(index), index, viewIndex); + break; + } + break; + } + case MSG_ADD_NOTIFICATION: { + final NotificationQueueEntry ne = (NotificationQueueEntry)msg.obj; + mCallbacks.addNotification(ne.key, ne.notification); + break; + } + case MSG_UPDATE_NOTIFICATION: { + final NotificationQueueEntry ne = (NotificationQueueEntry)msg.obj; + mCallbacks.updateNotification(ne.key, ne.notification); + break; + } + case MSG_REMOVE_NOTIFICATION: { + mCallbacks.removeNotification((IBinder)msg.obj); + break; + } + case MSG_DISABLE: + mCallbacks.disable(msg.arg1); + break; + case MSG_SET_VISIBILITY: + if (msg.arg1 == OP_EXPAND) { + mCallbacks.animateExpand(); + } else { + mCallbacks.animateCollapse(); + } + } + } + } +} + diff --git a/services/java/com/android/server/status/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/DateView.java index c04fb45b1ffb..e6d3a7e635b8 100644 --- a/services/java/com/android/server/status/DateView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DateView.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.content.BroadcastReceiver; import android.content.Context; diff --git a/services/java/com/android/server/status/ExpandedView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java index cb37f907f134..c5b901f74b4e 100644 --- a/services/java/com/android/server/status/ExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.content.Context; import android.util.AttributeSet; @@ -27,7 +27,7 @@ import android.util.Slog; public class ExpandedView extends LinearLayout { - StatusBarService mService; + PhoneStatusBarService mService; int mPrevHeight = -1; public ExpandedView(Context context, AttributeSet attrs) { @@ -50,9 +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 + " new=" + height); + //Slog.d(PhoneStatusBarService.TAG, "height changed old=" + mPrevHeight + // + " new=" + height); mPrevHeight = height; - mService.updateExpandedViewPos(StatusBarService.EXPANDED_LEAVE_ALONE); + mService.updateExpandedViewPos(PhoneStatusBarService.EXPANDED_LEAVE_ALONE); } } } diff --git a/services/java/com/android/server/status/FixedSizeDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/FixedSizeDrawable.java index dbfcb2cf5649..eb22b6120664 100644 --- a/services/java/com/android/server/status/FixedSizeDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/FixedSizeDrawable.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.graphics.drawable.Drawable; import android.graphics.Canvas; diff --git a/services/java/com/android/server/status/IconMerger.java b/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java index aa702ae2d0d1..027bed4acdfe 100644 --- a/services/java/com/android/server/status/IconMerger.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java @@ -14,23 +14,39 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.content.Context; import android.os.Handler; import android.util.AttributeSet; +import android.util.Slog; import android.view.View; import android.widget.LinearLayout; +import com.android.systemui.R; + public class IconMerger extends LinearLayout { - StatusBarService service; - StatusBarIcon moreIcon; + private static final String TAG = "IconMerger"; + + private StatusBarIconView mMoreView; public IconMerger(Context context, AttributeSet attrs) { super(context, attrs); } + public void addMoreView(StatusBarIconView v, LinearLayout.LayoutParams lp) { + super.addView(v, lp); + mMoreView = v; + } + + public void addView(StatusBarIconView v, int index, LinearLayout.LayoutParams lp) { + if (index == 0) { + throw new RuntimeException("Attempt to put view before the more view: " + v); + } + super.addView(v, index, lp); + } + @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); @@ -50,13 +66,12 @@ public class IconMerger extends LinearLayout { } // find the first visible one that isn't the more icon - View moreView = null; + final StatusBarIconView moreView = mMoreView; int fitLeft = -1; int startIndex = -1; for (i=0; i<N; i++) { final View child = getChildAt(i); - if (com.android.internal.R.drawable.stat_notify_more == child.getId()) { - moreView = child; + if (child == moreView) { startIndex = i+1; } else if (child.getVisibility() != GONE) { @@ -66,7 +81,11 @@ public class IconMerger extends LinearLayout { } if (moreView == null || startIndex < 0) { - throw new RuntimeException("Status Bar / IconMerger moreView == null"); + return; + /* + throw new RuntimeException("Status Bar / IconMerger moreView == " + moreView + + " startIndex=" + startIndex); + */ } // if it fits without the more icon, then hide the more icon and update fitLeft @@ -84,14 +103,14 @@ public class IconMerger extends LinearLayout { int breakingPoint = fitLeft + extra + adjust; int number = 0; for (i=startIndex; i<N; i++) { - final View child = getChildAt(i); + final StatusBarIconView child = (StatusBarIconView)getChildAt(i); if (child.getVisibility() != GONE) { int childLeft = child.getLeft(); int childRight = child.getRight(); if (childLeft < breakingPoint) { // hide this one child.layout(0, child.getTop(), 0, child.getBottom()); - int n = this.service.getIconNumberForView(child); + int n = child.getStatusBarIcon().number; if (n == 0) { number += 1; } else if (n > 0) { @@ -115,7 +134,7 @@ public class IconMerger extends LinearLayout { // and provide the value later. We're the only one changing this value show it // should be ordered correctly. if (false) { - this.moreIcon.update(number); + // TODO this.moreIcon.update(number); } else { mBugWorkaroundNumber = number; mBugWorkaroundHandler.post(mBugWorkaroundRunnable); @@ -126,8 +145,10 @@ public class IconMerger extends LinearLayout { private Handler mBugWorkaroundHandler = new Handler(); private Runnable mBugWorkaroundRunnable = new Runnable() { public void run() { + /* TODO IconMerger.this.moreIcon.update(mBugWorkaroundNumber); IconMerger.this.moreIcon.view.invalidate(); + */ } }; } diff --git a/services/java/com/android/server/status/StatusBarException.java b/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java index be58f592a349..1e89624d89f8 100644 --- a/services/java/com/android/server/status/StatusBarException.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java @@ -14,10 +14,21 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; -public class StatusBarException extends RuntimeException { - StatusBarException(String msg) { - super(msg); +import android.content.Context; +import android.util.AttributeSet; +import android.util.Slog; +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); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java new file mode 100644 index 000000000000..7a8226724d9a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -0,0 +1,126 @@ +/* + * 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; + +import android.app.Notification; +import android.os.IBinder; +import android.view.View; + +import com.android.internal.statusbar.StatusBarNotification; + +import java.util.ArrayList; + +/** + * The list of currently displaying notifications. + */ +public class NotificationData { + public static final class Entry { + public IBinder key; + public StatusBarNotification notification; + public StatusBarIconView icon; + public View row; // the outer expanded view + public View content; // takes the click events and sends the PendingIntent + public View expanded; // the inflated RemoteViews + } + private final ArrayList<Entry> mEntries = new ArrayList<Entry>(); + + public int size() { + return mEntries.size(); + } + + public Entry getEntryAt(int index) { + return mEntries.get(index); + } + + 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; + } + } + return -1; + } + + public int add(IBinder key, StatusBarNotification notification, View row, View content, + View expanded, StatusBarIconView icon) { + Entry entry = new Entry(); + entry.key = key; + entry.notification = notification; + entry.row = row; + entry.content = content; + entry.expanded = expanded; + entry.icon = icon; + final int index = chooseIndex(notification.notification.when); + mEntries.add(index, entry); + return index; + } + + 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; + } + } + return N; + } + + /** + * 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 + return true; + } + } + return false; + } + + /** + * 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) { + return true; + } + } + } + return false; + } +} diff --git a/services/java/com/android/server/status/NotificationLinearLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLinearLayout.java index 2fdf956fb901..81053528bf41 100644 --- a/services/java/com/android/server/status/NotificationLinearLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLinearLayout.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.content.Context; import android.util.AttributeSet; diff --git a/services/java/com/android/server/status/StatusBarService.java b/packages/SystemUI/src/com/android/systemui/statusbar/PhoneStatusBarService.java index 93c8d34312a4..e9ae69a98178 100644 --- a/services/java/com/android/server/status/StatusBarService.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PhoneStatusBarService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007 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,15 +14,18 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; -import com.android.internal.R; -import com.android.internal.util.CharSequences; +import com.android.internal.statusbar.IStatusBar; +import com.android.internal.statusbar.IStatusBarService; +import com.android.internal.statusbar.StatusBarIcon; +import com.android.internal.statusbar.StatusBarNotification; import android.app.ActivityManagerNative; import android.app.Dialog; -import android.app.IStatusBar; +import android.app.Notification; import android.app.PendingIntent; +import android.app.Service; import android.app.StatusBarManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -40,7 +43,6 @@ import android.os.Binder; import android.os.Handler; import android.os.Message; import android.os.SystemClock; -import android.provider.Telephony; import android.util.Slog; import android.view.Display; import android.view.Gravity; @@ -67,61 +69,22 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Set; +import com.android.systemui.R; +import com.android.systemui.statusbar.policy.StatusBarPolicy; -/** - * The public (ok, semi-public) service for the status bar. - * <p> - * This interesting thing to note about this class is that most of the methods that - * are called from other classes just post a message, and everything else is batched - * and coalesced into a series of calls to methods that all start with "perform." - * There are two reasons for this. The first is that some of the methods (activate/deactivate) - * are on IStatusBar, so they're called from the thread pool and they need to make their - * way onto the UI thread. The second is that the message queue is stopped while animations - * are happening in order to make for smoother transitions. - * <p> - * Each icon is either an icon or an icon and a notification. They're treated mostly - * separately throughout the code, although they both use the same key, which is assigned - * when they are created. - */ -public class StatusBarService extends IStatusBar.Stub -{ - static final String TAG = "StatusBar"; +public class PhoneStatusBarService extends StatusBarService { + static final String TAG = "PhoneStatusBarService"; static final boolean SPEW = false; + public static final String ACTION_STATUSBAR_START + = "com.android.internal.policy.statusbar.START"; + static final int EXPANDED_LEAVE_ALONE = -10000; static final int EXPANDED_FULL_OPEN = -10001; private static final int MSG_ANIMATE = 1000; private static final int MSG_ANIMATE_REVEAL = 1001; - private static final int OP_ADD_ICON = 1; - private static final int OP_UPDATE_ICON = 2; - private static final int OP_REMOVE_ICON = 3; - private static final int OP_SET_VISIBLE = 4; - private static final int OP_EXPAND = 5; - private static final int OP_TOGGLE = 6; - private static final int OP_DISABLE = 7; - private class PendingOp { - IBinder key; - int code; - IconData iconData; - NotificationData notificationData; - boolean visible; - int integer; - } - - private class DisableRecord implements IBinder.DeathRecipient { - String pkg; - int what; - IBinder token; - - public void binderDied() { - Slog.i(TAG, "binder died for pkg=" + pkg); - disable(0, token, pkg); - token.unlinkToDeath(this, 0); - } - } - public interface NotificationCallbacks { void onSetDisabled(int status); void onClearAll(); @@ -140,56 +103,52 @@ public class StatusBarService extends IStatusBar.Stub switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: if (!down) { - StatusBarService.this.deactivate(); + animateCollapse(); } return true; } return super.dispatchKeyEvent(event); } } + + StatusBarPolicy mIconPolicy; - final Context mContext; - final Display mDisplay; + int mHeight; + int mIconWidth; + + Display mDisplay; StatusBarView mStatusBarView; int mPixelFormat; H mHandler = new H(); Object mQueueLock = new Object(); - ArrayList<PendingOp> mQueue = new ArrayList<PendingOp>(); - NotificationCallbacks mNotificationCallbacks; - // All accesses to mIconMap and mNotificationData are syncronized on those objects, - // but this is only so dump() can work correctly. Modifying these outside of the UI - // thread will not work, there are places in the code that unlock and reaquire between - // reads and require them to not be modified. - // icons - HashMap<IBinder,StatusBarIcon> mIconMap = new HashMap<IBinder,StatusBarIcon>(); - ArrayList<StatusBarIcon> mIconList = new ArrayList<StatusBarIcon>(); String[] mRightIconSlots; - StatusBarIcon[] mRightIcons; LinearLayout mIcons; IconMerger mNotificationIcons; LinearLayout mStatusIcons; - StatusBarIcon mMoreIcon; - private UninstallReceiver mUninstallReceiver; // expanded notifications - NotificationViewList mNotificationData = new NotificationViewList(); Dialog mExpandedDialog; ExpandedView mExpandedView; WindowManager.LayoutParams mExpandedParams; ScrollView mScrollView; View mNotificationLinearLayout; + View mExpandedContents; + // top bar + TextView mNoNotificationsTitle; + TextView mClearButton; + // drag bar + CloseDragHandle mCloseView; + // ongoing + NotificationData mOngoing = new NotificationData(); TextView mOngoingTitle; LinearLayout mOngoingItems; + // latest + NotificationData mLatest = new NotificationData(); TextView mLatestTitle; LinearLayout mLatestItems; - TextView mNoNotificationsTitle; - TextView mSpnLabel; - TextView mPlmnLabel; - TextView mClearButton; - View mExpandedContents; - CloseDragHandle mCloseView; + // position int[] mPositionTmp = new int[2]; boolean mExpanded; boolean mExpandedVisible; @@ -226,22 +185,22 @@ public class StatusBarService extends IStatusBar.Stub int[] mAbsPos = new int[2]; // for disabling the status bar - ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>(); int mDisabled = 0; /** * Construct the service, add the status bar view to the window manager */ - public StatusBarService(Context context) { - mContext = context; - mDisplay = ((WindowManager)context.getSystemService( - Context.WINDOW_SERVICE)).getDefaultDisplay(); - makeStatusBarView(context); - mUninstallReceiver = new UninstallReceiver(); - } + @Override + public void onCreate() { + // First set up our views and stuff. + mDisplay = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + makeStatusBarView(this); - public void setNotificationCallbacks(NotificationCallbacks listener) { - mNotificationCallbacks = listener; + // Next, call super.onCreate(), which will populate our views. + super.onCreate(); + + // Lastly, call to the icon policy to install/update all the icons. + mIconPolicy = new StatusBarPolicy(this); } // ================================================================================ @@ -249,14 +208,15 @@ public class StatusBarService extends IStatusBar.Stub // ================================================================================ private void makeStatusBarView(Context context) { Resources res = context.getResources(); - mRightIconSlots = res.getStringArray(com.android.internal.R.array.status_bar_icon_order); - mRightIcons = new StatusBarIcon[mRightIconSlots.length]; + mRightIconSlots = res.getStringArray(R.array.status_bar_icon_order); + + mHeight = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height); + mIconWidth = mHeight; ExpandedView expanded = (ExpandedView)View.inflate(context, - com.android.internal.R.layout.status_bar_expanded, null); + R.layout.status_bar_expanded, null); expanded.mService = this; - StatusBarView sb = (StatusBarView)View.inflate(context, - com.android.internal.R.layout.status_bar, null); + StatusBarView sb = (StatusBarView)View.inflate(context, R.layout.status_bar, null); sb.mService = this; // figure out which pixel-format to use for the status bar. @@ -269,7 +229,6 @@ public class StatusBarService extends IStatusBar.Stub mStatusBarView = sb; mStatusIcons = (LinearLayout)sb.findViewById(R.id.statusIcons); mNotificationIcons = (IconMerger)sb.findViewById(R.id.notificationIcons); - mNotificationIcons.service = this; mIcons = (LinearLayout)sb.findViewById(R.id.icons); mTickerView = sb.findViewById(R.id.ticker); mDateView = (DateView)sb.findViewById(R.id.date); @@ -284,8 +243,6 @@ public class StatusBarService extends IStatusBar.Stub mNoNotificationsTitle = (TextView)expanded.findViewById(R.id.noNotificationsTitle); mClearButton = (TextView)expanded.findViewById(R.id.clear_all_button); mClearButton.setOnClickListener(mClearButtonListener); - mSpnLabel = (TextView)expanded.findViewById(R.id.spnLabel); - mPlmnLabel = (TextView)expanded.findViewById(R.id.plmnLabel); mScrollView = (ScrollView)expanded.findViewById(R.id.scroll); mNotificationLinearLayout = expanded.findViewById(R.id.notificationLinearLayout); @@ -297,547 +254,180 @@ public class StatusBarService extends IStatusBar.Stub TickerView tickerView = (TickerView)sb.findViewById(R.id.tickerText); tickerView.mTicker = mTicker; - mTrackingView = (TrackingView)View.inflate(context, - com.android.internal.R.layout.status_bar_tracking, null); + mTrackingView = (TrackingView)View.inflate(context, R.layout.status_bar_tracking, null); mTrackingView.mService = this; mCloseView = (CloseDragHandle)mTrackingView.findViewById(R.id.close); mCloseView.mService = this; mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore); - // add the more icon for the notifications - IconData moreData = IconData.makeIcon(null, context.getPackageName(), - R.drawable.stat_notify_more, 0, 42); - mMoreIcon = new StatusBarIcon(context, moreData, mNotificationIcons); - mMoreIcon.view.setId(R.drawable.stat_notify_more); - mNotificationIcons.moreIcon = mMoreIcon; - mNotificationIcons.addView(mMoreIcon.view); + // the more notifications icon + StatusBarIconView moreView = new StatusBarIconView(this, "more"); + moreView.set(new StatusBarIcon(null, R.drawable.stat_notify_more, 0)); + mNotificationIcons.addMoreView(moreView, + new LinearLayout.LayoutParams(mIconWidth, mHeight)); // set the inital view visibility setAreThereNotifications(); mDateView.setVisibility(View.INVISIBLE); - // before we register for broadcasts - mPlmnLabel.setText(R.string.lockscreen_carrier_default); - mPlmnLabel.setVisibility(View.VISIBLE); - mSpnLabel.setText(""); - mSpnLabel.setVisibility(View.GONE); - // receive broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); filter.addAction(Intent.ACTION_SCREEN_OFF); - filter.addAction(Telephony.Intents.SPN_STRINGS_UPDATED_ACTION); context.registerReceiver(mBroadcastReceiver, filter); } - public void systemReady() { + @Override + protected void addStatusBarView() { final StatusBarView view = mStatusBarView; WindowManager.LayoutParams lp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - view.getContext().getResources().getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height), + mHeight, WindowManager.LayoutParams.TYPE_STATUS_BAR, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| - WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, - mPixelFormat); + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, + PixelFormat.RGBX_8888); lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; lp.setTitle("StatusBar"); - lp.windowAnimations = R.style.Animation_StatusBar; + // TODO lp.windowAnimations = R.style.Animation_StatusBar; WindowManagerImpl.getDefault().addView(view, lp); } - - // ================================================================================ - // From IStatusBar - // ================================================================================ - public void activate() { - enforceExpandStatusBar(); - addPendingOp(OP_EXPAND, null, true); - } - public void deactivate() { - enforceExpandStatusBar(); - addPendingOp(OP_EXPAND, null, false); + public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) { + Slog.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex + + " icon=" + icon); + StatusBarIconView view = new StatusBarIconView(this, slot); + view.set(icon); + mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconWidth, mHeight)); } - public void toggle() { - enforceExpandStatusBar(); - addPendingOp(OP_TOGGLE, null, false); + public void updateIcon(String slot, int index, int viewIndex, + StatusBarIcon old, StatusBarIcon icon) { + 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 disable(int what, IBinder token, String pkg) { - enforceStatusBar(); - synchronized (mNotificationCallbacks) { - // This is a little gross, but I think it's safe as long as nobody else - // synchronizes on mNotificationCallbacks. It's important that the the callback - // and the pending op get done in the correct order and not interleaved with - // other calls, otherwise they'll get out of sync. - int net; - synchronized (mDisableRecords) { - manageDisableListLocked(what, token, pkg); - net = gatherDisableActionsLocked(); - mNotificationCallbacks.onSetDisabled(net); - } - addPendingOp(OP_DISABLE, net); - } + public void removeIcon(String slot, int index, int viewIndex) { + Slog.d(TAG, "removeIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex); + mStatusIcons.removeViewAt(viewIndex); } - public IBinder addIcon(String slot, String iconPackage, int iconId, int iconLevel) { - enforceStatusBar(); - return addIcon(IconData.makeIcon(slot, iconPackage, iconId, iconLevel, 0), null); - } + public void addNotification(IBinder key, StatusBarNotification notification) { + addNotificationViews(key, notification); - public void updateIcon(IBinder key, - String slot, String iconPackage, int iconId, int iconLevel) { - enforceStatusBar(); - updateIcon(key, IconData.makeIcon(slot, iconPackage, iconId, iconLevel, 0), null); - } + // show the ticker + tick(notification); - public void removeIcon(IBinder key) { - enforceStatusBar(); - addPendingOp(OP_REMOVE_ICON, key, null, null, -1); - } - - private void enforceStatusBar() { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.STATUS_BAR, - "StatusBarService"); + // Recalculate the position of the sliding windows and the titles. + setAreThereNotifications(); + updateExpandedViewPos(EXPANDED_LEAVE_ALONE); } - private void enforceExpandStatusBar() { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.EXPAND_STATUS_BAR, - "StatusBarService"); - } + public void updateNotification(IBinder key, StatusBarNotification notification) { + Slog.d(TAG, "updateNotification key=" + key + " notification=" + notification); - // ================================================================================ - // Can be called from any thread - // ================================================================================ - public IBinder addIcon(IconData data, NotificationData n) { - int slot; - // assert early-on if they using a slot that doesn't exist. - if (data != null && n == null) { - slot = getRightIconIndex(data.slot); - if (slot < 0) { - throw new SecurityException("invalid status bar icon slot: " - + (data.slot != null ? "'" + data.slot + "'" : "null")); - } + NotificationData oldList; + int oldIndex = mOngoing.findEntry(key); + if (oldIndex >= 0) { + oldList = mOngoing; } else { - slot = -1; - } - IBinder key = new Binder(); - addPendingOp(OP_ADD_ICON, key, data, n, -1); - return key; - } - - public void updateIcon(IBinder key, IconData data, NotificationData n) { - addPendingOp(OP_UPDATE_ICON, key, data, n, -1); - } - - public void setIconVisibility(IBinder key, boolean visible) { - addPendingOp(OP_SET_VISIBLE, key, visible); - } - - private void addPendingOp(int code, IBinder key, IconData data, NotificationData n, int i) { - synchronized (mQueueLock) { - PendingOp op = new PendingOp(); - op.key = key; - op.code = code; - op.iconData = data == null ? null : data.clone(); - op.notificationData = n; - op.integer = i; - mQueue.add(op); - if (mQueue.size() == 1) { - mHandler.sendEmptyMessage(2); - } - } - } - - private void addPendingOp(int code, IBinder key, boolean visible) { - synchronized (mQueueLock) { - PendingOp op = new PendingOp(); - op.key = key; - op.code = code; - op.visible = visible; - mQueue.add(op); - if (mQueue.size() == 1) { - mHandler.sendEmptyMessage(1); - } - } - } - - private void addPendingOp(int code, int integer) { - synchronized (mQueueLock) { - PendingOp op = new PendingOp(); - op.code = code; - op.integer = integer; - mQueue.add(op); - if (mQueue.size() == 1) { - mHandler.sendEmptyMessage(1); + oldIndex = mLatest.findEntry(key); + if (oldIndex < 0) { + Slog.w(TAG, "updateNotification for unknown key: " + key); + return; } - } - } - - // lock on mDisableRecords - void manageDisableListLocked(int what, IBinder token, String pkg) { - if (SPEW) { - Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what) - + " pkg=" + pkg); - } - // update the list - synchronized (mDisableRecords) { - final int N = mDisableRecords.size(); - DisableRecord tok = null; - int i; - for (i=0; i<N; i++) { - DisableRecord t = mDisableRecords.get(i); - if (t.token == token) { - tok = t; - break; + oldList = mLatest; + } + final NotificationData.Entry oldEntry = oldList.getEntryAt(oldIndex); + final StatusBarNotification oldNotification = oldEntry.notification; + final RemoteViews oldContentView = oldNotification.notification.contentView; + + final RemoteViews contentView = notification.notification.contentView; + + // Can we just reapply the RemoteViews in place? If when didn't change, the order + // didn't change. + if (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()) { + Slog.d(TAG, "reusing notification"); + oldEntry.notification = notification; + try { + // Reapply the RemoteViews + contentView.reapply(this, 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)); } } - if (what == 0 || !token.isBinderAlive()) { - if (tok != null) { - mDisableRecords.remove(i); - tok.token.unlinkToDeath(tok, 0); - } - } else { - if (tok == null) { - tok = new DisableRecord(); - try { - token.linkToDeath(tok, 0); - } - catch (RemoteException ex) { - return; // give up - } - mDisableRecords.add(tok); - } - tok.what = what; - tok.token = token; - tok.pkg = pkg; + 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); } + // Update the icon. + oldEntry.icon.set(new StatusBarIcon(notification.pkg, notification.notification.icon, + notification.notification.iconLevel, notification.notification.number)); + } else { + Slog.d(TAG, "not reusing notification"); + removeNotificationViews(key); + addNotificationViews(key, notification); } - } - // lock on mDisableRecords - int gatherDisableActionsLocked() { - final int N = mDisableRecords.size(); - // gather the new net flags - int net = 0; - for (int i=0; i<N; i++) { - net |= mDisableRecords.get(i).what; - } - return net; - } + // Restart the ticker if it's still running + tick(notification); - private int getRightIconIndex(String slot) { - final int N = mRightIconSlots.length; - for (int i=0; i<N; i++) { - if (mRightIconSlots[i].equals(slot)) { - return i; - } - } - return -1; + // Recalculate the position of the sliding windows and the titles. + setAreThereNotifications(); + updateExpandedViewPos(EXPANDED_LEAVE_ALONE); } - // ================================================================================ - // Always called from UI thread - // ================================================================================ - /** - * All changes to the status bar and notifications funnel through here and are batched. - */ - private class H extends Handler { - public void handleMessage(Message m) { - if (m.what == MSG_ANIMATE) { - doAnimation(); - return; - } - if (m.what == MSG_ANIMATE_REVEAL) { - doRevealAnimation(); - return; - } - - ArrayList<PendingOp> queue; - synchronized (mQueueLock) { - queue = mQueue; - mQueue = new ArrayList<PendingOp>(); - } - - boolean wasExpanded = mExpanded; - - // for each one in the queue, find all of the ones with the same key - // and collapse that down into a final op and/or call to setVisibility, etc - boolean expand = wasExpanded; - boolean doExpand = false; - boolean doDisable = false; - int disableWhat = 0; - int N = queue.size(); - while (N > 0) { - PendingOp op = queue.get(0); - boolean doOp = false; - boolean visible = false; - boolean doVisibility = false; - if (op.code == OP_SET_VISIBLE) { - doVisibility = true; - visible = op.visible; - } - else if (op.code == OP_EXPAND) { - doExpand = true; - expand = op.visible; - } - else if (op.code == OP_TOGGLE) { - doExpand = true; - expand = !expand; - } - else { - doOp = true; - } - - if (alwaysHandle(op.code)) { - // coalesce these - for (int i=1; i<N; i++) { - PendingOp o = queue.get(i); - if (!alwaysHandle(o.code) && o.key == op.key) { - if (o.code == OP_SET_VISIBLE) { - visible = o.visible; - doVisibility = true; - } - else if (o.code == OP_EXPAND) { - expand = o.visible; - doExpand = true; - } - else { - op.code = o.code; - op.iconData = o.iconData; - op.notificationData = o.notificationData; - } - queue.remove(i); - i--; - N--; - } - } - } + public void removeNotification(IBinder key) { + Slog.d(TAG, "removeNotification key=" + key); + StatusBarNotification old = removeNotificationViews(key); - queue.remove(0); - N--; - - if (doOp) { - switch (op.code) { - case OP_ADD_ICON: - case OP_UPDATE_ICON: - performAddUpdateIcon(op.key, op.iconData, op.notificationData); - break; - case OP_REMOVE_ICON: - performRemoveIcon(op.key); - break; - case OP_DISABLE: - doDisable = true; - disableWhat = op.integer; - break; - } - } - if (doVisibility && op.code != OP_REMOVE_ICON) { - performSetIconVisibility(op.key, visible); - } - } + if (old != null) { + // Cancel the ticker if it's still running + mTicker.removeEntry(old); - if (queue.size() != 0) { - throw new RuntimeException("Assertion failed: queue.size=" + queue.size()); - } - if (doExpand) { - // this is last so that we capture all of the pending changes before doing it - if (expand) { - animateExpand(); - } else { - animateCollapse(); - } - } - if (doDisable) { - performDisableActions(disableWhat); - } - } - } - - private boolean alwaysHandle(int code) { - return code == OP_DISABLE; - } - - /* private */ void performAddUpdateIcon(IBinder key, IconData data, NotificationData n) - throws StatusBarException { - if (SPEW) { - Slog.d(TAG, "performAddUpdateIcon icon=" + data + " notification=" + n + " key=" + key); - } - // notification - if (n != null) { - StatusBarNotification notification = getNotification(key); - NotificationData oldData = null; - if (notification == null) { - // add - notification = new StatusBarNotification(); - notification.key = key; - notification.data = n; - synchronized (mNotificationData) { - mNotificationData.add(notification); - } - addNotificationView(notification); - setAreThereNotifications(); - } else { - // update - oldData = notification.data; - notification.data = n; - updateNotificationView(notification, oldData); - } - // Show the ticker if one is requested, and the text is different - // than the currently displayed ticker. 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 (n.tickerText != null && mStatusBarView.getWindowToken() != null - && (oldData == null - || oldData.tickerText == null - || !CharSequences.equals(oldData.tickerText, n.tickerText))) { - if (0 == (mDisabled & - (StatusBarManager.DISABLE_NOTIFICATION_ICONS | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) { - mTicker.addEntry(n, StatusBarIcon.getIcon(mContext, data), n.tickerText); - } - } + // Recalculate the position of the sliding windows and the titles. + setAreThereNotifications(); updateExpandedViewPos(EXPANDED_LEAVE_ALONE); } - - // icon - synchronized (mIconMap) { - StatusBarIcon icon = mIconMap.get(key); - if (icon == null) { - // add - LinearLayout v = n == null ? mStatusIcons : mNotificationIcons; - - icon = new StatusBarIcon(mContext, data, v); - mIconMap.put(key, icon); - mIconList.add(icon); - - if (n == null) { - int slotIndex = getRightIconIndex(data.slot); - StatusBarIcon[] rightIcons = mRightIcons; - if (rightIcons[slotIndex] == null) { - int pos = 0; - for (int i=mRightIcons.length-1; i>slotIndex; i--) { - StatusBarIcon ic = rightIcons[i]; - if (ic != null) { - pos++; - } - } - rightIcons[slotIndex] = icon; - mStatusIcons.addView(icon.view, pos); - } else { - Slog.e(TAG, "duplicate icon in slot " + slotIndex + "/" + data.slot); - mIconMap.remove(key); - mIconList.remove(icon); - return ; - } - } else { - int iconIndex = mNotificationData.getIconIndex(n); - mNotificationIcons.addView(icon.view, iconIndex); - } - } else { - if (n == null) { - // right hand side icons -- these don't reorder - icon.update(mContext, data); - } else { - // remove old - ViewGroup parent = (ViewGroup)icon.view.getParent(); - parent.removeView(icon.view); - // add new - icon.update(mContext, data); - int iconIndex = mNotificationData.getIconIndex(n); - mNotificationIcons.addView(icon.view, iconIndex); - } - } - } - } - - /* private */ void performSetIconVisibility(IBinder key, boolean visible) { - synchronized (mIconMap) { - if (SPEW) { - Slog.d(TAG, "performSetIconVisibility key=" + key + " visible=" + visible); - } - StatusBarIcon icon = mIconMap.get(key); - icon.view.setVisibility(visible ? View.VISIBLE : View.GONE); - } - } - - /* private */ void performRemoveIcon(IBinder key) { - synchronized (this) { - if (SPEW) { - Slog.d(TAG, "performRemoveIcon key=" + key); - } - StatusBarIcon icon = mIconMap.remove(key); - mIconList.remove(icon); - if (icon != null) { - ViewGroup parent = (ViewGroup)icon.view.getParent(); - parent.removeView(icon.view); - int slotIndex = getRightIconIndex(icon.mData.slot); - if (slotIndex >= 0) { - mRightIcons[slotIndex] = null; - } - } - StatusBarNotification notification = getNotification(key); - if (notification != null) { - removeNotificationView(notification); - synchronized (mNotificationData) { - mNotificationData.remove(notification); - } - setAreThereNotifications(); - } - } - } - - int getIconNumberForView(View v) { - synchronized (mIconMap) { - StatusBarIcon icon = null; - final int N = mIconList.size(); - for (int i=0; i<N; i++) { - StatusBarIcon ic = mIconList.get(i); - if (ic.view == v) { - icon = ic; - break; - } - } - if (icon != null) { - return icon.getNumber(); - } else { - return -1; - } - } } - - StatusBarNotification getNotification(IBinder key) { - synchronized (mNotificationData) { - return mNotificationData.get(key); + private int chooseIconIndex(boolean isOngoing, int viewIndex) { + final int latestSize = mLatest.size(); + if (isOngoing) { + return latestSize + (mOngoing.size() - viewIndex); + } else { + return latestSize - viewIndex; } } - View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() { - public void onFocusChange(View v, boolean hasFocus) { - // Because 'v' is a ViewGroup, all its children will be (un)selected - // too, which allows marqueeing to work. - v.setSelected(hasFocus); - } - }; - - View makeNotificationView(StatusBarNotification notification, ViewGroup parent) { - NotificationData n = notification.data; + View[] makeNotificationView(StatusBarNotification notification, ViewGroup parent) { + Notification n = notification.notification; RemoteViews remoteViews = n.contentView; if (remoteViews == null) { return null; } // create the row view - LayoutInflater inflater = (LayoutInflater)mContext.getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - View row = inflater.inflate(com.android.internal.R.layout.status_bar_latest_event, parent, false); + LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View row = inflater.inflate(com.android.internal.R.layout.status_bar_latest_event, + parent, false); // bind the click event to the content area ViewGroup content = (ViewGroup)row.findViewById(com.android.internal.R.id.content); @@ -845,116 +435,157 @@ public class StatusBarService extends IStatusBar.Stub content.setOnFocusChangeListener(mFocusChangeListener); PendingIntent contentIntent = n.contentIntent; if (contentIntent != null) { - content.setOnClickListener(new Launcher(contentIntent, n.pkg, n.tag, n.id)); + content.setOnClickListener(new Launcher(contentIntent, notification.pkg, + notification.tag, notification.id)); } - View child = null; + View expanded = null; Exception exception = null; try { - child = remoteViews.apply(mContext, content); + expanded = remoteViews.apply(this, content); } catch (RuntimeException e) { exception = e; } - if (child == null) { - Slog.e(TAG, "couldn't inflate view for package " + n.pkg, exception); - return null; + if (expanded == null) { + Slog.e(TAG, "couldn't inflate view for package " + notification.pkg, exception); + row.setVisibility(View.GONE); + } else { + content.addView(expanded); + row.setDrawingCacheEnabled(true); } - content.addView(child); - - row.setDrawingCacheEnabled(true); - notification.view = row; - notification.contentView = child; + return new View[] { row, content, expanded }; + } - return row; + void addNotificationViews(IBinder key, StatusBarNotification notification) { + NotificationData list; + ViewGroup parent; + final boolean isOngoing = notification.isOngoing(); + if (isOngoing) { + list = mOngoing; + parent = mOngoingItems; + } else { + list = mLatest; + parent = mLatestItems; + } + // Construct the expanded view. + final View[] views = makeNotificationView(notification, parent); + final View row = views[0]; + final View content = views[1]; + final View expanded = views[2]; + // Construct the icon. + StatusBarIconView iconView = new StatusBarIconView(this, + notification.pkg + "/0x" + Integer.toHexString(notification.id)); + iconView.set(new StatusBarIcon(notification.pkg, notification.notification.icon, + notification.notification.iconLevel, notification.notification.number)); + // Add the expanded view. + final int viewIndex = list.add(key, notification, row, content, expanded, iconView); + parent.addView(row, viewIndex); + // Add the icon. + final int iconIndex = chooseIconIndex(isOngoing, viewIndex); + mNotificationIcons.addView(iconView, iconIndex, + new LinearLayout.LayoutParams(mIconWidth, mHeight)); + } + + StatusBarNotification removeNotificationViews(IBinder key) { + NotificationData.Entry entry = mOngoing.remove(key); + if (entry == null) { + entry = mLatest.remove(key); + if (entry == null) { + Slog.w(TAG, "removeNotification for unknown key: " + key); + return null; + } + } + // Remove the expanded view. + ((ViewGroup)entry.row.getParent()).removeView(entry.row); + // Remove the icon. + ((ViewGroup)entry.icon.getParent()).removeView(entry.icon); + + return entry.notification; } - void addNotificationView(StatusBarNotification notification) { - if (notification.view != null) { - throw new RuntimeException("Assertion failed: notification.view=" - + notification.view); + private void setAreThereNotifications() { + boolean ongoing = mOngoing.hasVisibleItems(); + boolean latest = mLatest.hasVisibleItems(); + + // (no ongoing notifications are clearable) + if (mLatest.hasClearableItems()) { + mClearButton.setVisibility(View.VISIBLE); + } else { + mClearButton.setVisibility(View.INVISIBLE); } - LinearLayout parent = notification.data.ongoingEvent ? mOngoingItems : mLatestItems; + mOngoingTitle.setVisibility(ongoing ? View.VISIBLE : View.GONE); + mLatestTitle.setVisibility(latest ? View.VISIBLE : View.GONE); - View child = makeNotificationView(notification, parent); - if (child == null) { - return ; + if (ongoing || latest) { + mNoNotificationsTitle.setVisibility(View.GONE); + } else { + mNoNotificationsTitle.setVisibility(View.VISIBLE); } - - int index = mNotificationData.getExpandedIndex(notification); - parent.addView(child, index); } + /** - * Remove the old one and put the new one in its place. - * @param notification the notification + * State is one or more of the DISABLE constants from StatusBarManager. */ - void updateNotificationView(StatusBarNotification notification, NotificationData oldData) { - NotificationData n = notification.data; - if (oldData != null && n != null - && n.when == oldData.when - && n.ongoingEvent == oldData.ongoingEvent - && n.contentView != null && oldData.contentView != null - && n.contentView.getPackage() != null - && oldData.contentView.getPackage() != null - && oldData.contentView.getPackage().equals(n.contentView.getPackage()) - && oldData.contentView.getLayoutId() == n.contentView.getLayoutId() - && notification.view != null) { - mNotificationData.update(notification); - try { - n.contentView.reapply(mContext, notification.contentView); + public void disable(int state) { + final int old = mDisabled; + final int diff = state ^ old; + mDisabled = state; - // update the contentIntent - ViewGroup content = (ViewGroup)notification.view.findViewById( - com.android.internal.R.id.content); - PendingIntent contentIntent = n.contentIntent; - if (contentIntent != null) { - content.setOnClickListener(new Launcher(contentIntent, n.pkg, n.tag, n.id)); + 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"); + if (mTicking) { + mTicker.halt(); + } else { + setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out); + } + } else { + Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no"); + if (!mExpandedVisible) { + setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); } } - 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 " + n.contentView.getPackage(), e); - removeNotificationView(notification); + } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { + if (mTicking && (state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { + Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: yes"); + mTicker.halt(); } - } else { - mNotificationData.update(notification); - removeNotificationView(notification); - addNotificationView(notification); } - setAreThereNotifications(); } - void removeNotificationView(StatusBarNotification notification) { - View v = notification.view; - if (v != null) { - ViewGroup parent = (ViewGroup)v.getParent(); - parent.removeView(v); - notification.view = null; + /** + * All changes to the status bar and notifications funnel through here and are batched. + */ + private class H extends Handler { + public void handleMessage(Message m) { + switch (m.what) { + case MSG_ANIMATE: + doAnimation(); + break; + case MSG_ANIMATE_REVEAL: + doRevealAnimation(); + break; + } } } - private void setAreThereNotifications() { - boolean ongoing = mOngoingItems.getChildCount() != 0; - boolean latest = mLatestItems.getChildCount() != 0; - - if (mNotificationData.hasClearableItems()) { - mClearButton.setVisibility(View.VISIBLE); - } else { - mClearButton.setVisibility(View.INVISIBLE); - } - - 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); + View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() { + public void onFocusChange(View v, boolean hasFocus) { + // Because 'v' is a ViewGroup, all its children will be (un)selected + // too, which allows marqueeing to work. + v.setSelected(hasFocus); } - } + }; private void makeExpandedVisible() { if (SPEW) Slog.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible); @@ -962,7 +593,7 @@ public class StatusBarService extends IStatusBar.Stub return; } mExpandedVisible = true; - panelSlightlyVisible(true); + visibilityChanged(true); updateExpandedViewPos(EXPANDED_LEAVE_ALONE); mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; @@ -976,7 +607,7 @@ public class StatusBarService extends IStatusBar.Stub } } - void animateExpand() { + public void animateExpand() { if (SPEW) Slog.d(TAG, "Animate expand: expanded=" + mExpanded); if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { return ; @@ -989,7 +620,7 @@ public class StatusBarService extends IStatusBar.Stub performFling(0, 2000.0f, true); } - void animateCollapse() { + public void animateCollapse() { if (SPEW) { Slog.d(TAG, "animateCollapse(): mExpanded=" + mExpanded + " mExpandedVisible=" + mExpandedVisible @@ -1025,15 +656,6 @@ public class StatusBarService extends IStatusBar.Stub return; } - // It seems strange to sometimes not expand... - if (false) { - synchronized (mNotificationData) { - if (mNotificationData.size() == 0) { - return; - } - } - } - mExpanded = true; makeExpandedVisible(); updateExpandedViewPos(EXPANDED_FULL_OPEN); @@ -1049,7 +671,7 @@ public class StatusBarService extends IStatusBar.Stub return; } mExpandedVisible = false; - panelSlightlyVisible(false); + visibilityChanged(false); mExpandedParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; mExpandedDialog.getWindow().setAttributes(mExpandedParams); @@ -1315,13 +937,30 @@ public class StatusBarService extends IStatusBar.Stub overlay.setSourceBounds( new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight())); try { - mIntent.send(mContext, 0, overlay); - mNotificationCallbacks.onNotificationClick(mPkg, mTag, mId); + mIntent.send(PhoneStatusBarService.this, 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); } - deactivate(); + try { + mBarService.onNotificationClick(mPkg, mTag, mId); + } catch (RemoteException ex) { + // system process is dead if we're here. + } + animateCollapse(); + } + } + + private void tick(StatusBarNotification n) { + // 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 (n.notification.tickerText != null && mStatusBarView.getWindowToken() != null) { + if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS + | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) { + mTicker.addEntry(n); + } } } @@ -1377,7 +1016,7 @@ public class StatusBarService extends IStatusBar.Stub }; private Animation loadAnim(int id, Animation.AnimationListener listener) { - Animation anim = AnimationUtils.loadAnimation(mContext, id); + Animation anim = AnimationUtils.loadAnimation(PhoneStatusBarService.this, id); if (listener != null) { anim.setAnimationListener(listener); } @@ -1390,7 +1029,7 @@ public class StatusBarService extends IStatusBar.Stub } protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) + if (checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { pw.println("Permission Denial: can't dump StatusBar from from pid=" + Binder.getCallingPid() @@ -1413,15 +1052,6 @@ public class StatusBarService extends IStatusBar.Stub + " mAnimatingReveal=" + mAnimatingReveal + " mViewDelta=" + mViewDelta); pw.println(" mDisplayHeight=" + mDisplayHeight); - final int N = mQueue.size(); - pw.println(" mQueue.size=" + N); - for (int i=0; i<N; i++) { - PendingOp op = mQueue.get(i); - pw.println(" [" + i + "] key=" + op.key + " code=" + op.code + " visible=" - + op.visible); - pw.println(" iconData=" + op.iconData); - pw.println(" notificationData=" + op.notificationData); - } pw.println(" mExpandedParams: " + mExpandedParams); pw.println(" mExpandedView: " + viewInfo(mExpandedView)); pw.println(" mExpandedDialog: " + mExpandedDialog); @@ -1438,18 +1068,7 @@ public class StatusBarService extends IStatusBar.Stub + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY()); pw.println("mNotificationLinearLayout: " + viewInfo(mNotificationLinearLayout)); } - synchronized (mIconMap) { - final int N = mIconMap.size(); - pw.println(" mIconMap.size=" + N); - Set<IBinder> keys = mIconMap.keySet(); - int i=0; - for (IBinder key: keys) { - StatusBarIcon icon = mIconMap.get(key); - pw.println(" [" + i + "] key=" + key); - pw.println(" data=" + icon.mData); - i++; - } - } + /* synchronized (mNotificationData) { int N = mNotificationData.ongoingCount(); pw.println(" ongoingCount.size=" + N); @@ -1466,16 +1085,7 @@ public class StatusBarService extends IStatusBar.Stub pw.println(" data=" + n.data); } } - synchronized (mDisableRecords) { - final int N = mDisableRecords.size(); - pw.println(" mDisableRecords.size=" + N - + " mDisabled=0x" + Integer.toHexString(mDisabled)); - for (int i=0; i<N; i++) { - DisableRecord tok = mDisableRecords.get(i); - pw.println(" [" + i + "] what=0x" + Integer.toHexString(tok.what) - + " pkg=" + tok.pkg + " token=" + tok.token); - } - } + */ if (false) { pw.println("see the logcat for a dump of the views we have created."); @@ -1655,7 +1265,7 @@ public class StatusBarService extends IStatusBar.Stub // because the window itself extends below the content view. mExpandedParams.y = -disph; } - panelSlightlyVisible(visible); + visibilityChanged(visible); mExpandedDialog.getWindow().setAttributes(mExpandedParams); } @@ -1687,12 +1297,13 @@ public class StatusBarService extends IStatusBar.Stub * this is what he wants. (see bug 1131461) */ private boolean mPanelSlightlyVisible; - void panelSlightlyVisible(boolean visible) { + void visibilityChanged(boolean visible) { if (mPanelSlightlyVisible != visible) { mPanelSlightlyVisible = visible; - if (visible) { - // tell the notification manager to turn off the lights. - mNotificationCallbacks.onPanelRevealed(); + try { + mBarService.visibilityChanged(visible); + } catch (RemoteException ex) { + // Won't fail unless the world has ended. } } } @@ -1733,8 +1344,12 @@ public class StatusBarService extends IStatusBar.Stub private View.OnClickListener mClearButtonListener = new View.OnClickListener() { public void onClick(View v) { - mNotificationCallbacks.onClearAll(); - addPendingOp(OP_EXPAND, null, false); + try { + mBarService.onClearAllNotifications(); + } catch (RemoteException ex) { + // system process is dead if we're here. + } + animateCollapse(); } }; @@ -1743,13 +1358,7 @@ public class StatusBarService extends IStatusBar.Stub String action = intent.getAction(); if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) || Intent.ACTION_SCREEN_OFF.equals(action)) { - deactivate(); - } - else if (Telephony.Intents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { - updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false), - intent.getStringExtra(Telephony.Intents.EXTRA_SPN), - intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false), - intent.getStringExtra(Telephony.Intents.EXTRA_PLMN)); + //collapse(); } else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { updateResources(); @@ -1757,33 +1366,6 @@ public class StatusBarService extends IStatusBar.Stub } }; - void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) { - if (false) { - Slog.d(TAG, "updateNetworkName showSpn=" + showSpn + " spn=" + spn - + " showPlmn=" + showPlmn + " plmn=" + plmn); - } - boolean something = false; - if (showPlmn) { - mPlmnLabel.setVisibility(View.VISIBLE); - if (plmn != null) { - mPlmnLabel.setText(plmn); - } else { - mPlmnLabel.setText(R.string.lockscreen_carrier_default); - } - } else { - mPlmnLabel.setText(""); - mPlmnLabel.setVisibility(View.GONE); - } - if (showSpn && spn != null) { - mSpnLabel.setText(spn); - mSpnLabel.setVisibility(View.VISIBLE); - something = true; - } else { - mSpnLabel.setText(""); - mSpnLabel.setVisibility(View.GONE); - } - } - /** * Reload some of our resources when the configuration changes. * @@ -1792,12 +1374,12 @@ public class StatusBarService extends IStatusBar.Stub * meantime, just update the things that we know change. */ void updateResources() { - Resources res = mContext.getResources(); + Resources res = getResources(); - mClearButton.setText(mContext.getText(R.string.status_bar_clear_all_button)); - mOngoingTitle.setText(mContext.getText(R.string.status_bar_ongoing_events_title)); - mLatestTitle.setText(mContext.getText(R.string.status_bar_latest_events_title)); - mNoNotificationsTitle.setText(mContext.getText(R.string.status_bar_no_notifications_title)); + 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)); mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore); @@ -1813,8 +1395,7 @@ public class StatusBarService extends IStatusBar.Stub } void vibrate() { - android.os.Vibrator vib = (android.os.Vibrator)mContext.getSystemService( - Context.VIBRATOR_SERVICE); + android.os.Vibrator vib = (android.os.Vibrator)getSystemService(Context.VIBRATOR_SERVICE); vib.vibrate(250); } @@ -1835,47 +1416,4 @@ public class StatusBarService extends IStatusBar.Stub vibrate(); } }; - - class UninstallReceiver extends BroadcastReceiver { - public UninstallReceiver() { - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_PACKAGE_REMOVED); - filter.addAction(Intent.ACTION_PACKAGE_RESTARTED); - filter.addDataScheme("package"); - mContext.registerReceiver(this, filter); - IntentFilter sdFilter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); - mContext.registerReceiver(this, sdFilter); - } - - @Override - public void onReceive(Context context, Intent intent) { - String pkgList[] = null; - if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(intent.getAction())) { - pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); - } else { - Uri data = intent.getData(); - if (data != null) { - String pkg = data.getSchemeSpecificPart(); - if (pkg != null) { - pkgList = new String[]{pkg}; - } - } - } - ArrayList<StatusBarNotification> list = null; - if (pkgList != null) { - synchronized (StatusBarService.this) { - for (String pkg : pkgList) { - list = mNotificationData.notificationsForPackage(pkg); - } - } - } - - if (list != null) { - final int N = list.size(); - for (int i=0; i<N; i++) { - removeIcon(list.get(i).key); - } - } - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java new file mode 100644 index 000000000000..5eb0d683271b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -0,0 +1,134 @@ +/* + * 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; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.graphics.Canvas; +import android.util.Slog; +import android.view.ViewDebug; +import android.widget.FrameLayout; + +import com.android.internal.statusbar.StatusBarIcon; + +public class StatusBarIconView extends AnimatedImageView { + private static final String TAG = "StatusBarIconView"; + + private StatusBarIcon mIcon; + @ViewDebug.ExportedProperty private String mSlot; + @ViewDebug.ExportedProperty private boolean mError; + + public StatusBarIconView(Context context, String slot) { + super(context); + mSlot = slot; + } + + private static boolean streq(String a, String b) { + if (a == b) { + return true; + } + if (a == null && b != null) { + return false; + } + if (a != null && b == null) { + return false; + } + return a.equals(b); + } + + public void set(StatusBarIcon icon) { + error: { + final boolean iconEquals = !mError + && mIcon != null + && streq(mIcon.iconPackage, icon.iconPackage) + && mIcon.iconId == icon.iconId; + final boolean levelEquals = !mError + && iconEquals + && mIcon.iconLevel == icon.iconLevel; + final boolean visibilityEquals = !mError + && mIcon != null + && mIcon.visible == icon.visible; + mError = false; + if (!iconEquals) { + Drawable drawable = getIcon(icon); + if (drawable == null) { + mError = true; + Slog.w(PhoneStatusBarService.TAG, "No icon ID for slot " + mSlot); + break error; + } + setImageDrawable(drawable); + } + if (!levelEquals) { + setImageLevel(icon.iconLevel); + } + if (!visibilityEquals) { + setVisibility(icon.visible ? VISIBLE : GONE); + } + mIcon = icon.clone(); + } + if (mError) { + setVisibility(GONE); + } + } + + private Drawable getIcon(StatusBarIcon icon) { + return getIcon(getContext(), icon); + } + + /** + * Returns the right icon to use for this item, respecting the iconId and + * iconPackage (if set) + * + * @param context Context to use to get resources if iconPackage is not set + * @return Drawable for this item, or null if the package or item could not + * be found + */ + public static Drawable getIcon(Context context, StatusBarIcon icon) { + Resources r = null; + + if (icon.iconPackage != null) { + try { + r = context.getPackageManager().getResourcesForApplication(icon.iconPackage); + } catch (PackageManager.NameNotFoundException ex) { + Slog.e(PhoneStatusBarService.TAG, "Icon package not found: "+icon.iconPackage, ex); + return null; + } + } else { + r = context.getResources(); + } + + if (icon.iconId == 0) { + return null; + } + + try { + return r.getDrawable(icon.iconId); + } catch (RuntimeException e) { + Slog.w(PhoneStatusBarService.TAG, "Icon not found in " + + (icon.iconPackage != null ? icon.iconId : "<system>") + + ": " + Integer.toHexString(icon.iconId)); + } + + return null; + } + + public StatusBarIcon getStatusBarIcon() { + return mIcon; + } +} diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java index cab2662126a2..9ef9d0da306f 100644 --- a/services/java/com/android/server/status/StatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java @@ -14,8 +14,9 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar.policy; +import android.app.StatusBarManager; import android.app.AlertDialog; import android.bluetooth.BluetoothA2dp; import android.bluetooth.BluetoothAdapter; @@ -40,7 +41,6 @@ import android.net.Uri; import android.net.wifi.WifiManager; import android.os.Binder; import android.os.Handler; -import android.os.IBinder; import android.os.Message; import android.os.RemoteException; import android.os.storage.StorageManager; @@ -65,7 +65,6 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.android.internal.R; import com.android.internal.app.IBatteryStats; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.TelephonyIntents; @@ -73,20 +72,16 @@ import com.android.internal.telephony.cdma.EriInfo; import com.android.internal.telephony.cdma.TtyIntent; import com.android.server.am.BatteryStatsService; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.TimeZone; +import com.android.systemui.R; /** * This class contains all of the policy about which icons are installed in the status - * bar at boot time. In reality, it should go into the android.policy package, but - * putting it here is the first step from extracting it. + * 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"; - private static StatusBarPolicy sInstance; - // message codes for the handler private static final int EVENT_BATTERY_CLOSE = 4; @@ -97,23 +92,14 @@ public class StatusBarPolicy { private static final int AM_PM_STYLE = AM_PM_STYLE_GONE; private final Context mContext; - private final StatusBarService mService; + private final StatusBarManager mService; private final Handler mHandler = new StatusBarHandler(); private final IBatteryStats mBatteryStats; - // clock - private Calendar mCalendar; - private String mClockFormatString; - private SimpleDateFormat mClockFormat; - private IBinder mClockIcon; - private IconData mClockData; - // storage private StorageManager mStorageManager; // battery - private IBinder mBatteryIcon; - private IconData mBatteryData; private boolean mBatteryFirst = true; private boolean mBatteryPlugged; private int mBatteryLevel; @@ -127,121 +113,120 @@ public class StatusBarPolicy { // phone private TelephonyManager mPhone; - private IBinder mPhoneIcon; + private int mPhoneSignalIconId; //***** Signal strength icons - private IconData mPhoneData; //GSM/UMTS private static final int[] sSignalImages = new int[] { - com.android.internal.R.drawable.stat_sys_signal_0, - com.android.internal.R.drawable.stat_sys_signal_1, - com.android.internal.R.drawable.stat_sys_signal_2, - com.android.internal.R.drawable.stat_sys_signal_3, - com.android.internal.R.drawable.stat_sys_signal_4 + 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 }; private static final int[] sSignalImages_r = new int[] { - com.android.internal.R.drawable.stat_sys_r_signal_0, - com.android.internal.R.drawable.stat_sys_r_signal_1, - com.android.internal.R.drawable.stat_sys_r_signal_2, - com.android.internal.R.drawable.stat_sys_r_signal_3, - com.android.internal.R.drawable.stat_sys_r_signal_4 + 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 }; private static final int[] sRoamingIndicatorImages_cdma = new int[] { - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //Standard Roaming Indicator + R.drawable.stat_sys_roaming_cdma_0, //Standard Roaming Indicator // 1 is Standard Roaming Indicator OFF // TODO T: image never used, remove and put 0 instead? - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, // 2 is Standard Roaming Indicator FLASHING // TODO T: image never used, remove and put 0 instead? - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, // 3-12 Standard ERI - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //3 - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, //3 + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, // 13-63 Reserved for Standard ERI - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //13 - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, //13 + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, // 64-127 Reserved for Non Standard (Operator Specific) ERI - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //64 - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0, - com.android.internal.R.drawable.stat_sys_roaming_cdma_0 //83 + R.drawable.stat_sys_roaming_cdma_0, //64 + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0, + R.drawable.stat_sys_roaming_cdma_0 //83 // 128-255 Reserved }; @@ -250,38 +235,38 @@ public class StatusBarPolicy { private int[] mDataIconList = sDataNetType_g; //GSM/UMTS private static final int[] sDataNetType_g = new int[] { - com.android.internal.R.drawable.stat_sys_data_connected_g, - com.android.internal.R.drawable.stat_sys_data_in_g, - com.android.internal.R.drawable.stat_sys_data_out_g, - com.android.internal.R.drawable.stat_sys_data_inandout_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, }; private static final int[] sDataNetType_3g = new int[] { - com.android.internal.R.drawable.stat_sys_data_connected_3g, - com.android.internal.R.drawable.stat_sys_data_in_3g, - com.android.internal.R.drawable.stat_sys_data_out_3g, - com.android.internal.R.drawable.stat_sys_data_inandout_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, }; private static final int[] sDataNetType_e = new int[] { - com.android.internal.R.drawable.stat_sys_data_connected_e, - com.android.internal.R.drawable.stat_sys_data_in_e, - com.android.internal.R.drawable.stat_sys_data_out_e, - com.android.internal.R.drawable.stat_sys_data_inandout_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, }; //3.5G private static final int[] sDataNetType_h = new int[] { - com.android.internal.R.drawable.stat_sys_data_connected_h, - com.android.internal.R.drawable.stat_sys_data_in_h, - com.android.internal.R.drawable.stat_sys_data_out_h, - com.android.internal.R.drawable.stat_sys_data_inandout_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, }; //CDMA // Use 3G icons for EVDO data and 1x icons for 1XRTT data private static final int[] sDataNetType_1x = new int[] { - com.android.internal.R.drawable.stat_sys_data_connected_1x, - com.android.internal.R.drawable.stat_sys_data_in_1x, - com.android.internal.R.drawable.stat_sys_data_out_1x, - com.android.internal.R.drawable.stat_sys_data_inandout_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, }; // Assume it's all good unless we hear otherwise. We don't always seem @@ -294,19 +279,13 @@ public class StatusBarPolicy { SignalStrength mSignalStrength; // data connection - private IBinder mDataIcon; - private IconData mDataData; private boolean mDataIconVisible; private boolean mHspaDataDistinguishable; // ringer volume - private IBinder mVolumeIcon; - private IconData mVolumeData; private boolean mVolumeVisible; // bluetooth device status - private IBinder mBluetoothIcon; - private IconData mBluetoothData; private int mBluetoothHeadsetState; private boolean mBluetoothA2dpConnected; private int mBluetoothPbapState; @@ -314,68 +293,28 @@ public class StatusBarPolicy { // wifi private static final int[] sWifiSignalImages = new int[] { - com.android.internal.R.drawable.stat_sys_wifi_signal_1, - com.android.internal.R.drawable.stat_sys_wifi_signal_2, - com.android.internal.R.drawable.stat_sys_wifi_signal_3, - com.android.internal.R.drawable.stat_sys_wifi_signal_4, + 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, }; private static final int sWifiTemporarilyNotConnectedImage = - com.android.internal.R.drawable.stat_sys_wifi_signal_0; + R.drawable.stat_sys_wifi_signal_0; private int mLastWifiSignalLevel = -1; private boolean mIsWifiConnected = false; - private IBinder mWifiIcon; - private IconData mWifiData; - - // gps - private IBinder mGpsIcon; - private IconData mGpsEnabledIconData; - private IconData mGpsFixIconData; - - // alarm clock - // Icon lit when clock is set - private IBinder mAlarmClockIcon; - private IconData mAlarmClockIconData; // sync state // If sync is active the SyncActive icon is displayed. If sync is not active but // sync is failing the SyncFailing icon is displayed. Otherwise neither are displayed. - private IBinder mSyncActiveIcon; - private IBinder mSyncFailingIcon; - - // TTY mode - // Icon lit when TTY mode is enabled - private IBinder mTTYModeIcon; - private IconData mTTYModeEnableIconData; - - // Cdma Roaming Indicator, ERI - private IBinder mCdmaRoamingIndicatorIcon; - private IconData mCdmaRoamingIndicatorIconData; private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); - if (action.equals(Intent.ACTION_TIME_TICK)) { - updateClock(); - } - else if (action.equals(Intent.ACTION_TIME_CHANGED)) { - updateClock(); - } - else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { + if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { updateBattery(intent); } - else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) { - updateClock(); - } - else 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(); - } else if (action.equals(Intent.ACTION_ALARM_CHANGED)) { updateAlarm(intent); } @@ -417,33 +356,24 @@ public class StatusBarPolicy { } }; - private StatusBarPolicy(Context context, StatusBarService service) { + public StatusBarPolicy(Context context) { mContext = context; - mService = service; + mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE); mSignalStrength = new SignalStrength(); mBatteryStats = BatteryStatsService.getService(); - // clock - mCalendar = Calendar.getInstance(TimeZone.getDefault()); - mClockData = IconData.makeText("clock", ""); - mClockIcon = service.addIcon(mClockData, null); - updateClock(); - // storage mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); mStorageManager.registerListener( new com.android.server.status.StorageNotification(context)); // battery - mBatteryData = IconData.makeIcon("battery", - null, com.android.internal.R.drawable.stat_sys_battery_unknown, 0, 0); - mBatteryIcon = service.addIcon(mBatteryData, null); + mService.setIcon("battery", com.android.internal.R.drawable.stat_sys_battery_unknown, 0); // phone_signal mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); - mPhoneData = IconData.makeIcon("phone_signal", - null, com.android.internal.R.drawable.stat_sys_signal_null, 0, 0); - mPhoneIcon = service.addIcon(mPhoneData, null); + mPhoneSignalIconId = R.drawable.stat_sys_signal_null; + mService.setIcon("phone_signal", mPhoneSignalIconId, 0); // register for phone state notifications. ((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE)) @@ -455,33 +385,24 @@ public class StatusBarPolicy { | PhoneStateListener.LISTEN_DATA_ACTIVITY); // data_connection - mDataData = IconData.makeIcon("data_connection", - null, com.android.internal.R.drawable.stat_sys_data_connected_g, 0, 0); - mDataIcon = service.addIcon(mDataData, null); - service.setIconVisibility(mDataIcon, false); + mService.setIcon("data_connection", R.drawable.stat_sys_data_connected_g, 0); + mService.setIconVisibility("data_connection", false); // wifi - mWifiData = IconData.makeIcon("wifi", null, sWifiSignalImages[0], 0, 0); - mWifiIcon = service.addIcon(mWifiData, null); - service.setIconVisibility(mWifiIcon, false); + mService.setIcon("wifi", sWifiSignalImages[0], 0); + mService.setIconVisibility("wifi", false); // wifi will get updated by the sticky intents // TTY status - mTTYModeEnableIconData = IconData.makeIcon("tty", - null, com.android.internal.R.drawable.stat_sys_tty_mode, 0, 0); - mTTYModeIcon = service.addIcon(mTTYModeEnableIconData, null); - service.setIconVisibility(mTTYModeIcon, false); + mService.setIcon("tty", R.drawable.stat_sys_tty_mode, 0); + mService.setIconVisibility("tty", false); // Cdma Roaming Indicator, ERI - mCdmaRoamingIndicatorIconData = IconData.makeIcon("cdma_eri", - null, com.android.internal.R.drawable.stat_sys_roaming_cdma_0, 0, 0); - mCdmaRoamingIndicatorIcon = service.addIcon(mCdmaRoamingIndicatorIconData, null); - service.setIconVisibility(mCdmaRoamingIndicatorIcon, false); + mService.setIcon("cdma_eri", R.drawable.stat_sys_roaming_cdma_0, 0); + mService.setIconVisibility("cdma_eri", false); // bluetooth status - mBluetoothData = IconData.makeIcon("bluetooth", - null, com.android.internal.R.drawable.stat_sys_data_bluetooth, 0, 0); - mBluetoothIcon = service.addIcon(mBluetoothData, null); + mService.setIcon("bluetooth", R.drawable.stat_sys_data_bluetooth, 0); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); if (adapter != null) { mBluetoothEnabled = adapter.isEnabled(); @@ -491,49 +412,34 @@ public class StatusBarPolicy { mBluetoothA2dpConnected = false; mBluetoothHeadsetState = BluetoothHeadset.STATE_DISCONNECTED; mBluetoothPbapState = BluetoothPbap.STATE_DISCONNECTED; - mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled); + mService.setIconVisibility("bluetooth", mBluetoothEnabled); // Gps status - mGpsEnabledIconData = IconData.makeIcon("gps", - null, com.android.internal.R.drawable.stat_sys_gps_acquiring_anim, 0, 0); - mGpsFixIconData = IconData.makeIcon("gps", - null, com.android.internal.R.drawable.stat_sys_gps_on, 0, 0); - mGpsIcon = service.addIcon(mGpsEnabledIconData, null); - service.setIconVisibility(mGpsIcon, false); + mService.setIcon("gps", R.drawable.stat_sys_gps_acquiring_anim, 0); + mService.setIconVisibility("gps", false); // Alarm clock - mAlarmClockIconData = IconData.makeIcon( - "alarm_clock", - null, com.android.internal.R.drawable.stat_notify_alarm, 0, 0); - mAlarmClockIcon = service.addIcon(mAlarmClockIconData, null); - service.setIconVisibility(mAlarmClockIcon, false); + mService.setIcon("alarm_clock", R.drawable.stat_notify_alarm, 0); + mService.setIconVisibility("alarm_clock", false); // Sync state - mSyncActiveIcon = service.addIcon(IconData.makeIcon("sync_active", - null, R.drawable.stat_notify_sync_anim0, 0, 0), null); - mSyncFailingIcon = service.addIcon(IconData.makeIcon("sync_failing", - null, R.drawable.stat_notify_sync_error, 0, 0), null); - service.setIconVisibility(mSyncActiveIcon, false); - service.setIconVisibility(mSyncFailingIcon, false); + mService.setIcon("sync_active", com.android.internal.R.drawable.stat_notify_sync_anim0, 0); + mService.setIcon("sync_failing", com.android.internal.R.drawable.stat_notify_sync_error, 0); + mService.setIconVisibility("sync_active", false); + mService.setIconVisibility("sync_failing", false); // volume - mVolumeData = IconData.makeIcon("volume", - null, com.android.internal.R.drawable.stat_sys_ringer_silent, 0, 0); - mVolumeIcon = service.addIcon(mVolumeData, null); - service.setIconVisibility(mVolumeIcon, false); + mService.setIcon("volume", R.drawable.stat_sys_ringer_silent, 0); + mService.setIconVisibility("volume", false); updateVolume(); IntentFilter filter = new IntentFilter(); // Register for Intent broadcasts for... - filter.addAction(Intent.ACTION_TIME_TICK); - filter.addAction(Intent.ACTION_TIME_CHANGED); - filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); 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_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_ALARM_CHANGED); filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); @@ -555,124 +461,32 @@ public class StatusBarPolicy { // load config to determine if to distinguish Hspa data icon try { mHspaDataDistinguishable = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_hspa_data_distinguishable); + R.bool.config_hspa_data_distinguishable); } catch (Exception e) { mHspaDataDistinguishable = false; } } - public static void installIcons(Context context, StatusBarService service) { - sInstance = new StatusBarPolicy(context, service); - } - - private final CharSequence getSmallTime() { - boolean b24 = DateFormat.is24HourFormat(mContext); - int res; - - if (b24) { - res = R.string.twenty_four_hour_time_format; - } else { - res = R.string.twelve_hour_time_format; - } - - final char MAGIC1 = '\uEF00'; - final char MAGIC2 = '\uEF01'; - - SimpleDateFormat sdf; - String format = mContext.getString(res); - if (!format.equals(mClockFormatString)) { - /* - * Search for an unquoted "a" in the format string, so we can - * add dummy characters around it to let us find it again after - * formatting and change its size. - */ - if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { - int a = -1; - boolean quoted = false; - for (int i = 0; i < format.length(); i++) { - char c = format.charAt(i); - - if (c == '\'') { - quoted = !quoted; - } - - if (!quoted && c == 'a') { - a = i; - break; - } - } - - if (a >= 0) { - // Move a back so any whitespace before the AM/PM is also in the alternate size. - final int b = a; - while (a > 0 && Character.isWhitespace(format.charAt(a-1))) { - a--; - } - format = format.substring(0, a) + MAGIC1 + format.substring(a, b) - + "a" + MAGIC2 + format.substring(b + 1); - } - } - - mClockFormat = sdf = new SimpleDateFormat(format); - mClockFormatString = format; - } else { - sdf = mClockFormat; - } - String result = sdf.format(mCalendar.getTime()); - - if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { - int magic1 = result.indexOf(MAGIC1); - int magic2 = result.indexOf(MAGIC2); - - if (magic1 >= 0 && magic2 > magic1) { - SpannableStringBuilder formatted = new SpannableStringBuilder(result); - - if (AM_PM_STYLE == AM_PM_STYLE_GONE) { - formatted.delete(magic1, magic2+1); - } else { - if (AM_PM_STYLE == AM_PM_STYLE_SMALL) { - CharacterStyle style = new RelativeSizeSpan(0.7f); - formatted.setSpan(style, magic1, magic2, - Spannable.SPAN_EXCLUSIVE_INCLUSIVE); - } - - formatted.delete(magic2, magic2 + 1); - formatted.delete(magic1, magic1 + 1); - } - - return formatted; - } - } - - return result; - } - - private final void updateClock() { - mCalendar.setTimeInMillis(System.currentTimeMillis()); - mClockData.text = getSmallTime(); - mService.updateIcon(mClockIcon, mClockData, null); - } - private final void updateAlarm(Intent intent) { boolean alarmSet = intent.getBooleanExtra("alarmSet", false); - mService.setIconVisibility(mAlarmClockIcon, alarmSet); + mService.setIconVisibility("alarm_clock", alarmSet); } private final void updateSyncState(Intent intent) { boolean isActive = intent.getBooleanExtra("active", false); boolean isFailing = intent.getBooleanExtra("failing", false); - mService.setIconVisibility(mSyncActiveIcon, isActive); + mService.setIconVisibility("sync_active", isActive); // Don't display sync failing icon: BUG 1297963 Set sync error timeout to "never" - //mService.setIconVisibility(mSyncFailingIcon, isFailing && !isActive); + //mService.setIconVisibility("sync_failing", isFailing && !isActive); } private final void updateBattery(Intent intent) { - mBatteryData.iconId = intent.getIntExtra("icon-small", 0); - mBatteryData.iconLevel = intent.getIntExtra("level", 0); - mService.updateIcon(mBatteryIcon, mBatteryData, null); + 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; - int level = intent.getIntExtra("level", -1); + level = intent.getIntExtra("level", -1); if (false) { Slog.d(TAG, "updateBattery level=" + level + " plugged=" + plugged @@ -696,12 +510,6 @@ public class StatusBarPolicy { * 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). */ - /* else { - if (plugged && !oldPlugged) { - showBatteryView(); - } - } - */ if (false) { Slog.d(TAG, "plugged=" + plugged + " oldPlugged=" + oldPlugged + " level=" + level); } @@ -731,58 +539,6 @@ public class StatusBarPolicy { } } - private void showBatteryView() { - closeLastBatteryView(); - if (mLowBatteryDialog != null) { - mLowBatteryDialog.dismiss(); - } - - int level = mBatteryLevel; - - View v = View.inflate(mContext, com.android.internal.R.layout.battery_status, null); - mBatteryView = v; - int pixelFormat = PixelFormat.TRANSLUCENT; - Drawable bg = v.getBackground(); - if (bg != null) { - pixelFormat = bg.getOpacity(); - } - - int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE - | WindowManager.LayoutParams.FLAG_DIM_BEHIND; - - if (!mContext.getResources().getBoolean( - com.android.internal.R.bool.config_sf_slowBlur)) { - flags |= WindowManager.LayoutParams.FLAG_BLUR_BEHIND; - } - - WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_TOAST, - flags, pixelFormat); - - // Get the dim amount from the theme - TypedArray a = mContext.obtainStyledAttributes( - com.android.internal.R.styleable.Theme); - lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f); - a.recycle(); - - lp.setTitle("Battery"); - - TextView levelTextView = (TextView)v.findViewById(com.android.internal.R.id.level_percent); - levelTextView.setText(mContext.getString( - com.android.internal.R.string.battery_status_text_percent_format, level)); - - setBatteryLevel(v, com.android.internal.R.id.spacer, 100-level, 0, 0); - setBatteryLevel(v, com.android.internal.R.id.level, level, - com.android.internal.R.drawable.battery_charge_fill, level); - - WindowManagerImpl.getDefault().addView(v, lp); - - scheduleCloseBatteryView(); - } - 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(); @@ -799,19 +555,19 @@ public class StatusBarPolicy { // Show exact battery level. CharSequence levelText = mContext.getString( - com.android.internal.R.string.battery_low_percent_format, mBatteryLevel); + R.string.battery_low_percent_format, mBatteryLevel); if (mBatteryLevelTextView != null) { mBatteryLevelTextView.setText(levelText); } else { - View v = View.inflate(mContext, com.android.internal.R.layout.battery_low, null); - mBatteryLevelTextView=(TextView)v.findViewById(com.android.internal.R.id.level_percent); + 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(com.android.internal.R.string.battery_low_title); + 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); @@ -822,7 +578,7 @@ public class StatusBarPolicy { | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY); if (intent.resolveActivity(mContext.getPackageManager()) != null) { - b.setNegativeButton(com.android.internal.R.string.battery_low_why, + b.setNegativeButton(R.string.battery_low_why, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mContext.startActivity(intent); @@ -1003,11 +759,11 @@ public class StatusBarPolicy { //Slog.d(TAG, "updateSignalStrength: no service"); if (Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1) { - mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_flightmode; + mPhoneSignalIconId = R.drawable.stat_sys_signal_flightmode; } else { - mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_null; + mPhoneSignalIconId = R.drawable.stat_sys_signal_null; } - mService.updateIcon(mPhoneIcon, mPhoneData, null); + mService.setIcon("phone_signal", mPhoneSignalIconId, 0); return; } @@ -1045,8 +801,8 @@ public class StatusBarPolicy { iconLevel = getCdmaLevel(); } } - mPhoneData.iconId = iconList[iconLevel]; - mService.updateIcon(mPhoneIcon, mPhoneData, null); + mPhoneSignalIconId = iconList[iconLevel]; + mService.setIcon("phone_signal", mPhoneSignalIconId, 0); } private int getCdmaLevel() { @@ -1149,14 +905,13 @@ public class StatusBarPolicy { iconId = mDataIconList[0]; break; } - mDataData.iconId = iconId; - mService.updateIcon(mDataIcon, mDataData, null); + mService.setIcon("data_connection", iconId, 0); } else { visible = false; } } else { - mDataData.iconId = com.android.internal.R.drawable.stat_sys_no_sim; - mService.updateIcon(mDataIcon, mDataData, null); + iconId = R.drawable.stat_sys_no_sim; + mService.setIcon("data_connection", iconId, 0); } } else { // CDMA case, mDataActivity can be also DATA_ACTIVITY_DORMANT @@ -1176,8 +931,7 @@ public class StatusBarPolicy { iconId = mDataIconList[0]; break; } - mDataData.iconId = iconId; - mService.updateIcon(mDataIcon, mDataData, null); + mService.setIcon("data_connection", iconId, 0); } else { visible = false; } @@ -1192,7 +946,7 @@ public class StatusBarPolicy { } if (mDataIconVisible != visible) { - mService.setIconVisibility(mDataIcon, visible); + mService.setIconVisibility("data_connection", visible); mDataIconVisible = visible; } } @@ -1203,21 +957,20 @@ public class StatusBarPolicy { final boolean visible = ringerMode == AudioManager.RINGER_MODE_SILENT || ringerMode == AudioManager.RINGER_MODE_VIBRATE; final int iconId = audioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER) - ? com.android.internal.R.drawable.stat_sys_ringer_vibrate - : com.android.internal.R.drawable.stat_sys_ringer_silent; + ? R.drawable.stat_sys_ringer_vibrate + : R.drawable.stat_sys_ringer_silent; if (visible) { - mVolumeData.iconId = iconId; - mService.updateIcon(mVolumeIcon, mVolumeData, null); + mService.setIcon("volume", iconId, 0); } if (visible != mVolumeVisible) { - mService.setIconVisibility(mVolumeIcon, visible); + mService.setIconVisibility("volume", visible); mVolumeVisible = visible; } } private final void updateBluetooth(Intent intent) { - int iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth; + int iconId = R.drawable.stat_sys_data_bluetooth; String action = intent.getAction(); if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); @@ -1241,12 +994,11 @@ public class StatusBarPolicy { if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED || mBluetoothA2dpConnected || mBluetoothPbapState == BluetoothPbap.STATE_CONNECTED) { - iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth_connected; + iconId = R.drawable.stat_sys_data_bluetooth_connected; } - mBluetoothData.iconId = iconId; - mService.updateIcon(mBluetoothIcon, mBluetoothData, null); - mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled); + mService.setIcon("bluetooth", iconId, 0); + mService.setIconVisibility("bluetooth", mBluetoothEnabled); } private final void updateWifi(Intent intent) { @@ -1258,14 +1010,14 @@ public class StatusBarPolicy { if (!enabled) { // If disabled, hide the icon. (We show icon when connected.) - mService.setIconVisibility(mWifiIcon, false); + mService.setIconVisibility("wifi", false); } } else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { final boolean enabled = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false); if (!enabled) { - mService.setIconVisibility(mWifiIcon, false); + mService.setIconVisibility("wifi", false); } } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { @@ -1282,7 +1034,7 @@ public class StatusBarPolicy { } // Show the icon since wi-fi is connected - mService.setIconVisibility(mWifiIcon, true); + mService.setIconVisibility("wifi", true); } else { mLastWifiSignalLevel = -1; @@ -1290,23 +1042,23 @@ public class StatusBarPolicy { iconId = sWifiSignalImages[0]; // Hide the icon since we're not connected - mService.setIconVisibility(mWifiIcon, false); + mService.setIconVisibility("wifi", false); } - mWifiData.iconId = iconId; - mService.updateIcon(mWifiIcon, mWifiData, null); + mService.setIcon("wifi", iconId, 0); } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) { + int iconId; final int newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200); int newSignalLevel = WifiManager.calculateSignalLevel(newRssi, sWifiSignalImages.length); if (newSignalLevel != mLastWifiSignalLevel) { mLastWifiSignalLevel = newSignalLevel; if (mIsWifiConnected) { - mWifiData.iconId = sWifiSignalImages[newSignalLevel]; + iconId = sWifiSignalImages[newSignalLevel]; } else { - mWifiData.iconId = sWifiTemporarilyNotConnectedImage; + iconId = sWifiTemporarilyNotConnectedImage; } - mService.updateIcon(mWifiIcon, mWifiData, null); + mService.setIcon("wifi", iconId, 0); } } } @@ -1317,15 +1069,15 @@ public class StatusBarPolicy { if (action.equals(LocationManager.GPS_FIX_CHANGE_ACTION) && enabled) { // GPS is getting fixes - mService.updateIcon(mGpsIcon, mGpsFixIconData, null); - mService.setIconVisibility(mGpsIcon, true); + mService.setIcon("gps", com.android.internal.R.drawable.stat_sys_gps_on, 0); + mService.setIconVisibility("gps", true); } else if (action.equals(LocationManager.GPS_ENABLED_CHANGE_ACTION) && !enabled) { // GPS is off - mService.setIconVisibility(mGpsIcon, false); + mService.setIconVisibility("gps", false); } else { // GPS is on, but not receiving fixes - mService.updateIcon(mGpsIcon, mGpsEnabledIconData, null); - mService.setIconVisibility(mGpsIcon, true); + mService.setIcon("gps", R.drawable.stat_sys_gps_acquiring_anim, 0); + mService.setIconVisibility("gps", true); } } @@ -1338,23 +1090,23 @@ public class StatusBarPolicy { if (enabled) { // TTY is on if (false) Slog.v(TAG, "updateTTY: set TTY on"); - mService.updateIcon(mTTYModeIcon, mTTYModeEnableIconData, null); - mService.setIconVisibility(mTTYModeIcon, true); + mService.setIcon("tty", R.drawable.stat_sys_tty_mode, 0); + mService.setIconVisibility("tty", true); } else { // TTY is off if (false) Slog.v(TAG, "updateTTY: set TTY off"); - mService.setIconVisibility(mTTYModeIcon, false); + mService.setIconVisibility("tty", false); } } private final void updateCdmaRoamingIcon(ServiceState state) { if (!hasService()) { - mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false); + mService.setIconVisibility("cdma_eri", false); return; } if (!isCdma()) { - mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false); + mService.setIconVisibility("cdma_eri", false); return; } @@ -1374,25 +1126,22 @@ public class StatusBarPolicy { if (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) { if (false) Slog.v(TAG, "Cdma ROAMING_INDICATOR_OFF, removing ERI icon"); - mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false); + mService.setIconVisibility("cdma_eri", false); return; } switch (iconMode) { case EriInfo.ROAMING_ICON_MODE_NORMAL: - mCdmaRoamingIndicatorIconData.iconId = iconList[iconIndex]; - mService.updateIcon(mCdmaRoamingIndicatorIcon, mCdmaRoamingIndicatorIconData, null); - mService.setIconVisibility(mCdmaRoamingIndicatorIcon, true); + mService.setIcon("cdma_eri", iconList[iconIndex], 0); + mService.setIconVisibility("cdma_eri", true); break; case EriInfo.ROAMING_ICON_MODE_FLASH: - mCdmaRoamingIndicatorIconData.iconId = - com.android.internal.R.drawable.stat_sys_roaming_cdma_flash; - mService.updateIcon(mCdmaRoamingIndicatorIcon, mCdmaRoamingIndicatorIconData, null); - mService.setIconVisibility(mCdmaRoamingIndicatorIcon, true); + mService.setIcon("cdma_eri", R.drawable.stat_sys_roaming_cdma_flash, 0); + mService.setIconVisibility("cdma_eri", true); break; } - mService.updateIcon(mPhoneIcon, mPhoneData, null); + mService.setIcon("phone_signal", mPhoneSignalIconId, 0); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java new file mode 100644 index 000000000000..4d9e69510085 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.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.statusbar; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.graphics.PixelFormat; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.SystemClock; +import android.util.Log; +import android.util.Slog; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.view.WindowManagerImpl; + +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 java.util.Arrays; +import java.util.ArrayList; + +public abstract class StatusBarService extends Service implements CommandQueue.Callbacks { + private static final String TAG = "StatusBarService"; + + CommandQueue mCommandQueue; + IStatusBarService mBarService; + + /* TODO + H mHandler = new H(); + Object mQueueLock = new Object(); + NotificationCallbacks mNotificationCallbacks; + */ + + @Override + public void onCreate() { + // 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++; + } + } + + // 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 + addStatusBarView(); + } + + @Override + public void onDestroy() { + // we're never destroyed + } + + /** + * Nobody binds to us. + */ + @Override + public IBinder onBind(Intent intent) { + return null; + } + + /** + * Implement this to add the main status bar view. + */ + protected abstract void addStatusBarView(); +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStarter.java new file mode 100644 index 000000000000..2b9dfb0e1da8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStarter.java @@ -0,0 +1,38 @@ +/* + * 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.content.Context; +import android.content.Intent; +import android.content.BroadcastReceiver; +import android.util.Log; + +/** + * Receive a broadcast from the StatusBarManagerService at boot time, and + * kick off the StatusBarService. + */ +public class StatusBarStarter extends BroadcastReceiver { + private static final String TAG = "StatusBarStarter"; + + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, "StatusBarStarter onReceive intent=" + intent); + context.startService(new Intent(context, PhoneStatusBarService.class)); + } +} + + diff --git a/services/java/com/android/server/status/StatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java index 5e1f57204cd6..466cc751e446 100644 --- a/services/java/com/android/server/status/StatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.content.Context; import android.content.res.Configuration; @@ -27,14 +27,14 @@ import android.view.ViewGroup; import android.view.ViewParent; import android.widget.FrameLayout; -import com.android.internal.R; +import com.android.systemui.R; public class StatusBarView extends FrameLayout { private static final String TAG = "StatusBarView"; static final int DIM_ANIM_TIME = 400; - StatusBarService mService; + PhoneStatusBarService mService; boolean mTracking; int mStartX, mStartY; ViewGroup mNotificationIcons; @@ -94,7 +94,7 @@ public class StatusBarView extends FrameLayout { @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(PhoneStatusBarService.EXPANDED_LEAVE_ALONE); } @Override diff --git a/services/java/com/android/server/status/Ticker.java b/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java index e47185bac3a4..07e865376680 100644 --- a/services/java/com/android/server/status/Ticker.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java @@ -14,9 +14,7 @@ * limitations under the License. */ -package com.android.server.status; - -import com.android.internal.R; +package com.android.systemui.statusbar; import android.content.Context; import android.graphics.drawable.Drawable; @@ -35,12 +33,24 @@ import android.widget.ImageSwitcher; 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; -abstract class Ticker { +public abstract class Ticker { private static final int TICKER_SEGMENT_DELAY = 3000; + private Context mContext; + private Handler mHandler = new Handler(); + private ArrayList<Segment> mSegments = new ArrayList(); + private TextPaint mPaint; + private View mTickerView; + private ImageSwitcher mIconSwitcher; + private TextSwitcher mTextSwitcher; + private final class Segment { - NotificationData notificationData; + StatusBarNotification notification; Drawable icon; CharSequence text; int current; @@ -116,8 +126,8 @@ abstract class Ticker { return null; } - Segment(NotificationData n, Drawable icon, CharSequence text) { - this.notificationData = n; + Segment(StatusBarNotification n, Drawable icon, CharSequence text) { + this.notification = n; this.icon = icon; this.text = text; int index = 0; @@ -131,14 +141,8 @@ abstract class Ticker { } }; - private Handler mHandler = new Handler(); - private ArrayList<Segment> mSegments = new ArrayList(); - private TextPaint mPaint; - private View mTickerView; - private ImageSwitcher mIconSwitcher; - private TextSwitcher mTextSwitcher; - Ticker(Context context, StatusBarView sb) { + mContext = context; mTickerView = sb.findViewById(R.id.ticker); mIconSwitcher = (ImageSwitcher)sb.findViewById(R.id.tickerIcon); @@ -158,20 +162,34 @@ abstract class Ticker { mPaint = text.getPaint(); } - void addEntry(NotificationData n, Drawable icon, CharSequence text) { + + void addEntry(StatusBarNotification n) { int initialCount = mSegments.size(); - Segment newSegment = new Segment(n, icon, text); + // If what's being displayed has the same text and icon, just drop it + // (which will let the current one finish, this happens when apps do + // a notification storm). + if (initialCount > 0) { + final Segment seg = mSegments.get(0); + if (n.pkg.equals(seg.notification.pkg) + && n.notification.icon == seg.notification.notification.icon + && n.notification.iconLevel == seg.notification.notification.iconLevel + && CharSequences.equals(seg.notification.notification.tickerText, + n.notification.tickerText)) { + return; + } + } + + final Drawable icon = StatusBarIconView.getIcon(mContext, + new StatusBarIcon(n.pkg, n.notification.icon, n.notification.iconLevel, 0)); + final Segment newSegment = new Segment(n, icon, n.notification.tickerText); - // prune out any preexisting ones for this notification, but not the current one. - // let that finish, even if it's the same id - for (int i=1; i<initialCount; i++) { + // If there's already a notification schedule for this package and id, remove it. + for (int i=0; i<initialCount; i++) { Segment seg = mSegments.get(i); - if (n.id == seg.notificationData.id && n.pkg.equals(seg.notificationData.pkg)) { + if (n.id == seg.notification.id && n.pkg.equals(seg.notification.pkg)) { // just update that one to use this new data instead - mSegments.set(i, newSegment); - // and since we know initialCount != 0, just return - return ; + mSegments.remove(i); } } @@ -194,6 +212,15 @@ abstract class Ticker { } } + 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)) { + mSegments.remove(i); + } + } + } + void halt() { mHandler.removeCallbacks(mAdvanceTicker); mSegments.clear(); diff --git a/services/java/com/android/server/status/TickerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java index 099dffb65ccb..9749ae442741 100644 --- a/services/java/com/android/server/status/TickerView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.content.Context; import android.util.AttributeSet; diff --git a/services/java/com/android/server/status/TrackingPatternView.java b/packages/SystemUI/src/com/android/systemui/statusbar/TrackingPatternView.java index 2c91aa424691..ba6f15d04667 100644 --- a/services/java/com/android/server/status/TrackingPatternView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/TrackingPatternView.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; import android.content.Context; import android.content.res.TypedArray; diff --git a/services/java/com/android/server/status/TrackingView.java b/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java index 8ec39c03bcb8..c59eb6a29d50 100644 --- a/services/java/com/android/server/status/TrackingView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.status; +package com.android.systemui.statusbar; 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; + PhoneStatusBarService mService; boolean mTracking; int mStartX, mStartY; @@ -48,7 +48,7 @@ public class TrackingView extends LinearLayout { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: if (down) { - mService.deactivate(); + //mService.deactivate(); } return true; } diff --git a/policy/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/com/android/internal/policy/impl/KeyguardViewMediator.java index c255041df36a..eb61f5e506b2 100644 --- a/policy/com/android/internal/policy/impl/KeyguardViewMediator.java +++ b/policy/com/android/internal/policy/impl/KeyguardViewMediator.java @@ -145,8 +145,8 @@ public class KeyguardViewMediator implements KeyguardViewCallback, private Context mContext; private AlarmManager mAlarmManager; private StatusBarManager mStatusBarManager; - private boolean mShowLockIcon = false; - private IBinder mSecureLockIcon = null; + private boolean mShowLockIcon; + private boolean mShowingLockIcon; private boolean mSystemReady; @@ -1036,14 +1036,15 @@ public class KeyguardViewMediator implements KeyguardViewCallback, if (mShowLockIcon) { // Give feedback to user when secure keyguard is active and engaged if (mShowing && isSecure()) { - if (mSecureLockIcon == null) { - mSecureLockIcon = mStatusBarManager.addIcon("secure", - com.android.internal.R.drawable.stat_sys_secure, 0); + if (!mShowingLockIcon) { + mStatusBarManager.setIcon("secure", + com.android.internal.R.drawable.stat_sys_secure, 0); + mShowingLockIcon = true; } } else { - if (mSecureLockIcon != null) { - mStatusBarManager.removeIcon(mSecureLockIcon); - mSecureLockIcon = null; + if (mShowingLockIcon) { + mStatusBarManager.removeIcon("secure"); + mShowingLockIcon = false; } } } diff --git a/policy/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/com/android/internal/policy/impl/PhoneWindowManager.java index a7c278b0d301..73a57eebeae2 100755 --- a/policy/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/com/android/internal/policy/impl/PhoneWindowManager.java @@ -19,7 +19,6 @@ package com.android.internal.policy.impl; import android.app.Activity; import android.app.ActivityManagerNative; import android.app.IActivityManager; -import android.app.IStatusBar; import android.app.IUiModeManager; import android.app.UiModeManager; import android.content.ActivityNotFoundException; @@ -47,6 +46,7 @@ import android.os.Vibrator; import android.provider.Settings; import com.android.internal.policy.PolicyManager; +import com.android.internal.statusbar.IStatusBarService; import com.android.internal.telephony.ITelephony; import com.android.internal.widget.PointerLocationView; @@ -1140,22 +1140,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { return true; } } - } else if (code == KeyEvent.KEYCODE_NOTIFICATION) { - if (down) { - // this key doesn't exist on current hardware, but if a device - // didn't have a touchscreen, it would want one of these to open - // the status bar. - IStatusBar sbs = IStatusBar.Stub.asInterface(ServiceManager.getService("statusbar")); - if (sbs != null) { - try { - sbs.toggle(); - } catch (RemoteException e) { - // we're screwed anyway, since it's in this process - throw new RuntimeException(e); - } - } - } - return true; } else if (code == KeyEvent.KEYCODE_SEARCH) { if (down) { if (repeatCount == 0) { @@ -1537,11 +1521,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (changes != 0 && hiding) { - IStatusBar sbs = IStatusBar.Stub.asInterface(ServiceManager.getService("statusbar")); + IStatusBarService sbs = IStatusBarService.Stub.asInterface(ServiceManager.getService("statusbar")); if (sbs != null) { try { // Make sure the window shade is hidden. - sbs.deactivate(); + sbs.collapse(); } catch (RemoteException e) { } } diff --git a/preloaded-classes b/preloaded-classes index f300fe7ff3a0..b60203911324 100644 --- a/preloaded-classes +++ b/preloaded-classes @@ -31,7 +31,6 @@ android.app.ExpandableListActivity android.app.IActivityManager android.app.IActivityManager$ContentProviderHolder android.app.IAlarmManager$Stub -android.app.IStatusBar$Stub android.app.ITransientNotification$Stub android.app.Instrumentation android.app.IntentService @@ -654,6 +653,11 @@ com.android.internal.policy.impl.PhoneWindow$DecorView com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState com.android.internal.policy.impl.PhoneWindowManager com.android.internal.policy.impl.Policy +com.android.internal.statusbar.IStatusBar +com.android.internal.statusbar.IStatusBar$Stub +com.android.internal.statusbar.IStatusBarService$Stub +com.android.internal.statusbar.IStatusBarService$Stub +com.android.internal.statusbar.StatusBarIcon com.android.internal.telephony.GsmAlphabet com.android.internal.telephony.ITelephony$Stub com.android.internal.telephony.ITelephony$Stub$Proxy diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index 5bf66e4d1282..a1f26f25b68f 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -26,8 +26,7 @@ import com.android.internal.view.IInputMethodManager; import com.android.internal.view.IInputMethodSession; import com.android.internal.view.InputBindResult; -import com.android.server.status.IconData; -import com.android.server.status.StatusBarService; +import com.android.server.status.StatusBarManagerService; import org.xmlpull.v1.XmlPullParserException; @@ -110,9 +109,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub final Context mContext; final Handler mHandler; final SettingsObserver mSettingsObserver; - final StatusBarService mStatusBar; - final IBinder mInputMethodIcon; - final IconData mInputMethodData; + final StatusBarManagerService mStatusBar; final IWindowManager mIWindowManager; final HandlerCaller mCaller; @@ -447,7 +444,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } - public InputMethodManagerService(Context context, StatusBarService statusBar) { + public InputMethodManagerService(Context context, StatusBarManagerService statusBar) { mContext = context; mHandler = new Handler(this); mIWindowManager = IWindowManager.Stub.asInterface( @@ -508,9 +505,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } mStatusBar = statusBar; - mInputMethodData = IconData.makeIcon("ime", null, 0, 0, 0); - mInputMethodIcon = statusBar.addIcon(mInputMethodData, null); - statusBar.setIconVisibility(mInputMethodIcon, false); + statusBar.setIconVisibility("ime", false); mSettingsObserver = new SettingsObserver(mHandler); updateFromSettingsLocked(); @@ -912,7 +907,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mEnabledSession = null; mCurMethod = null; } - mStatusBar.setIconVisibility(mInputMethodIcon, false); + mStatusBar.setIconVisibility("ime", false); } public void onServiceDisconnected(ComponentName name) { @@ -946,13 +941,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub synchronized (mMethodMap) { if (iconId == 0) { if (DEBUG) Slog.d(TAG, "hide the small icon for the input method"); - mStatusBar.setIconVisibility(mInputMethodIcon, false); + mStatusBar.setIconVisibility("ime", false); } else if (packageName != null) { if (DEBUG) Slog.d(TAG, "show a small icon for the input method"); - mInputMethodData.iconId = iconId; - mInputMethodData.iconPackage = packageName; - mStatusBar.updateIcon(mInputMethodIcon, mInputMethodData, null); - mStatusBar.setIconVisibility(mInputMethodIcon, true); + mStatusBar.setIcon("ime", packageName, iconId, 0); + mStatusBar.setIconVisibility("ime", true); } } } finally { @@ -1734,8 +1727,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub p.println(" sessionRequested=" + ci.sessionRequested); p.println(" curSession=" + ci.curSession); } - p.println(" mInputMethodIcon=" + mInputMethodIcon); - p.println(" mInputMethodData=" + mInputMethodData); p.println(" mCurMethodId=" + mCurMethodId); client = mCurClient; p.println(" mCurClient=" + client + " mCurSeq=" + mCurSeq); diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java index 73d17ea7d22d..ac3b23bb86c0 100755 --- a/services/java/com/android/server/NotificationManagerService.java +++ b/services/java/com/android/server/NotificationManagerService.java @@ -16,9 +16,8 @@ package com.android.server; -import com.android.server.status.IconData; -import com.android.server.status.NotificationData; -import com.android.server.status.StatusBarService; +import com.android.internal.statusbar.StatusBarNotification; +import com.android.server.status.StatusBarManagerService; import android.app.ActivityManagerNative; import android.app.IActivityManager; @@ -86,7 +85,7 @@ class NotificationManagerService extends INotificationManager.Stub final IBinder mForegroundToken = new Binder(); private WorkerHandler mHandler; - private StatusBarService mStatusBarService; + private StatusBarManagerService mStatusBar; private LightsService mLightsService; private LightsService.Light mBatteryLight; private LightsService.Light mNotificationLight; @@ -238,8 +237,8 @@ class NotificationManagerService extends INotificationManager.Stub } } - private StatusBarService.NotificationCallbacks mNotificationCallbacks - = new StatusBarService.NotificationCallbacks() { + private StatusBarManagerService.NotificationCallbacks mNotificationCallbacks + = new StatusBarManagerService.NotificationCallbacks() { public void onSetDisabled(int status) { synchronized (mNotificationList) { @@ -405,7 +404,7 @@ class NotificationManagerService extends INotificationManager.Stub } } - NotificationManagerService(Context context, StatusBarService statusBar, + NotificationManagerService(Context context, StatusBarManagerService statusBar, LightsService lights) { super(); @@ -417,7 +416,7 @@ class NotificationManagerService extends INotificationManager.Stub mToastQueue = new ArrayList<ToastRecord>(); mHandler = new WorkerHandler(); - mStatusBarService = statusBar; + mStatusBar = statusBar; statusBar.setNotificationCallbacks(mNotificationCallbacks); mBatteryLight = lights.getLight(LightsService.LIGHT_ID_BATTERY); @@ -705,36 +704,12 @@ class NotificationManagerService extends INotificationManager.Stub } if (notification.icon != 0) { - IconData icon = IconData.makeIcon(null, pkg, notification.icon, - notification.iconLevel, - notification.number); - CharSequence truncatedTicker = notification.tickerText; - - // TODO: make this restriction do something smarter like never fill - // more than two screens. "Why would anyone need more than 80 characters." :-/ - final int maxTickerLen = 80; - if (truncatedTicker != null && truncatedTicker.length() > maxTickerLen) { - truncatedTicker = truncatedTicker.subSequence(0, maxTickerLen); - } - - NotificationData n = new NotificationData(); - n.pkg = pkg; - n.tag = tag; - n.id = id; - n.when = notification.when; - n.tickerText = truncatedTicker; - n.ongoingEvent = (notification.flags & Notification.FLAG_ONGOING_EVENT) != 0; - if (!n.ongoingEvent && (notification.flags & Notification.FLAG_NO_CLEAR) == 0) { - n.clearable = true; - } - n.contentView = notification.contentView; - n.contentIntent = notification.contentIntent; - n.deleteIntent = notification.deleteIntent; + StatusBarNotification n = new StatusBarNotification(pkg, id, tag, notification); if (old != null && old.statusBarKey != null) { r.statusBarKey = old.statusBarKey; long identity = Binder.clearCallingIdentity(); try { - mStatusBarService.updateIcon(r.statusBarKey, icon, n); + mStatusBar.updateNotification(r.statusBarKey, n); } finally { Binder.restoreCallingIdentity(identity); @@ -742,21 +717,19 @@ class NotificationManagerService extends INotificationManager.Stub } else { long identity = Binder.clearCallingIdentity(); try { - r.statusBarKey = mStatusBarService.addIcon(icon, n); + r.statusBarKey = mStatusBar.addNotification(n); mAttentionLight.pulse(); } finally { Binder.restoreCallingIdentity(identity); } } - sendAccessibilityEvent(notification, pkg); - } else { if (old != null && old.statusBarKey != null) { long identity = Binder.clearCallingIdentity(); try { - mStatusBarService.removeIcon(old.statusBarKey); + mStatusBar.removeNotification(old.statusBarKey); } finally { Binder.restoreCallingIdentity(identity); @@ -864,7 +837,7 @@ class NotificationManagerService extends INotificationManager.Stub if (r.notification.icon != 0) { long identity = Binder.clearCallingIdentity(); try { - mStatusBarService.removeIcon(r.statusBarKey); + mStatusBar.removeNotification(r.statusBarKey); } finally { Binder.restoreCallingIdentity(identity); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 9d5d035b083a..4307cdc9128d 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -17,7 +17,7 @@ package com.android.server; import com.android.server.am.ActivityManagerService; -import com.android.server.status.StatusBarService; +import com.android.server.status.StatusBarManagerService; import com.android.internal.os.BinderInternal; import com.android.internal.os.SamplingProfilerIntegration; @@ -206,7 +206,7 @@ class ServerThread extends Thread { } DevicePolicyManagerService devicePolicy = null; - StatusBarService statusBar = null; + StatusBarManagerService statusBar = null; InputMethodManagerService imm = null; AppWidgetService appWidget = null; NotificationManagerService notification = null; @@ -224,10 +224,10 @@ class ServerThread extends Thread { try { Slog.i(TAG, "Status Bar"); - statusBar = new StatusBarService(context); + statusBar = new StatusBarManagerService(context); ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar); } catch (Throwable e) { - Slog.e(TAG, "Failure starting StatusBarService", e); + Slog.e(TAG, "Failure starting StatusBarManagerService", e); } try { @@ -405,12 +405,6 @@ class ServerThread extends Thread { } try { - com.android.server.status.StatusBarPolicy.installIcons(context, statusBar); - } catch (Throwable e) { - Slog.e(TAG, "Failure installing status bar icons", e); - } - - try { Slog.i(TAG, "DiskStats Service"); ServiceManager.addService("diskstats", new DiskStatsService(context)); } catch (Throwable e) { @@ -464,6 +458,7 @@ class ServerThread extends Thread { } // These are needed to propagate to the runnable below. + final StatusBarManagerService statusBarF = statusBar; final BatteryService batteryF = battery; final ConnectivityService connectivityF = connectivity; final DockObserver dockF = dock; @@ -485,6 +480,7 @@ class ServerThread extends Thread { public void run() { Slog.i(TAG, "Making services ready"); + if (statusBarF != null) statusBarF.systemReady2(); if (batteryF != null) batteryF.systemReady(); if (connectivityF != null) connectivityF.systemReady(); if (dockF != null) dockF.systemReady(); diff --git a/services/java/com/android/server/UiModeManagerService.java b/services/java/com/android/server/UiModeManagerService.java index 3606629d84a7..9493161ca5dd 100644 --- a/services/java/com/android/server/UiModeManagerService.java +++ b/services/java/com/android/server/UiModeManagerService.java @@ -545,7 +545,7 @@ class UiModeManagerService extends IUiModeManager.Stub { mStatusBarManager = (StatusBarManager) mContext.getSystemService(Context.STATUS_BAR_SERVICE); } - // Fear not: StatusBarService manages a list of requests to disable + // Fear not: StatusBarManagerService manages a list of requests to disable // features of the status bar; these are ORed together to form the // active disabled list. So if (for example) the device is locked and // the status bar should be totally disabled, the calls below will diff --git a/services/java/com/android/server/status/IconData.java b/services/java/com/android/server/status/IconData.java deleted file mode 100644 index fd226f9e60d8..000000000000 --- a/services/java/com/android/server/status/IconData.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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.server.status; - -import android.util.Slog; - -public class IconData { - /** - * Indicates ths item represents a piece of text. - */ - public static final int TEXT = 1; - - /** - * Indicates ths item represents an icon. - */ - public static final int ICON = 2; - - /** - * The type of this item. One of TEXT, ICON, or LEVEL_ICON. - */ - public int type; - - /** - * The slot that this icon will be in if it is not a notification - */ - public String slot; - - /** - * The package containting the icon to draw for this item. Valid if this is - * an ICON type. - */ - public String iconPackage; - - /** - * The icon to draw for this item. Valid if this is an ICON type. - */ - public int iconId; - - /** - * The level associated with the icon. Valid if this is a LEVEL_ICON type. - */ - public int iconLevel; - - /** - * The "count" number. - */ - public int number; - - /** - * The text associated with the icon. Valid if this is a TEXT type. - */ - public CharSequence text; - - private IconData() { - } - - public static IconData makeIcon(String slot, - String iconPackage, int iconId, int iconLevel, int number) { - IconData data = new IconData(); - data.type = ICON; - data.slot = slot; - data.iconPackage = iconPackage; - data.iconId = iconId; - data.iconLevel = iconLevel; - data.number = number; - return data; - } - - public static IconData makeText(String slot, CharSequence text) { - IconData data = new IconData(); - data.type = TEXT; - data.slot = slot; - data.text = text; - return data; - } - - public void copyFrom(IconData that) { - this.type = that.type; - this.slot = that.slot; - this.iconPackage = that.iconPackage; - this.iconId = that.iconId; - this.iconLevel = that.iconLevel; - this.number = that.number; - this.text = that.text; // should we clone this? - } - - public IconData clone() { - IconData that = new IconData(); - that.copyFrom(this); - return that; - } - - public String toString() { - if (this.type == TEXT) { - return "IconData(slot=" + (this.slot != null ? "'" + this.slot + "'" : "null") - + " text='" + this.text + "')"; - } - else if (this.type == ICON) { - return "IconData(slot=" + (this.slot != null ? "'" + this.slot + "'" : "null") - + " package=" + this.iconPackage - + " iconId=" + Integer.toHexString(this.iconId) - + " iconLevel=" + this.iconLevel + ")"; - } - else { - return "IconData(type=" + type + ")"; - } - } -} diff --git a/services/java/com/android/server/status/NotificationData.java b/services/java/com/android/server/status/NotificationData.java deleted file mode 100644 index 71f01cab2f0f..000000000000 --- a/services/java/com/android/server/status/NotificationData.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.server.status; - -import android.app.PendingIntent; -import android.widget.RemoteViews; - -public class NotificationData { - public String pkg; - public String tag; - public int id; - public CharSequence tickerText; - - public long when; - public boolean ongoingEvent; - public boolean clearable; - - public RemoteViews contentView; - public PendingIntent contentIntent; - - public PendingIntent deleteIntent; - - public String toString() { - return "NotificationData(package=" + pkg + " id=" + id + " tickerText=" + tickerText - + " ongoingEvent=" + ongoingEvent + " contentIntent=" + contentIntent - + " deleteIntent=" + deleteIntent - + " clearable=" + clearable - + " contentView=" + contentView + " when=" + when + ")"; - } -} diff --git a/services/java/com/android/server/status/NotificationViewList.java b/services/java/com/android/server/status/NotificationViewList.java deleted file mode 100644 index 1bb56a735c04..000000000000 --- a/services/java/com/android/server/status/NotificationViewList.java +++ /dev/null @@ -1,276 +0,0 @@ -/* - * 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.server.status; - -import android.os.IBinder; -import android.util.Slog; -import android.view.View; -import java.util.ArrayList; - -class NotificationViewList { - private ArrayList<StatusBarNotification> mOngoing = new ArrayList(); - private ArrayList<StatusBarNotification> mLatest = new ArrayList(); - - NotificationViewList() { - } - - private static final int indexInList(ArrayList<StatusBarNotification> list, NotificationData n){ - final int N = list.size(); - for (int i=0; i<N; i++) { - StatusBarNotification that = list.get(i); - if (that.data == n) { - return i; - } - } - return -1; - } - - int getIconIndex(NotificationData n) { - final int ongoingSize = mOngoing.size(); - final int latestSize = mLatest.size(); - if (n.ongoingEvent) { - int index = indexInList(mOngoing, n); - if (index >= 0) { - return latestSize + index + 1; - } else { - return -1; - } - } else { - return indexInList(mLatest, n) + 1; - } - } - - void remove(StatusBarNotification notification) { - NotificationData n = notification.data; - int index; - index = indexInList(mOngoing, n); - if (index >= 0) { - mOngoing.remove(index); - return; - } - index = indexInList(mLatest, n); - if (index >= 0) { - mLatest.remove(index); - return; - } - } - - ArrayList<StatusBarNotification> notificationsForPackage(String packageName) { - ArrayList<StatusBarNotification> list = new ArrayList<StatusBarNotification>(); - int N = mOngoing.size(); - for (int i=0; i<N; i++) { - if (matchPackage(mOngoing.get(i), packageName)) { - list.add(mOngoing.get(i)); - } - } - N = mLatest.size(); - for (int i=0; i<N; i++) { - if (matchPackage(mLatest.get(i), packageName)) { - list.add(mLatest.get(i)); - } - } - return list; - } - - private final boolean matchPackage(StatusBarNotification snb, String packageName) { - if (snb.data.contentIntent != null) { - if (snb.data.contentIntent.getTargetPackage().equals(packageName)) { - return true; - } - } else if (snb.data.pkg != null && snb.data.pkg.equals(packageName)) { - return true; - } - return false; - } - - private static final int indexForKey(ArrayList<StatusBarNotification> list, IBinder key) { - final int N = list.size(); - for (int i=0; i<N; i++) { - if (list.get(i).key == key) { - return i; - } - } - return -1; - } - - StatusBarNotification get(IBinder key) { - int index; - index = indexForKey(mOngoing, key); - if (index >= 0) { - return mOngoing.get(index); - } - index = indexForKey(mLatest, key); - if (index >= 0) { - return mLatest.get(index); - } - return null; - } - - // gets the index of the notification's view in its expanded parent view - int getExpandedIndex(StatusBarNotification notification) { - ArrayList<StatusBarNotification> list = notification.data.ongoingEvent ? mOngoing : mLatest; - final IBinder key = notification.key; - int index = 0; - // (the view order is backwards from this list order) - for (int i=list.size()-1; i>=0; i--) { - StatusBarNotification item = list.get(i); - if (item.key == key) { - return index; - } - if (item.view != null) { - index++; - } - } - Slog.e(StatusBarService.TAG, "Couldn't find notification in NotificationViewList."); - Slog.e(StatusBarService.TAG, "notification=" + notification); - dump(notification); - return 0; - } - - void clearViews() { - int N = mOngoing.size(); - for (int i=0; i<N; i++) { - mOngoing.get(i).view = null; - } - N = mLatest.size(); - for (int i=0; i<N; i++) { - mLatest.get(i).view = null; - } - } - - int ongoingCount() { - return mOngoing.size(); - } - - int latestCount() { - return mLatest.size(); - } - - StatusBarNotification getOngoing(int index) { - return mOngoing.get(index); - } - - StatusBarNotification getLatest(int index) { - return mLatest.get(index); - } - - int size() { - return mOngoing.size() + mLatest.size(); - } - - void add(StatusBarNotification notification) { - if (StatusBarService.SPEW) { - Slog.d(StatusBarService.TAG, "before add NotificationViewList" - + " notification.data.ongoingEvent=" + notification.data.ongoingEvent); - dump(notification); - } - - ArrayList<StatusBarNotification> list = notification.data.ongoingEvent ? mOngoing : mLatest; - long when = notification.data.when; - final int N = list.size(); - int index = N; - for (int i=0; i<N; i++) { - StatusBarNotification that = list.get(i); - if (that.data.when > when) { - index = i; - break; - } - } - list.add(index, notification); - - if (StatusBarService.SPEW) { - Slog.d(StatusBarService.TAG, "after add NotificationViewList index=" + index); - dump(notification); - } - } - - void dump(StatusBarNotification notification) { - if (StatusBarService.SPEW) { - boolean showTime = false; - String s = ""; - for (int i=0; i<mOngoing.size(); i++) { - StatusBarNotification that = mOngoing.get(i); - if (that.key == notification.key) { - s += "["; - } - if (showTime) { - s += that.data.when; - } else { - s += that.data.pkg + "/" + that.data.id + "/" + that.view; - } - if (that.key == notification.key) { - s += "]"; - } - s += " "; - } - Slog.d(StatusBarService.TAG, "NotificationViewList ongoing: " + s); - - s = ""; - for (int i=0; i<mLatest.size(); i++) { - StatusBarNotification that = mLatest.get(i); - if (that.key == notification.key) { - s += "["; - } - if (showTime) { - s += that.data.when; - } else { - s += that.data.pkg + "/" + that.data.id + "/" + that.view; - } - if (that.key == notification.key) { - s += "]"; - } - s += " "; - } - Slog.d(StatusBarService.TAG, "NotificationViewList latest: " + s); - } - } - - StatusBarNotification get(View view) { - int N = mOngoing.size(); - for (int i=0; i<N; i++) { - StatusBarNotification notification = mOngoing.get(i); - View v = notification.view; - if (v == view) { - return notification; - } - } - N = mLatest.size(); - for (int i=0; i<N; i++) { - StatusBarNotification notification = mLatest.get(i); - View v = notification.view; - if (v == view) { - return notification; - } - } - return null; - } - - void update(StatusBarNotification notification) { - remove(notification); - add(notification); - } - - boolean hasClearableItems() { - int N = mLatest.size(); - for (int i=0; i<N; i++) { - if (mLatest.get(i).data.clearable) { - return true; - } - } - return false; - } -} diff --git a/services/java/com/android/server/status/StatusBarIcon.java b/services/java/com/android/server/status/StatusBarIcon.java deleted file mode 100644 index f77b550a433f..000000000000 --- a/services/java/com/android/server/status/StatusBarIcon.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * 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.server.status; - -import android.content.Context; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.graphics.Typeface; -import android.graphics.drawable.Drawable; -import android.text.TextUtils; -import android.util.Slog; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -class StatusBarIcon { - // TODO: get this from a resource - private static final int ICON_GAP = 8; - private static final int ICON_WIDTH = 25; - private static final int ICON_HEIGHT = 25; - - public View view; - - IconData mData; - - private TextView mTextView; - private AnimatedImageView mImageView; - private TextView mNumberView; - - public StatusBarIcon(Context context, IconData data, ViewGroup parent) { - mData = data.clone(); - - switch (data.type) { - case IconData.TEXT: { - TextView t; - t = new TextView(context, null, com.android.internal.R.style.TextAppearance_StatusBar_Icon); - mTextView = t; - LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.MATCH_PARENT); - t.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); - t.setPadding(6, 0, 0, 0); - t.setLayoutParams(layoutParams); - t.setText(data.text); - this.view = t; - break; - } - - case IconData.ICON: { - // container - LayoutInflater inflater = (LayoutInflater)context.getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - View v = inflater.inflate(com.android.internal.R.layout.status_bar_icon, parent, false); - this.view = v; - - // icon - AnimatedImageView im = (AnimatedImageView)v.findViewById(com.android.internal.R.id.image); - im.setImageDrawable(getIcon(context, data)); - im.setImageLevel(data.iconLevel); - mImageView = im; - - // number - TextView nv = (TextView)v.findViewById(com.android.internal.R.id.number); - mNumberView = nv; - if (data.number > 0) { - nv.setText("" + data.number); - nv.setVisibility(View.VISIBLE); - } else { - nv.setVisibility(View.GONE); - } - break; - } - } - } - - public void update(Context context, IconData data) throws StatusBarException { - if (mData.type != data.type) { - throw new StatusBarException("status bar entry type can't change"); - } - switch (data.type) { - case IconData.TEXT: - if (!TextUtils.equals(mData.text, data.text)) { - TextView tv = mTextView; - tv.setText(data.text); - } - break; - case IconData.ICON: - if (((mData.iconPackage != null && data.iconPackage != null) - && !mData.iconPackage.equals(data.iconPackage)) - || mData.iconId != data.iconId - || mData.iconLevel != data.iconLevel) { - ImageView im = mImageView; - im.setImageDrawable(getIcon(context, data)); - im.setImageLevel(data.iconLevel); - } - if (mData.number != data.number) { - TextView nv = mNumberView; - if (data.number > 0) { - nv.setText("" + data.number); - } else { - nv.setText(""); - } - } - break; - } - mData.copyFrom(data); - } - - public void update(int number) { - if (mData.number != number) { - TextView nv = mNumberView; - if (number > 0) { - nv.setText("" + number); - } else { - nv.setText(""); - } - } - mData.number = number; - } - - - /** - * Returns the right icon to use for this item, respecting the iconId and - * iconPackage (if set) - * - * @param context Context to use to get resources if iconPackage is not set - * @return Drawable for this item, or null if the package or item could not - * be found - */ - static Drawable getIcon(Context context, IconData data) { - - Resources r = null; - - if (data.iconPackage != null) { - try { - r = context.getPackageManager().getResourcesForApplication(data.iconPackage); - } catch (PackageManager.NameNotFoundException ex) { - Slog.e(StatusBarService.TAG, "Icon package not found: " + data.iconPackage, ex); - return null; - } - } else { - r = context.getResources(); - } - - if (data.iconId == 0) { - Slog.w(StatusBarService.TAG, "No icon ID for slot " + data.slot); - return null; - } - - try { - return r.getDrawable(data.iconId); - } catch (RuntimeException e) { - Slog.w(StatusBarService.TAG, "Icon not found in " - + (data.iconPackage != null ? data.iconId : "<system>") - + ": " + Integer.toHexString(data.iconId)); - } - - return null; - } - - int getNumber() { - return mData.number; - } -} - diff --git a/services/java/com/android/server/status/StatusBarManagerService.java b/services/java/com/android/server/status/StatusBarManagerService.java new file mode 100644 index 000000000000..0af1ebb44b70 --- /dev/null +++ b/services/java/com/android/server/status/StatusBarManagerService.java @@ -0,0 +1,465 @@ +/* + * 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. + */ + +package com.android.server.status; + +import android.app.PendingIntent; +import android.app.StatusBarManager; +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.net.Uri; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.Binder; +import android.os.Handler; +import android.os.SystemClock; +import android.util.Slog; + +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 java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * A note on locking: We rely on the fact that calls onto mBar are oneway or + * if they are local, that they just enqueue messages to not deadlock. + */ +public class StatusBarManagerService extends IStatusBarService.Stub +{ + static final String TAG = "StatusBarManagerService"; + static final boolean SPEW = true; + + public static final String ACTION_STATUSBAR_START + = "com.android.internal.policy.statusbar.START"; + + final Context mContext; + Handler mHandler = new Handler(); + NotificationCallbacks mNotificationCallbacks; + volatile IStatusBar mBar; + StatusBarIconList mIcons = new StatusBarIconList(); + HashMap<IBinder,StatusBarNotification> mNotifications + = new HashMap<IBinder,StatusBarNotification>(); + + // for disabling the status bar + ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>(); + int mDisabled = 0; + + private class DisableRecord implements IBinder.DeathRecipient { + String pkg; + int what; + IBinder token; + + public void binderDied() { + Slog.i(TAG, "binder died for pkg=" + pkg); + disable(0, token, pkg); + token.unlinkToDeath(this, 0); + } + } + + public interface NotificationCallbacks { + void onSetDisabled(int status); + void onClearAll(); + void onNotificationClick(String pkg, String tag, int id); + void onPanelRevealed(); + } + + /** + * Construct the service, add the status bar view to the window manager + */ + public StatusBarManagerService(Context context) { + mContext = context; + + final Resources res = context.getResources(); + mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.status_bar_icon_order)); + } + + public void setNotificationCallbacks(NotificationCallbacks listener) { + mNotificationCallbacks = listener; + } + + // ================================================================================ + // Constructing the view + // ================================================================================ + + public void systemReady() { + } + + public void systemReady2() { + // Start the status bar app + Intent intent = new Intent(ACTION_STATUSBAR_START); + mContext.sendBroadcast(intent /** permission **/); + } + + // ================================================================================ + // From IStatusBarService + // ================================================================================ + public void expand() { + enforceExpandStatusBar(); + + if (mBar != null) { + try { + mBar.animateExpand(); + } catch (RemoteException ex) { + } + } + } + + public void collapse() { + enforceExpandStatusBar(); + + if (mBar != null) { + try { + mBar.animateCollapse(); + } catch (RemoteException ex) { + } + } + } + + public void disable(int what, IBinder token, String pkg) { + enforceStatusBar(); + + // It's important that the the callback and the call to mBar get done + // in the same order when multiple threads are calling this function + // so they are paired correctly. The messages on the handler will be + // handled in the order they were enqueued, but will be outside the lock. + synchronized (mDisableRecords) { + manageDisableListLocked(what, token, pkg); + final int net = gatherDisableActionsLocked(); + Slog.d(TAG, "disable... net=0x" + Integer.toHexString(net)); + if (net != mDisabled) { + mDisabled = net; + mHandler.post(new Runnable() { + public void run() { + mNotificationCallbacks.onSetDisabled(net); + } + }); + if (mBar != null) { + try { + mBar.disable(net); + } catch (RemoteException ex) { + } + } + } + } + } + + public void setIcon(String slot, String iconPackage, int iconId, int iconLevel) { + enforceStatusBar(); + + synchronized (mIcons) { + int index = mIcons.getSlotIndex(slot); + if (index < 0) { + throw new SecurityException("invalid status bar icon slot: " + slot); + } + + StatusBarIcon icon = new StatusBarIcon(iconPackage, iconId, iconLevel); + //Slog.d(TAG, "setIcon slot=" + slot + " index=" + index + " icon=" + icon); + mIcons.setIcon(index, icon); + + if (mBar != null) { + try { + mBar.setIcon(index, icon); + } catch (RemoteException ex) { + } + } + } + } + + public void setIconVisibility(String slot, boolean visible) { + enforceStatusBar(); + + synchronized (mIcons) { + int index = mIcons.getSlotIndex(slot); + if (index < 0) { + throw new SecurityException("invalid status bar icon slot: " + slot); + } + + StatusBarIcon icon = mIcons.getIcon(index); + if (icon == null) { + return; + } + + if (icon.visible != visible) { + icon.visible = visible; + + if (mBar != null) { + try { + mBar.setIcon(index, icon); + } catch (RemoteException ex) { + } + } + } + } + } + + public void removeIcon(String slot) { + enforceStatusBar(); + + synchronized (mIcons) { + int index = mIcons.getSlotIndex(slot); + if (index < 0) { + throw new SecurityException("invalid status bar icon slot: " + slot); + } + + mIcons.removeIcon(index); + + if (mBar != null) { + try { + mBar.removeIcon(index); + } catch (RemoteException ex) { + } + } + } + } + + private void enforceStatusBar() { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR, + "StatusBarManagerService"); + } + + private void enforceExpandStatusBar() { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.EXPAND_STATUS_BAR, + "StatusBarManagerService"); + } + + + // ================================================================================ + // Callbacks from the status bar service. + // ================================================================================ + public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList, + List<IBinder> notificationKeys, List<StatusBarNotification> notifications) { + Slog.i(TAG, "registerStatusBar bar=" + bar); + mBar = bar; + synchronized (mIcons) { + iconList.copyFrom(mIcons); + } + synchronized (mNotifications) { + for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) { + notificationKeys.add(e.getKey()); + notifications.add(e.getValue()); + } + } + } + + /** + * The status bar service should call this when the user changes whether + * the status bar is visible or not. + */ + public void visibilityChanged(boolean visible) { + //Slog.d(TAG, "visibilityChanged visible=" + visible); + } + + public void onNotificationClick(String pkg, String tag, int id) { + mNotificationCallbacks.onNotificationClick(pkg, tag, id); + } + + public void onClearAllNotifications() { + mNotificationCallbacks.onClearAll(); + } + + // ================================================================================ + // Callbacks for NotificationManagerService. + // ================================================================================ + public IBinder addNotification(StatusBarNotification notification) { + synchronized (mNotifications) { + IBinder key = new Binder(); + mNotifications.put(key, notification); + if (mBar != null) { + try { + mBar.addNotification(key, notification); + } catch (RemoteException ex) { + } + } + return key; + } + } + + public void updateNotification(IBinder key, StatusBarNotification notification) { + synchronized (mNotifications) { + if (!mNotifications.containsKey(key)) { + throw new IllegalArgumentException("updateNotification key not found: " + key); + } + mNotifications.put(key, notification); + if (mBar != null) { + try { + mBar.updateNotification(key, notification); + } catch (RemoteException ex) { + } + } + } + } + + public void removeNotification(IBinder key) { + synchronized (mNotifications) { + final StatusBarNotification n = mNotifications.remove(key); + if (n == null) { + throw new IllegalArgumentException("removeNotification key not found: " + key); + } + if (mBar != null) { + try { + mBar.removeNotification(key); + } catch (RemoteException ex) { + } + } + } + } + + // ================================================================================ + // Can be called from any thread + // ================================================================================ + + // lock on mDisableRecords + void manageDisableListLocked(int what, IBinder token, String pkg) { + if (SPEW) { + Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what) + " pkg=" + pkg); + } + // update the list + synchronized (mDisableRecords) { + final int N = mDisableRecords.size(); + DisableRecord tok = null; + int i; + for (i=0; i<N; i++) { + DisableRecord t = mDisableRecords.get(i); + if (t.token == token) { + tok = t; + break; + } + } + if (what == 0 || !token.isBinderAlive()) { + if (tok != null) { + mDisableRecords.remove(i); + tok.token.unlinkToDeath(tok, 0); + } + } else { + if (tok == null) { + tok = new DisableRecord(); + try { + token.linkToDeath(tok, 0); + } + catch (RemoteException ex) { + return; // give up + } + mDisableRecords.add(tok); + } + tok.what = what; + tok.token = token; + tok.pkg = pkg; + } + } + } + + // lock on mDisableRecords + int gatherDisableActionsLocked() { + final int N = mDisableRecords.size(); + // gather the new net flags + int net = 0; + for (int i=0; i<N; i++) { + net |= mDisableRecords.get(i).what; + } + return net; + } + + // ================================================================================ + // Always called from UI thread + // ================================================================================ + + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (mContext.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; + } + + synchronized (mIcons) { + mIcons.dump(pw); + } + + synchronized (mNotifications) { + int i=0; + pw.println("Notification list:"); + for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) { + pw.printf(" %2d: %s\n", i, e.getValue().toString()); + i++; + } + } + + synchronized (mDisableRecords) { + final int N = mDisableRecords.size(); + pw.println(" mDisableRecords.size=" + N + + " mDisabled=0x" + Integer.toHexString(mDisabled)); + for (int i=0; i<N; i++) { + DisableRecord tok = mDisableRecords.get(i); + pw.println(" [" + i + "] what=0x" + Integer.toHexString(tok.what) + + " pkg=" + tok.pkg + " token=" + tok.token); + } + } + } + + /** + * The LEDs are turned o)ff when the notification panel is shown, even just a little bit. + * This was added last-minute and is inconsistent with the way the rest of the notifications + * are handled, because the notification isn't really cancelled. The lights are just + * turned off. If any other notifications happen, the lights will turn back on. Steve says + * this is what he wants. (see bug 1131461) + */ + private boolean mPanelSlightlyVisible; + void panelSlightlyVisible(boolean visible) { + if (mPanelSlightlyVisible != visible) { + mPanelSlightlyVisible = visible; + if (visible) { + // tell the notification manager to turn off the lights. + mNotificationCallbacks.onPanelRevealed(); + } + } + } + + private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) + || Intent.ACTION_SCREEN_OFF.equals(action)) { + collapse(); + } + /* + else if (Telephony.Intents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { + updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false), + intent.getStringExtra(Telephony.Intents.EXTRA_SPN), + intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false), + intent.getStringExtra(Telephony.Intents.EXTRA_PLMN)); + } + else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { + updateResources(); + } + */ + } + }; + +} diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java index e7a09d13dec0..3602fecfd84e 100644 --- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java +++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java @@ -21,6 +21,7 @@ import android.app.PendingIntent; import android.widget.ArrayAdapter; import android.view.View; import android.widget.ListView; +import android.content.Context; import android.content.ContentResolver; import android.content.Intent; import android.app.Notification; @@ -60,7 +61,7 @@ public class NotificationTestList extends TestActivity private Test[] mTests = new Test[] { new Test("Off and sound") { public void run() { - PowerManager pm = (PowerManager)NotificationTestList.this.getSystemService("power"); + PowerManager pm = (PowerManager)NotificationTestList.this.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "sound"); wl.acquire(); @@ -121,6 +122,16 @@ public class NotificationTestList extends TestActivity } }, + new Test("Bad Icon") { + public void run() { + mNM.notify(1, new Notification(NotificationTestList.this, + R.layout.chrono_notification, /* not a drawable! */ + null, System.currentTimeMillis()-(1000*60*60*24), + "(453) 123-2328", + "", null)); + } + }, + new Test("Bad resource #2") { public void run() { @@ -180,7 +191,7 @@ public class NotificationTestList extends TestActivity R.drawable.icon4, null, System.currentTimeMillis(), "Stress - Latest", "Notify me!!!", null); - n.flags |= Notification.FLAG_ONGOING_EVENT; + //n.flags |= Notification.FLAG_ONGOING_EVENT; mNM.notify(1, n); } } @@ -599,7 +610,7 @@ public class NotificationTestList extends TestActivity public void run() { PowerManager.WakeLock wl - = ((PowerManager)NotificationTestList.this.getSystemService("power")) + = ((PowerManager)NotificationTestList.this.getSystemService(Context.POWER_SERVICE)) .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "crasher"); wl.acquire(); mHandler.postDelayed(new Runnable() { @@ -622,9 +633,7 @@ public class NotificationTestList extends TestActivity private PendingIntent makeIntent() { Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setComponent(new android.content.ComponentName( - "com.android.contacts", - "com.android.contacts.ContactsActivity")); + intent.addCategory(Intent.CATEGORY_HOME); return PendingIntent.getActivity(this, 0, intent, 0); } diff --git a/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java index 06506fb03cc7..3532e3020c4e 100644 --- a/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java +++ b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java @@ -134,13 +134,9 @@ public class StatusBarTest extends TestActivity }, 3000); } }, - new Test("Expand in 3 sec.") { + new Test("Expand") { public void run() { - mHandler.postDelayed(new Runnable() { - public void run() { - mStatusBarManager.expand(); - } - }, 3000); + mStatusBarManager.expand(); } }, new Test("Expand in 3 sec.") { @@ -161,14 +157,5 @@ public class StatusBarTest extends TestActivity }, 3000); } }, - new Test("Toggle in 3 sec.") { - public void run() { - mHandler.postDelayed(new Runnable() { - public void run() { - mStatusBarManager.toggle(); - } - }, 3000); - } - }, }; } |