summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt37
-rw-r--r--core/java/android/app/ActivityManagerNative.java19
-rw-r--r--core/java/android/app/ActivityThread.java18
-rw-r--r--core/java/android/app/IActivityManager.java8
-rw-r--r--core/java/android/app/TaskStackBuilder.java26
-rw-r--r--core/java/android/appwidget/AppWidgetHost.java2
-rw-r--r--core/java/android/content/ContentResolver.java22
-rw-r--r--core/java/android/content/ContentService.java150
-rw-r--r--core/java/android/content/IContentService.aidl22
-rw-r--r--core/java/android/os/IUserManager.aidl1
-rw-r--r--core/java/android/os/UserManager.java16
-rw-r--r--core/java/android/text/format/DateFormat.java63
-rwxr-xr-xcore/java/android/util/PropertyValueModel.java143
-rwxr-xr-xcore/java/android/util/ValueModel.java74
-rw-r--r--core/java/android/view/GLES20Canvas.java2
-rw-r--r--core/java/android/view/GLES20RenderLayer.java18
-rw-r--r--core/java/android/view/GLES20TextureLayer.java3
-rw-r--r--core/java/android/view/HardwareLayer.java3
-rw-r--r--core/java/android/view/HardwareRenderer.java22
-rw-r--r--core/java/android/view/View.java7
-rw-r--r--core/java/android/view/ViewRootImpl.java1
-rw-r--r--core/java/android/widget/CheckBox.java23
-rw-r--r--core/java/android/widget/EditText.java23
-rw-r--r--core/java/android/widget/Editor.java14
-rw-r--r--core/java/android/widget/SeekBar.java20
-rwxr-xr-xcore/java/android/widget/ValueEditor.java53
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp18
-rw-r--r--core/res/res/layout/keyguard_transport_control_view.xml1
-rw-r--r--core/tests/coretests/src/android/content/ObserverNodeTest.java18
-rw-r--r--libs/hwui/DisplayListRenderer.cpp19
-rw-r--r--libs/hwui/DisplayListRenderer.h13
-rw-r--r--libs/hwui/Layer.cpp19
-rw-r--r--libs/hwui/Layer.h16
-rw-r--r--libs/hwui/LayerCache.cpp11
-rw-r--r--libs/hwui/LayerRenderer.cpp10
-rw-r--r--libs/hwui/OpenGLRenderer.cpp7
-rw-r--r--libs/hwui/Program.h3
-rw-r--r--libs/hwui/ProgramCache.cpp91
-rw-r--r--libs/hwui/ResourceCache.cpp23
-rw-r--r--libs/hwui/ResourceCache.h6
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java8
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.pngbin1675 -> 1689 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_on.pngbin1676 -> 1688 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.pngbin2263 -> 1717 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_0.pngbin972 -> 985 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_100.pngbin657 -> 689 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_15.pngbin890 -> 885 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_28.pngbin869 -> 896 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_43.pngbin743 -> 895 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_57.pngbin833 -> 896 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_71.pngbin833 -> 916 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_85.pngbin841 -> 894 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_0.pngbin1455 -> 1449 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_100.pngbin1384 -> 1438 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_15.pngbin1594 -> 1640 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_28.pngbin1647 -> 1681 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_43.pngbin1538 -> 1667 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_57.pngbin1581 -> 1661 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_71.pngbin1613 -> 1672 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_85.pngbin1589 -> 1613 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_battery_unknown.pngbin1190 -> 1252 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.pngbin2018 -> 1997 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_on.pngbin1999 -> 1976 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.pngbin2475 -> 2363 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.pngbin2313 -> 2196 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_default_user.pngbin0 -> 5466 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_ime.pngbin1300 -> 1268 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_location.pngbin1958 -> 1911 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring.pngbin1495 -> 1490 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_rotation_locked.pngbin1693 -> 1632 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_settings.pngbin1500 -> 1477 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.pngbin965 -> 1010 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.pngbin1080 -> 1066 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.pngbin960 -> 962 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.pngbin1095 -> 1073 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.pngbin1125 -> 1067 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.pngbin1170 -> 1137 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.pngbin1027 -> 997 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.pngbin1101 -> 1094 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.pngbin652 -> 647 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.pngbin1075 -> 1082 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.pngbin971 -> 968 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.pngbin1088 -> 1096 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.pngbin1098 -> 1089 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.pngbin1178 -> 1151 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.pngbin1009 -> 1015 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.pngbin683 -> 664 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.pngbin862 -> 850 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.pngbin673 -> 665 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.pngbin0 -> 774 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.pngbin884 -> 842 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.pngbin654 -> 660 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.pngbin591 -> 616 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.pngbin795 -> 797 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.pngbin1117 -> 1104 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.pngbin573 -> 577 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.pngbin778 -> 775 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.pngbin1603 -> 1578 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.pngbin0 -> 1917 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.pngbin2028 -> 2048 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.pngbin2141 -> 2149 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.pngbin2200 -> 2169 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.pngbin1918 -> 1919 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.pngbin0 -> 2049 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.pngbin0 -> 2128 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.pngbin0 -> 2194 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.pngbin0 -> 1885 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.pngbin591 -> 616 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.pngbin795 -> 797 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.pngbin1686 -> 1628 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.pngbin575 -> 577 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.pngbin1164 -> 1190 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_on.pngbin1170 -> 1187 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.pngbin1425 -> 1225 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_0.pngbin780 -> 848 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_100.pngbin583 -> 625 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_15.pngbin679 -> 752 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_28.pngbin708 -> 807 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_43.pngbin635 -> 806 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_57.pngbin711 -> 793 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_71.pngbin674 -> 806 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_85.pngbin714 -> 797 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_0.pngbin1105 -> 1140 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_100.pngbin1080 -> 1112 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_15.pngbin1153 -> 1271 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_28.pngbin1209 -> 1345 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_43.pngbin1166 -> 1323 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_57.pngbin1237 -> 1296 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_71.pngbin1183 -> 1299 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_85.pngbin1167 -> 1262 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_battery_unknown.pngbin891 -> 932 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.pngbin1267 -> 1333 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_on.pngbin1291 -> 1334 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.pngbin1527 -> 1464 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.pngbin1459 -> 1418 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_default_user.pngbin0 -> 3668 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_ime.pngbin998 -> 983 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_location.pngbin1271 -> 1263 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring.pngbin1030 -> 1023 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_rotation_locked.pngbin1181 -> 1146 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_settings.pngbin1127 -> 1103 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.pngbin760 -> 833 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.pngbin852 -> 912 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.pngbin716 -> 731 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.pngbin875 -> 899 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.pngbin884 -> 907 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.pngbin800 -> 834 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.pngbin806 -> 824 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.pngbin787 -> 783 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.pngbin577 -> 580 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.pngbin844 -> 916 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.pngbin729 -> 724 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.pngbin878 -> 909 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.pngbin901 -> 910 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.pngbin809 -> 853 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.pngbin823 -> 834 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.pngbin597 -> 590 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.pngbin661 -> 669 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.pngbin565 -> 560 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.pngbin0 -> 636 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.pngbin657 -> 676 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.pngbin553 -> 550 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.pngbin517 -> 548 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.pngbin671 -> 682 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.pngbin829 -> 841 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.pngbin506 -> 532 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.pngbin617 -> 627 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.pngbin1125 -> 1098 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.pngbin0 -> 1221 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.pngbin1379 -> 1352 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.pngbin1432 -> 1425 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.pngbin1456 -> 1457 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.pngbin1257 -> 1219 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.pngbin0 -> 1350 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.pngbin0 -> 1437 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.pngbin0 -> 1477 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.pngbin0 -> 1205 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.pngbin514 -> 548 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.pngbin669 -> 682 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.pngbin1152 -> 1174 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.pngbin521 -> 532 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.pngbin2369 -> 2306 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_on.pngbin2357 -> 2299 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.pngbin3344 -> 2522 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_0.pngbin1136 -> 1097 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_100.pngbin685 -> 750 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_15.pngbin1008 -> 1000 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_28.pngbin966 -> 1016 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_43.pngbin918 -> 1022 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_57.pngbin949 -> 958 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_71.pngbin961 -> 1023 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_85.pngbin898 -> 1021 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_0.pngbin1733 -> 1748 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_100.pngbin1712 -> 1707 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_15.pngbin1963 -> 1991 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_28.pngbin2012 -> 2066 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_43.pngbin1938 -> 2078 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_57.pngbin1940 -> 2001 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_71.pngbin1985 -> 2020 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_85.pngbin1942 -> 1972 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_unknown.pngbin1417 -> 1456 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.pngbin2755 -> 2763 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_on.pngbin2747 -> 2760 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.pngbin3476 -> 3402 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.pngbin3116 -> 3061 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_default_user.pngbin0 -> 7543 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.pngbin1576 -> 1591 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_location.pngbin2639 -> 2659 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring.pngbin2041 -> 2062 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_rotation_locked.pngbin2248 -> 2134 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.pngbin1838 -> 1820 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.pngbin1149 -> 1263 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.pngbin1253 -> 1291 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.pngbin1282 -> 1250 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.pngbin1305 -> 1304 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.pngbin1337 -> 1288 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.pngbin1565 -> 1542 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.pngbin1285 -> 1254 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.pngbin1440 -> 1449 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.pngbin743 -> 760 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.pngbin1289 -> 1298 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.pngbin1246 -> 1273 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.pngbin1334 -> 1314 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.pngbin1388 -> 1295 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.pngbin1540 -> 1555 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.pngbin1341 -> 1264 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.pngbin781 -> 775 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.pngbin1097 -> 1091 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.pngbin783 -> 762 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.pngbin0 -> 996 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.pngbin1084 -> 1118 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.pngbin710 -> 742 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.pngbin678 -> 720 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.pngbin987 -> 1005 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.pngbin1422 -> 1431 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.pngbin673 -> 695 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.pngbin960 -> 978 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.pngbin2132 -> 2044 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.pngbin0 -> 2619 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.pngbin2741 -> 2793 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.pngbin2840 -> 2904 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.pngbin2999 -> 3002 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.pngbin2608 -> 2641 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.pngbin0 -> 2795 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.pngbin0 -> 2883 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.pngbin0 -> 2998 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.pngbin0 -> 2600 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.pngbin705 -> 720 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.pngbin984 -> 1005 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.pngbin2335 -> 2296 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.pngbin667 -> 695 bytes
-rw-r--r--packages/SystemUI/res/drawable/qs_tile_background.xml26
-rw-r--r--packages/SystemUI/res/layout/quick_settings.xml22
-rw-r--r--packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml5
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile.xml2
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_brightness.xml1
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_user.xml6
-rw-r--r--packages/SystemUI/res/values/strings.xml2
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java52
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java32
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java11
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardSubdivisionLayout.java4
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java7
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java26
-rwxr-xr-xservices/java/com/android/server/am/ActivityStack.java34
-rw-r--r--services/java/com/android/server/display/WifiDisplayController.java23
-rw-r--r--services/java/com/android/server/pm/PackageManagerService.java4
-rw-r--r--services/java/com/android/server/pm/UserManagerService.java23
-rw-r--r--services/java/com/android/server/updatable/ConfigUpdateInstallReceiver.java17
-rw-r--r--services/java/com/android/server/wm/WindowAnimator.java42
-rw-r--r--services/java/com/android/server/wm/WindowState.java3
-rw-r--r--tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java16
-rw-r--r--tools/aapt/Bundle.h9
-rw-r--r--tools/aapt/Main.cpp22
-rw-r--r--tools/aapt/Resource.cpp265
-rw-r--r--wifi/java/android/net/wifi/WifiStateMachine.java10
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pConfig.java3
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pService.java2
283 files changed, 1098 insertions, 702 deletions
diff --git a/api/current.txt b/api/current.txt
index 44f5b27..e0736b6 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -22181,6 +22181,7 @@ package android.text.format {
field public static final char MONTH = 77; // 0x004d 'M'
field public static final char QUOTE = 39; // 0x0027 '\''
field public static final char SECONDS = 115; // 0x0073 's'
+ field public static final char STANDALONE_MONTH = 76; // 0x004c 'L'
field public static final char TIME_ZONE = 122; // 0x007a 'z'
field public static final char YEAR = 121; // 0x0079 'y'
}
@@ -23332,17 +23333,6 @@ package android.util {
method public void set(T, V);
}
- public class PropertyValueModel extends android.util.ValueModel {
- method public T get();
- method public H getHost();
- method public android.util.Property<H, T> getProperty();
- method public java.lang.Class<T> getType();
- method public static android.util.PropertyValueModel<H, T> of(H, android.util.Property<H, T>);
- method public static android.util.PropertyValueModel<H, T> of(H, java.lang.Class<T>, java.lang.String);
- method public static android.util.PropertyValueModel of(java.lang.Object, java.lang.String);
- method public void set(T);
- }
-
public class SparseArray implements java.lang.Cloneable {
ctor public SparseArray();
ctor public SparseArray(int);
@@ -23491,14 +23481,6 @@ package android.util {
field public int type;
}
- public abstract class ValueModel {
- ctor protected ValueModel();
- method public abstract T get();
- method public abstract java.lang.Class<T> getType();
- method public abstract void set(T);
- field public static final android.util.ValueModel EMPTY;
- }
-
public class Xml {
method public static android.util.AttributeSet asAttributeSet(org.xmlpull.v1.XmlPullParser);
method public static android.util.Xml.Encoding findEncodingByName(java.lang.String) throws java.io.UnsupportedEncodingException;
@@ -27907,12 +27889,10 @@ package android.widget {
method public abstract void onSelectedDayChange(android.widget.CalendarView, int, int, int);
}
- public class CheckBox extends android.widget.CompoundButton implements android.widget.ValueEditor {
+ public class CheckBox extends android.widget.CompoundButton {
ctor public CheckBox(android.content.Context);
ctor public CheckBox(android.content.Context, android.util.AttributeSet);
ctor public CheckBox(android.content.Context, android.util.AttributeSet, int);
- method public android.util.ValueModel<java.lang.Boolean> getValueModel();
- method public void setValueModel(android.util.ValueModel<java.lang.Boolean>);
}
public abstract interface Checkable {
@@ -28085,16 +28065,14 @@ package android.widget {
method public void setSize(int, int);
}
- public class EditText extends android.widget.TextView implements android.widget.ValueEditor {
+ public class EditText extends android.widget.TextView {
ctor public EditText(android.content.Context);
ctor public EditText(android.content.Context, android.util.AttributeSet);
ctor public EditText(android.content.Context, android.util.AttributeSet, int);
method public void extendSelection(int);
- method public android.util.ValueModel<java.lang.CharSequence> getValueModel();
method public void selectAll();
method public void setSelection(int, int);
method public void setSelection(int);
- method public void setValueModel(android.util.ValueModel<java.lang.CharSequence>);
}
public abstract interface ExpandableListAdapter {
@@ -29120,13 +29098,11 @@ package android.widget {
method public abstract java.lang.Object[] getSections();
}
- public class SeekBar extends android.widget.AbsSeekBar implements android.widget.ValueEditor {
+ public class SeekBar extends android.widget.AbsSeekBar {
ctor public SeekBar(android.content.Context);
ctor public SeekBar(android.content.Context, android.util.AttributeSet);
ctor public SeekBar(android.content.Context, android.util.AttributeSet, int);
- method public android.util.ValueModel<java.lang.Integer> getValueModel();
method public void setOnSeekBarChangeListener(android.widget.SeekBar.OnSeekBarChangeListener);
- method public void setValueModel(android.util.ValueModel<java.lang.Integer>);
}
public static abstract interface SeekBar.OnSeekBarChangeListener {
@@ -29700,11 +29676,6 @@ package android.widget {
method public android.widget.TextView getText2();
}
- public abstract interface ValueEditor {
- method public abstract android.util.ValueModel<T> getValueModel();
- method public abstract void setValueModel(android.util.ValueModel<T>);
- }
-
public class VideoView extends android.view.SurfaceView implements android.widget.MediaController.MediaPlayerControl {
ctor public VideoView(android.content.Context);
ctor public VideoView(android.content.Context, android.util.AttributeSet);
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index eae3b1f..773f73c 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -404,6 +404,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
return true;
}
+ case ACTIVITY_RESUMED_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ IBinder token = data.readStrongBinder();
+ activityResumed(token);
+ reply.writeNoException();
+ return true;
+ }
+
case ACTIVITY_PAUSED_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
IBinder token = data.readStrongBinder();
@@ -2152,6 +2160,17 @@ class ActivityManagerProxy implements IActivityManager
data.recycle();
reply.recycle();
}
+ public void activityResumed(IBinder token) throws RemoteException
+ {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeStrongBinder(token);
+ mRemote.transact(ACTIVITY_RESUMED_TRANSACTION, data, reply, 0);
+ reply.readException();
+ data.recycle();
+ reply.recycle();
+ }
public void activityPaused(IBinder token) throws RemoteException
{
Parcel data = Parcel.obtain();
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index cb4d4a1..9b82f2a 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1245,7 +1245,7 @@ public final class ActivityThread {
case RESUME_ACTIVITY:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityResume");
handleResumeActivity((IBinder)msg.obj, true,
- msg.arg1 != 0);
+ msg.arg1 != 0, true);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
case SEND_RESULT:
@@ -2175,7 +2175,8 @@ public final class ActivityThread {
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
Bundle oldState = r.state;
- handleResumeActivity(r.token, false, r.isForward);
+ handleResumeActivity(r.token, false, r.isForward,
+ !r.activity.mFinished && !r.startsNotResumed);
if (!r.activity.mFinished && r.startsNotResumed) {
// The activity manager actually wants this one to start out
@@ -2684,7 +2685,8 @@ public final class ActivityThread {
r.mPendingRemoveWindowManager = null;
}
- final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) {
+ final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward,
+ boolean reallyResume) {
// If we are getting ready to gc after going to the background, well
// we are back active so skip it.
unscheduleGcIdler();
@@ -2781,6 +2783,14 @@ public final class ActivityThread {
}
r.onlyLocalRequest = false;
+ // Tell the activity manager we have resumed.
+ if (reallyResume) {
+ try {
+ ActivityManagerNative.getDefault().activityResumed(token);
+ } catch (RemoteException ex) {
+ }
+ }
+
} else {
// If an exception was thrown when trying to resume, then
// just end this activity.
@@ -2865,7 +2875,7 @@ public final class ActivityThread {
if (r.isPreHoneycomb()) {
QueuedWork.waitToFinish();
}
-
+
// Tell the activity manager we have paused.
try {
ActivityManagerNative.getDefault().activityPaused(token);
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 9ef375a..2fb17b6 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -87,19 +87,15 @@ public interface IActivityManager extends IInterface {
String resultData, Bundle map, String requiredPermission,
boolean serialized, boolean sticky, int userId) throws RemoteException;
public void unbroadcastIntent(IApplicationThread caller, Intent intent, int userId) throws RemoteException;
- /* oneway */
public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, boolean abortBroadcast) throws RemoteException;
public void attachApplication(IApplicationThread app) throws RemoteException;
- /* oneway */
+ public void activityResumed(IBinder token) throws RemoteException;
public void activityIdle(IBinder token, Configuration config,
boolean stopProfiling) throws RemoteException;
public void activityPaused(IBinder token) throws RemoteException;
- /* oneway */
public void activityStopped(IBinder token, Bundle state,
Bitmap thumbnail, CharSequence description) throws RemoteException;
- /* oneway */
public void activitySlept(IBinder token) throws RemoteException;
- /* oneway */
public void activityDestroyed(IBinder token) throws RemoteException;
public String getCallingPackage(IBinder token) throws RemoteException;
public ComponentName getCallingActivity(IBinder token) throws RemoteException;
@@ -496,7 +492,7 @@ public interface IActivityManager extends IInterface {
int BIND_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+35;
int UNBIND_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+36;
int PUBLISH_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+37;
-
+ int ACTIVITY_RESUMED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+38;
int GOING_TO_SLEEP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+39;
int WAKING_UP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+40;
int SET_DEBUG_APP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+41;
diff --git a/core/java/android/app/TaskStackBuilder.java b/core/java/android/app/TaskStackBuilder.java
index 9c83362..cadf5e4 100644
--- a/core/java/android/app/TaskStackBuilder.java
+++ b/core/java/android/app/TaskStackBuilder.java
@@ -162,7 +162,7 @@ public class TaskStackBuilder {
ActivityInfo info = pm.getActivityInfo(sourceActivityName, 0);
String parentActivity = info.parentActivityName;
while (parentActivity != null) {
- final ComponentName target = new ComponentName(mSourceContext, parentActivity);
+ final ComponentName target = new ComponentName(info.packageName, parentActivity);
info = pm.getActivityInfo(target, 0);
parentActivity = info.parentActivityName;
final Intent parent = parentActivity == null && insertAt == 0
@@ -216,11 +216,7 @@ public class TaskStackBuilder {
"No intents added to TaskStackBuilder; cannot startActivities");
}
- Intent[] intents = mIntents.toArray(new Intent[mIntents.size()]);
- intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
- Intent.FLAG_ACTIVITY_CLEAR_TASK |
- Intent.FLAG_ACTIVITY_TASK_ON_HOME);
- mSourceContext.startActivities(intents, options);
+ mSourceContext.startActivities(getIntents(), options);
}
/**
@@ -260,11 +256,8 @@ public class TaskStackBuilder {
"No intents added to TaskStackBuilder; cannot getPendingIntent");
}
- Intent[] intents = mIntents.toArray(new Intent[mIntents.size()]);
- intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
- Intent.FLAG_ACTIVITY_CLEAR_TASK |
- Intent.FLAG_ACTIVITY_TASK_ON_HOME);
- return PendingIntent.getActivities(mSourceContext, requestCode, intents, flags, options);
+ return PendingIntent.getActivities(mSourceContext, requestCode, getIntents(),
+ flags, options);
}
/**
@@ -275,6 +268,15 @@ public class TaskStackBuilder {
* @return An array containing the intents added to this builder.
*/
public Intent[] getIntents() {
- return mIntents.toArray(new Intent[mIntents.size()]);
+ Intent[] intents = new Intent[mIntents.size()];
+ if (intents.length == 0) return intents;
+
+ intents[0] = new Intent(mIntents.get(0)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
+ Intent.FLAG_ACTIVITY_CLEAR_TASK |
+ Intent.FLAG_ACTIVITY_TASK_ON_HOME);
+ for (int i = 1; i < intents.length; i++) {
+ intents[i] = new Intent(mIntents.get(i));
+ }
+ return intents;
}
}
diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java
index 51a81c5..84a447f 100644
--- a/core/java/android/appwidget/AppWidgetHost.java
+++ b/core/java/android/appwidget/AppWidgetHost.java
@@ -117,7 +117,7 @@ public class AppWidgetHost {
private OnClickHandler mOnClickHandler;
public AppWidgetHost(Context context, int hostId) {
- this(context, hostId, null, Looper.getMainLooper());
+ this(context, hostId, null, context.getMainLooper());
}
/**
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index ece8841..cd1e882 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -1219,9 +1219,16 @@ public abstract class ContentResolver {
public final void registerContentObserver(Uri uri, boolean notifyForDescendents,
ContentObserver observer)
{
+ registerContentObserver(uri, notifyForDescendents, observer, UserHandle.myUserId());
+ }
+
+ /** @hide - designated user version */
+ public final void registerContentObserver(Uri uri, boolean notifyForDescendents,
+ ContentObserver observer, int userHandle)
+ {
try {
getContentService().registerContentObserver(uri, notifyForDescendents,
- observer.getContentObserver());
+ observer.getContentObserver(), userHandle);
} catch (RemoteException e) {
}
}
@@ -1276,10 +1283,21 @@ public abstract class ContentResolver {
* @see #requestSync(android.accounts.Account, String, android.os.Bundle)
*/
public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
+ notifyChange(uri, observer, syncToNetwork, UserHandle.myUserId());
+ }
+
+ /**
+ * Notify registered observers within the designated user(s) that a row was updated.
+ *
+ * @hide
+ */
+ public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork,
+ int userHandle) {
try {
getContentService().notifyChange(
uri, observer == null ? null : observer.getContentObserver(),
- observer != null && observer.deliverSelfNotifications(), syncToNetwork);
+ observer != null && observer.deliverSelfNotifications(), syncToNetwork,
+ userHandle);
} catch (RemoteException e) {
}
}
diff --git a/core/java/android/content/ContentService.java b/core/java/android/content/ContentService.java
index 472fe94..0f6488a 100644
--- a/core/java/android/content/ContentService.java
+++ b/core/java/android/content/ContentService.java
@@ -17,6 +17,7 @@
package android.content;
import android.accounts.Account;
+import android.app.ActivityManager;
import android.database.IContentObserver;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
@@ -33,6 +34,7 @@ import android.Manifest;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -138,19 +140,49 @@ public final class ContentService extends IContentService.Stub {
getSyncManager();
}
- public void registerContentObserver(Uri uri, boolean notifyForDescendents,
- IContentObserver observer) {
+ /**
+ * Register a content observer tied to a specific user's view of the provider.
+ * @param userHandle the user whose view of the provider is to be observed. May be
+ * the calling user without requiring any permission, otherwise the caller needs to
+ * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL and
+ * USER_CURRENT are properly handled; all other pseudousers are forbidden.
+ */
+ @Override
+ public void registerContentObserver(Uri uri, boolean notifyForDescendants,
+ IContentObserver observer, int userHandle) {
if (observer == null || uri == null) {
throw new IllegalArgumentException("You must pass a valid uri and observer");
}
+
+ final int callingUser = UserHandle.getCallingUserId();
+ if (callingUser != userHandle) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+ "no permission to observe other users' provider view");
+ }
+
+ if (userHandle < 0) {
+ if (userHandle == UserHandle.USER_CURRENT) {
+ userHandle = ActivityManager.getCurrentUser();
+ } else if (userHandle != UserHandle.USER_ALL) {
+ throw new InvalidParameterException("Bad user handle for registerContentObserver: "
+ + userHandle);
+ }
+ }
+
synchronized (mRootNode) {
- mRootNode.addObserverLocked(uri, observer, notifyForDescendents, mRootNode,
- Binder.getCallingUid(), Binder.getCallingPid());
+ mRootNode.addObserverLocked(uri, observer, notifyForDescendants, mRootNode,
+ Binder.getCallingUid(), Binder.getCallingPid(), userHandle);
if (false) Log.v(TAG, "Registered observer " + observer + " at " + uri +
- " with notifyForDescendents " + notifyForDescendents);
+ " with notifyForDescendants " + notifyForDescendants);
}
}
+ public void registerContentObserver(Uri uri, boolean notifyForDescendants,
+ IContentObserver observer) {
+ registerContentObserver(uri, notifyForDescendants, observer,
+ UserHandle.getCallingUserId());
+ }
+
public void unregisterContentObserver(IContentObserver observer) {
if (observer == null) {
throw new IllegalArgumentException("You must pass a valid observer");
@@ -161,14 +193,39 @@ public final class ContentService extends IContentService.Stub {
}
}
+ /**
+ * Notify observers of a particular user's view of the provider.
+ * @param userHandle the user whose view of the provider is to be notified. May be
+ * the calling user without requiring any permission, otherwise the caller needs to
+ * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL and
+ * USER_CURRENT are properly interpreted; no other pseudousers are allowed.
+ */
+ @Override
public void notifyChange(Uri uri, IContentObserver observer,
- boolean observerWantsSelfNotifications, boolean syncToNetwork) {
+ boolean observerWantsSelfNotifications, boolean syncToNetwork,
+ int userHandle) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "Notifying update of " + uri + " from observer " + observer
- + ", syncToNetwork " + syncToNetwork);
+ Log.v(TAG, "Notifying update of " + uri + " for user " + userHandle
+ + " from observer " + observer + ", syncToNetwork " + syncToNetwork);
+ }
+
+ // Notify for any user other than the caller's own requires permission.
+ final int callingUserHandle = UserHandle.getCallingUserId();
+ if (userHandle != callingUserHandle) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+ "no permission to notify other users");
+ }
+
+ // We passed the permission check; resolve pseudouser targets as appropriate
+ if (userHandle < 0) {
+ if (userHandle == UserHandle.USER_CURRENT) {
+ userHandle = ActivityManager.getCurrentUser();
+ } else if (userHandle != UserHandle.USER_ALL) {
+ throw new InvalidParameterException("Bad user handle for notifyChange: "
+ + userHandle);
+ }
}
- int userId = UserHandle.getCallingUserId();
// This makes it so that future permission checks will be in the context of this
// process rather than the caller's process. We will restore this before returning.
long identityToken = clearCallingIdentity();
@@ -176,7 +233,7 @@ public final class ContentService extends IContentService.Stub {
ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>();
synchronized (mRootNode) {
mRootNode.collectObserversLocked(uri, 0, observer, observerWantsSelfNotifications,
- calls);
+ userHandle, calls);
}
final int numCalls = calls.size();
for (int i=0; i<numCalls; i++) {
@@ -207,7 +264,7 @@ public final class ContentService extends IContentService.Stub {
if (syncToNetwork) {
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
- syncManager.scheduleLocalSync(null /* all accounts */, userId,
+ syncManager.scheduleLocalSync(null /* all accounts */, callingUserHandle,
uri.getAuthority());
}
}
@@ -216,6 +273,12 @@ public final class ContentService extends IContentService.Stub {
}
}
+ public void notifyChange(Uri uri, IContentObserver observer,
+ boolean observerWantsSelfNotifications, boolean syncToNetwork) {
+ notifyChange(uri, observer, observerWantsSelfNotifications, syncToNetwork,
+ UserHandle.getCallingUserId());
+ }
+
/**
* Hide this class since it is not part of api,
* but current unittest framework requires it to be public
@@ -543,16 +606,18 @@ public final class ContentService extends IContentService.Stub {
public final IContentObserver observer;
public final int uid;
public final int pid;
- public final boolean notifyForDescendents;
+ public final boolean notifyForDescendants;
+ private final int userHandle;
private final Object observersLock;
public ObserverEntry(IContentObserver o, boolean n, Object observersLock,
- int _uid, int _pid) {
+ int _uid, int _pid, int _userHandle) {
this.observersLock = observersLock;
observer = o;
uid = _uid;
pid = _pid;
- notifyForDescendents = n;
+ userHandle = _userHandle;
+ notifyForDescendants = n;
try {
observer.asBinder().linkToDeath(this, 0);
} catch (RemoteException e) {
@@ -571,7 +636,8 @@ public final class ContentService extends IContentService.Stub {
pidCounts.put(pid, pidCounts.get(pid)+1);
pw.print(prefix); pw.print(name); pw.print(": pid=");
pw.print(pid); pw.print(" uid=");
- pw.print(uid); pw.print(" target=");
+ pw.print(uid); pw.print(" user=");
+ pw.print(userHandle); pw.print(" target=");
pw.println(Integer.toHexString(System.identityHashCode(
observer != null ? observer.asBinder() : null)));
}
@@ -639,17 +705,21 @@ public final class ContentService extends IContentService.Stub {
return uri.getPathSegments().size() + 1;
}
+ // Invariant: userHandle is either a hard user number or is USER_ALL
public void addObserverLocked(Uri uri, IContentObserver observer,
- boolean notifyForDescendents, Object observersLock, int uid, int pid) {
- addObserverLocked(uri, 0, observer, notifyForDescendents, observersLock, uid, pid);
+ boolean notifyForDescendants, Object observersLock,
+ int uid, int pid, int userHandle) {
+ addObserverLocked(uri, 0, observer, notifyForDescendants, observersLock,
+ uid, pid, userHandle);
}
private void addObserverLocked(Uri uri, int index, IContentObserver observer,
- boolean notifyForDescendents, Object observersLock, int uid, int pid) {
+ boolean notifyForDescendants, Object observersLock,
+ int uid, int pid, int userHandle) {
// If this is the leaf node add the observer
if (index == countUriSegments(uri)) {
- mObservers.add(new ObserverEntry(observer, notifyForDescendents, observersLock,
- uid, pid));
+ mObservers.add(new ObserverEntry(observer, notifyForDescendants, observersLock,
+ uid, pid, userHandle));
return;
}
@@ -662,8 +732,8 @@ public final class ContentService extends IContentService.Stub {
for (int i = 0; i < N; i++) {
ObserverNode node = mChildren.get(i);
if (node.mName.equals(segment)) {
- node.addObserverLocked(uri, index + 1, observer, notifyForDescendents,
- observersLock, uid, pid);
+ node.addObserverLocked(uri, index + 1, observer, notifyForDescendants,
+ observersLock, uid, pid, userHandle);
return;
}
}
@@ -671,8 +741,8 @@ public final class ContentService extends IContentService.Stub {
// No child found, create one
ObserverNode node = new ObserverNode(segment);
mChildren.add(node);
- node.addObserverLocked(uri, index + 1, observer, notifyForDescendents,
- observersLock, uid, pid);
+ node.addObserverLocked(uri, index + 1, observer, notifyForDescendants,
+ observersLock, uid, pid, userHandle);
}
public boolean removeObserverLocked(IContentObserver observer) {
@@ -705,37 +775,49 @@ public final class ContentService extends IContentService.Stub {
}
private void collectMyObserversLocked(boolean leaf, IContentObserver observer,
- boolean observerWantsSelfNotifications, ArrayList<ObserverCall> calls) {
+ boolean observerWantsSelfNotifications, int targetUserHandle,
+ ArrayList<ObserverCall> calls) {
int N = mObservers.size();
IBinder observerBinder = observer == null ? null : observer.asBinder();
for (int i = 0; i < N; i++) {
ObserverEntry entry = mObservers.get(i);
- // Don't notify the observer if it sent the notification and isn't interesed
+ // Don't notify the observer if it sent the notification and isn't interested
// in self notifications
boolean selfChange = (entry.observer.asBinder() == observerBinder);
if (selfChange && !observerWantsSelfNotifications) {
continue;
}
- // Make sure the observer is interested in the notification
- if (leaf || (!leaf && entry.notifyForDescendents)) {
- calls.add(new ObserverCall(this, entry.observer, selfChange));
+ // Does this observer match the target user?
+ if (targetUserHandle == UserHandle.USER_ALL
+ || entry.userHandle == UserHandle.USER_ALL
+ || targetUserHandle == entry.userHandle) {
+ // Make sure the observer is interested in the notification
+ if (leaf || (!leaf && entry.notifyForDescendants)) {
+ calls.add(new ObserverCall(this, entry.observer, selfChange));
+ }
}
}
}
+ /**
+ * targetUserHandle is either a hard user handle or is USER_ALL
+ */
public void collectObserversLocked(Uri uri, int index, IContentObserver observer,
- boolean observerWantsSelfNotifications, ArrayList<ObserverCall> calls) {
+ boolean observerWantsSelfNotifications, int targetUserHandle,
+ ArrayList<ObserverCall> calls) {
String segment = null;
int segmentCount = countUriSegments(uri);
if (index >= segmentCount) {
// This is the leaf node, notify all observers
- collectMyObserversLocked(true, observer, observerWantsSelfNotifications, calls);
+ collectMyObserversLocked(true, observer, observerWantsSelfNotifications,
+ targetUserHandle, calls);
} else if (index < segmentCount){
segment = getUriSegment(uri, index);
- // Notify any observers at this level who are interested in descendents
- collectMyObserversLocked(false, observer, observerWantsSelfNotifications, calls);
+ // Notify any observers at this level who are interested in descendants
+ collectMyObserversLocked(false, observer, observerWantsSelfNotifications,
+ targetUserHandle, calls);
}
int N = mChildren.size();
@@ -744,7 +826,7 @@ public final class ContentService extends IContentService.Stub {
if (segment == null || node.mName.equals(segment)) {
// We found the child,
node.collectObserversLocked(uri, index + 1,
- observer, observerWantsSelfNotifications, calls);
+ observer, observerWantsSelfNotifications, targetUserHandle, calls);
if (segment != null) {
break;
}
diff --git a/core/java/android/content/IContentService.aidl b/core/java/android/content/IContentService.aidl
index 86a9392..f956bcf 100644
--- a/core/java/android/content/IContentService.aidl
+++ b/core/java/android/content/IContentService.aidl
@@ -30,12 +30,28 @@ import android.database.IContentObserver;
* @hide
*/
interface IContentService {
- void registerContentObserver(in Uri uri, boolean notifyForDescendentsn,
- IContentObserver observer);
void unregisterContentObserver(IContentObserver observer);
+ /**
+ * Register a content observer tied to a specific user's view of the provider.
+ * @param userHandle the user whose view of the provider is to be observed. May be
+ * the calling user without requiring any permission, otherwise the caller needs to
+ * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL and
+ * USER_CURRENT are properly handled.
+ */
+ void registerContentObserver(in Uri uri, boolean notifyForDescendants,
+ IContentObserver observer, int userHandle);
+
+ /**
+ * Notify observers of a particular user's view of the provider.
+ * @param userHandle the user whose view of the provider is to be notified. May be
+ * the calling user without requiring any permission, otherwise the caller needs to
+ * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL
+ * USER_CURRENT are properly interpreted.
+ */
void notifyChange(in Uri uri, IContentObserver observer,
- boolean observerWantsSelfNotifications, boolean syncToNetwork);
+ boolean observerWantsSelfNotifications, boolean syncToNetwork,
+ int userHandle);
void requestSync(in Account account, String authority, in Bundle extras);
void cancelSync(in Account account, String authority);
diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl
index c7a8493..653c5f3 100644
--- a/core/java/android/os/IUserManager.aidl
+++ b/core/java/android/os/IUserManager.aidl
@@ -28,6 +28,7 @@ interface IUserManager {
boolean removeUser(int userHandle);
void setUserName(int userHandle, String name);
ParcelFileDescriptor setUserIcon(int userHandle);
+ ParcelFileDescriptor getUserIcon(int userHandle);
List<UserInfo> getUsers();
UserInfo getUserInfo(int userHandle);
void setGuestEnabled(boolean enable);
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 6c7c50b..daec7ea 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -167,6 +167,22 @@ public class UserManager {
}
/**
+ * Returns a file descriptor for the user's photo. PNG data can be read from this file.
+ * @param userHandle the user whose photo we want to read.
+ * @return a {@link ParcelFileDescriptor} from which to read the file, or null if there's no
+ * photo.
+ * @hide
+ */
+ public ParcelFileDescriptor getUserIcon(int userHandle) {
+ try {
+ return mService.getUserIcon(userHandle);
+ } catch (RemoteException re) {
+ Log.w(TAG, "Could not set the user icon ", re);
+ return null;
+ }
+ }
+
+ /**
* Enable or disable the use of a guest account. If disabled, the existing guest account
* will be wiped.
* Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java
index 524f941..c36273e 100644
--- a/core/java/android/text/format/DateFormat.java
+++ b/core/java/android/text/format/DateFormat.java
@@ -35,10 +35,18 @@ import java.text.SimpleDateFormat;
Utility class for producing strings with formatted date/time.
<p>
- This class takes as inputs a format string and a representation of a date/time.
- The format string controls how the output is generated.
+ Most callers should avoid supplying their own format strings to this
+ class' {@code format} methods and rely on the correctly localized ones
+ supplied by the system. This class' factory methods return
+ appropriately-localized {@link java.text.DateFormat} instances, suitable
+ for both formatting and parsing dates. For the canonical documentation
+ of format strings, see {@link java.text.SimpleDateFormat}.
</p>
<p>
+ The format methods in this class takes as inputs a format string and a representation of a date/time.
+ The format string controls how the output is generated.
+ This class only supports a subset of the full Unicode specification.
+ Use {@link java.text.SimpleDateFormat} if you need more.
Formatting characters may be repeated in order to get more detailed representations
of that field. For instance, the format character &apos;M&apos; is used to
represent the month. Depending on how many times that character is repeated
@@ -152,7 +160,8 @@ public class DateFormat {
public static final char MINUTE = 'm';
/**
- This designator indicates the month of the year
+ This designator indicates the month of the year. See also
+ {@link #STANDALONE_MONTH}.
Examples for September:
M -> 9
@@ -163,6 +172,14 @@ public class DateFormat {
public static final char MONTH = 'M';
/**
+ This designator indicates the standalone month of the year,
+ necessary in some format strings in some languages. For
+ example, Russian distinguishes between the "June" in
+ "June" and that in "June 2010".
+ */
+ public static final char STANDALONE_MONTH = 'L';
+
+ /**
This designator indicates the seconds of the minute.
Examples for 7 seconds past the minute:
@@ -374,7 +391,7 @@ public class DateFormat {
index++;
}
- if (!foundMonth && (c == MONTH)) {
+ if (!foundMonth && (c == MONTH || c == STANDALONE_MONTH)) {
foundMonth = true;
order[index] = MONTH;
index++;
@@ -494,9 +511,10 @@ public class DateFormat {
break;
case MONTH:
- replacement = getMonthString(inDate, count);
+ case STANDALONE_MONTH:
+ replacement = getMonthString(inDate, count, c);
break;
-
+
case SECONDS:
replacement = zeroPad(inDate.get(Calendar.SECOND), count);
break;
@@ -527,14 +545,19 @@ public class DateFormat {
return s.toString();
}
- private static final String getMonthString(Calendar inDate, int count) {
+ private static final String getMonthString(Calendar inDate, int count, int kind) {
+ boolean standalone = (kind == STANDALONE_MONTH);
int month = inDate.get(Calendar.MONTH);
- if (count >= 4)
- return DateUtils.getMonthString(month, DateUtils.LENGTH_LONG);
- else if (count == 3)
- return DateUtils.getMonthString(month, DateUtils.LENGTH_MEDIUM);
- else {
+ if (count >= 4) {
+ return standalone
+ ? DateUtils.getStandaloneMonthString(month, DateUtils.LENGTH_LONG)
+ : DateUtils.getMonthString(month, DateUtils.LENGTH_LONG);
+ } else if (count == 3) {
+ return standalone
+ ? DateUtils.getStandaloneMonthString(month, DateUtils.LENGTH_MEDIUM)
+ : DateUtils.getMonthString(month, DateUtils.LENGTH_MEDIUM);
+ } else {
// Calendar.JANUARY == 0, so add 1 to month.
return zeroPad(month+1, count);
}
@@ -574,7 +597,8 @@ public class DateFormat {
private static final String getYearString(Calendar inDate, int count) {
int year = inDate.get(Calendar.YEAR);
- return (count <= 2) ? zeroPad(year % 100, 2) : String.valueOf(year);
+ return (count <= 2) ? zeroPad(year % 100, 2)
+ : String.format(Locale.getDefault(), "%d", year);
}
private static final int appendQuotedText(SpannableStringBuilder s, int i, int len) {
@@ -615,17 +639,6 @@ public class DateFormat {
}
private static final String zeroPad(int inValue, int inMinDigits) {
- String val = String.valueOf(inValue);
-
- if (val.length() < inMinDigits) {
- char[] buf = new char[inMinDigits];
-
- for (int i = 0; i < inMinDigits; i++)
- buf[i] = '0';
-
- val.getChars(0, val.length(), buf, inMinDigits - val.length());
- val = new String(buf);
- }
- return val;
+ return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}
}
diff --git a/core/java/android/util/PropertyValueModel.java b/core/java/android/util/PropertyValueModel.java
deleted file mode 100755
index eb9c47d..0000000
--- a/core/java/android/util/PropertyValueModel.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.util;
-
-/**
- * A value model for a {@link Property property} of a host object. This class can be used for
- * both reflective and non-reflective property implementations.
- *
- * @param <H> the host type, where the host is the object that holds this property
- * @param <T> the value type
- *
- * @see Property
- * @see ValueModel
- */
-public class PropertyValueModel<H, T> extends ValueModel<T> {
- private final H mHost;
- private final Property<H, T> mProperty;
-
- private PropertyValueModel(H host, Property<H, T> property) {
- mProperty = property;
- mHost = host;
- }
-
- /**
- * Returns the host.
- *
- * @return the host
- */
- public H getHost() {
- return mHost;
- }
-
- /**
- * Returns the property.
- *
- * @return the property
- */
- public Property<H, T> getProperty() {
- return mProperty;
- }
-
- @Override
- public Class<T> getType() {
- return mProperty.getType();
- }
-
- @Override
- public T get() {
- return mProperty.get(mHost);
- }
-
- @Override
- public void set(T value) {
- mProperty.set(mHost, value);
- }
-
- /**
- * Return an appropriate PropertyValueModel for this host and property.
- *
- * @param host the host
- * @param property the property
- * @return the value model
- */
- public static <H, T> PropertyValueModel<H, T> of(H host, Property<H, T> property) {
- return new PropertyValueModel<H, T>(host, property);
- }
-
- /**
- * Return a PropertyValueModel for this {@code host} and a
- * reflective property, constructed from this {@code propertyType} and {@code propertyName}.
- *
- * @param host
- * @param propertyType the property type
- * @param propertyName the property name
- * @return a value model with this host and a reflective property with this type and name
- *
- * @see Property#of
- */
- public static <H, T> PropertyValueModel<H, T> of(H host, Class<T> propertyType,
- String propertyName) {
- return of(host, Property.of((Class<H>) host.getClass(), propertyType, propertyName));
- }
-
- private static Class getNullaryMethodReturnType(Class c, String name) {
- try {
- return c.getMethod(name).getReturnType();
- } catch (NoSuchMethodException e) {
- return null;
- }
- }
-
- private static Class getFieldType(Class c, String name) {
- try {
- return c.getField(name).getType();
- } catch (NoSuchFieldException e) {
- return null;
- }
- }
-
- private static String capitalize(String name) {
- if (name.isEmpty()) {
- return name;
- }
- return Character.toUpperCase(name.charAt(0)) + name.substring(1);
- }
-
- /**
- * Return a PropertyValueModel for this {@code host} and and {@code propertyName}.
- *
- * @param host the host
- * @param propertyName the property name
- * @return a value model with this host and a reflective property with this name
- */
- public static PropertyValueModel of(Object host, String propertyName) {
- Class clazz = host.getClass();
- String suffix = capitalize(propertyName);
- Class propertyType = getNullaryMethodReturnType(clazz, "get" + suffix);
- if (propertyType == null) {
- propertyType = getNullaryMethodReturnType(clazz, "is" + suffix);
- }
- if (propertyType == null) {
- propertyType = getFieldType(clazz, propertyName);
- }
- if (propertyType == null) {
- throw new NoSuchPropertyException(propertyName);
- }
- return of(host, propertyType, propertyName);
- }
-}
diff --git a/core/java/android/util/ValueModel.java b/core/java/android/util/ValueModel.java
deleted file mode 100755
index 4789682..0000000
--- a/core/java/android/util/ValueModel.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.util;
-
-/**
- * A ValueModel is an abstraction for a 'slot' or place in memory in which a value
- * may be stored and retrieved. A common implementation of ValueModel is a regular property of
- * an object, whose value may be retrieved by calling the appropriate <em>getter</em>
- * method and set by calling the corresponding <em>setter</em> method.
- *
- * @param <T> the value type
- *
- * @see PropertyValueModel
- */
-public abstract class ValueModel<T> {
- /**
- * The empty model should be used in place of {@code null} to indicate that a
- * model has not been set. The empty model has no value and does nothing when it is set.
- */
- public static final ValueModel EMPTY = new ValueModel() {
- @Override
- public Class getType() {
- return Object.class;
- }
-
- @Override
- public Object get() {
- return null;
- }
-
- @Override
- public void set(Object value) {
-
- }
- };
-
- protected ValueModel() {
- }
-
- /**
- * Returns the type of this property.
- *
- * @return the property type
- */
- public abstract Class<T> getType();
-
- /**
- * Returns the value of this property.
- *
- * @return the property value
- */
- public abstract T get();
-
- /**
- * Sets the value of this property.
- *
- * @param value the new value for this property
- */
- public abstract void set(T value);
-} \ No newline at end of file
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 869cd00..032ff7b 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -150,7 +150,7 @@ class GLES20Canvas extends HardwareCanvas {
static native int nCreateTextureLayer(boolean opaque, int[] layerInfo);
static native int nCreateLayer(int width, int height, boolean isOpaque, int[] layerInfo);
- static native void nResizeLayer(int layerId, int width, int height, int[] layerInfo);
+ static native boolean nResizeLayer(int layerId, int width, int height, int[] layerInfo);
static native void nSetOpaqueLayer(int layerId, boolean isOpaque);
static native void nSetLayerPaint(int layerId, int nativePaint);
static native void nSetLayerColorFilter(int layerId, int nativeColorFilter);
diff --git a/core/java/android/view/GLES20RenderLayer.java b/core/java/android/view/GLES20RenderLayer.java
index a77425a..fcfc8e1 100644
--- a/core/java/android/view/GLES20RenderLayer.java
+++ b/core/java/android/view/GLES20RenderLayer.java
@@ -54,8 +54,8 @@ class GLES20RenderLayer extends GLES20Layer {
}
@Override
- void resize(int width, int height) {
- if (!isValid() || width <= 0 || height <= 0) return;
+ boolean resize(int width, int height) {
+ if (!isValid() || width <= 0 || height <= 0) return false;
mWidth = width;
mHeight = height;
@@ -63,11 +63,17 @@ class GLES20RenderLayer extends GLES20Layer {
if (width != mLayerWidth || height != mLayerHeight) {
int[] layerInfo = new int[2];
- GLES20Canvas.nResizeLayer(mLayer, width, height, layerInfo);
-
- mLayerWidth = layerInfo[0];
- mLayerHeight = layerInfo[1];
+ if (GLES20Canvas.nResizeLayer(mLayer, width, height, layerInfo)) {
+ mLayerWidth = layerInfo[0];
+ mLayerHeight = layerInfo[1];
+ } else {
+ // Failure: not enough GPU resources for requested size
+ mLayer = 0;
+ mLayerWidth = 0;
+ mLayerHeight = 0;
+ }
}
+ return isValid();
}
@Override
diff --git a/core/java/android/view/GLES20TextureLayer.java b/core/java/android/view/GLES20TextureLayer.java
index e198ef6..b0ee2aa 100644
--- a/core/java/android/view/GLES20TextureLayer.java
+++ b/core/java/android/view/GLES20TextureLayer.java
@@ -48,7 +48,8 @@ class GLES20TextureLayer extends GLES20Layer {
}
@Override
- void resize(int width, int height) {
+ boolean resize(int width, int height) {
+ return isValid();
}
@Override
diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java
index 6e763b2..d798e73 100644
--- a/core/java/android/view/HardwareLayer.java
+++ b/core/java/android/view/HardwareLayer.java
@@ -135,8 +135,9 @@ abstract class HardwareLayer {
*
* @param width The new desired minimum width for this layer
* @param height The new desired minimum height for this layer
+ * @return True if the resulting layer is valid, false otherwise
*/
- abstract void resize(int width, int height);
+ abstract boolean resize(int width, int height);
/**
* Returns a hardware canvas that can be used to render onto
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index f906e24..446a51e 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -733,13 +733,17 @@ public abstract class HardwareRenderer {
*/
void checkEglErrors() {
if (isEnabled()) {
- int error = sEgl.eglGetError();
- if (error != EGL_SUCCESS) {
- // something bad has happened revert to
- // normal rendering.
- Log.w(LOG_TAG, "EGL error: " + GLUtils.getEGLErrorString(error));
- fallback(error != EGL11.EGL_CONTEXT_LOST);
- }
+ checkEglErrorsForced();
+ }
+ }
+
+ private void checkEglErrorsForced() {
+ int error = sEgl.eglGetError();
+ if (error != EGL_SUCCESS) {
+ // something bad has happened revert to
+ // normal rendering.
+ Log.w(LOG_TAG, "EGL error: " + GLUtils.getEGLErrorString(error));
+ fallback(error != EGL11.EGL_CONTEXT_LOST);
}
}
@@ -812,7 +816,9 @@ public abstract class HardwareRenderer {
throw new RuntimeException("eglInitialize failed " +
GLUtils.getEGLErrorString(sEgl.eglGetError()));
}
-
+
+ checkEglErrorsForced();
+
sEglConfig = chooseEglConfig();
if (sEglConfig == null) {
// We tried to use EGL_SWAP_BEHAVIOR_PRESERVED_BIT, try again without
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 03f9b72..d93c1be 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -12213,8 +12213,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mLocalDirtyRect.set(0, 0, width, height);
} else {
if (mHardwareLayer.getWidth() != width || mHardwareLayer.getHeight() != height) {
- mHardwareLayer.resize(width, height);
- mLocalDirtyRect.set(0, 0, width, height);
+ if (mHardwareLayer.resize(width, height)) {
+ mLocalDirtyRect.set(0, 0, width, height);
+ }
}
// This should not be necessary but applications that change
@@ -12225,7 +12226,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
computeOpaqueFlags();
final boolean opaque = isOpaque();
- if (mHardwareLayer.isOpaque() != opaque) {
+ if (mHardwareLayer.isValid() && mHardwareLayer.isOpaque() != opaque) {
mHardwareLayer.setOpaque(opaque);
mLocalDirtyRect.set(0, 0, width, height);
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index d6a0203..27fd374 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1402,6 +1402,7 @@ public final class ViewRootImpl implements ViewParent,
mResizeBuffer.getHeight() != mHeight) {
mResizeBuffer.resize(mWidth, mHeight);
}
+ // TODO: should handle create/resize failure
layerCanvas = mResizeBuffer.start(hwRendererCanvas);
layerCanvas.setViewport(mWidth, mHeight);
layerCanvas.onPreDraw(null);
diff --git a/core/java/android/widget/CheckBox.java b/core/java/android/widget/CheckBox.java
index 41ab5f2..f1804f8 100644
--- a/core/java/android/widget/CheckBox.java
+++ b/core/java/android/widget/CheckBox.java
@@ -20,7 +20,6 @@ import android.content.Context;
import android.util.AttributeSet;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.util.ValueModel;
/**
@@ -56,9 +55,7 @@ import android.util.ValueModel;
* {@link android.R.styleable#View View Attributes}
* </p>
*/
-public class CheckBox extends CompoundButton implements ValueEditor<Boolean> {
- private ValueModel<Boolean> mValueModel = ValueModel.EMPTY;
-
+public class CheckBox extends CompoundButton {
public CheckBox(Context context) {
this(context, null);
}
@@ -82,22 +79,4 @@ public class CheckBox extends CompoundButton implements ValueEditor<Boolean> {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(CheckBox.class.getName());
}
-
- @Override
- public ValueModel<Boolean> getValueModel() {
- return mValueModel;
- }
-
- @Override
- public void setValueModel(ValueModel<Boolean> valueModel) {
- mValueModel = valueModel;
- setChecked(mValueModel.get());
- }
-
- @Override
- public boolean performClick() {
- boolean handled = super.performClick();
- mValueModel.set(isChecked());
- return handled;
- }
}
diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java
index ec81214..57e51c2 100644
--- a/core/java/android/widget/EditText.java
+++ b/core/java/android/widget/EditText.java
@@ -17,7 +17,6 @@
package android.widget;
import android.content.Context;
-import android.graphics.Rect;
import android.text.Editable;
import android.text.Selection;
import android.text.Spannable;
@@ -25,7 +24,6 @@ import android.text.TextUtils;
import android.text.method.ArrowKeyMovementMethod;
import android.text.method.MovementMethod;
import android.util.AttributeSet;
-import android.util.ValueModel;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -49,9 +47,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
* {@link android.R.styleable#TextView TextView Attributes},
* {@link android.R.styleable#View View Attributes}
*/
-public class EditText extends TextView implements ValueEditor<CharSequence> {
- private ValueModel<CharSequence> mValueModel = ValueModel.EMPTY;
-
+public class EditText extends TextView {
public EditText(Context context) {
this(context, null);
}
@@ -132,21 +128,4 @@ public class EditText extends TextView implements ValueEditor<CharSequence> {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(EditText.class.getName());
}
-
- @Override
- public ValueModel<CharSequence> getValueModel() {
- return mValueModel;
- }
-
- @Override
- public void setValueModel(ValueModel<CharSequence> valueModel) {
- mValueModel = valueModel;
- setText(mValueModel.get());
- }
-
- @Override
- void sendAfterTextChanged(Editable text) {
- super.sendAfterTextChanged(text);
- mValueModel.set(text);
- }
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 7f9dab9..237275a 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -1801,13 +1801,13 @@ public class Editor {
mTextView.deleteText_internal(dragSourceStart, dragSourceEnd);
// Make sure we do not leave two adjacent spaces.
- CharSequence t = mTextView.getTransformedText(dragSourceStart - 1, dragSourceStart + 1);
- if ( (dragSourceStart == 0 || Character.isSpaceChar(t.charAt(0))) &&
- (dragSourceStart == mTextView.getText().length() ||
- Character.isSpaceChar(t.charAt(1))) ) {
- final int pos = dragSourceStart == mTextView.getText().length() ?
- dragSourceStart - 1 : dragSourceStart;
- mTextView.deleteText_internal(pos, pos + 1);
+ final int prevCharIdx = Math.max(0, dragSourceStart - 1);
+ final int nextCharIdx = Math.min(mTextView.getText().length(), dragSourceStart + 1);
+ if (nextCharIdx > prevCharIdx + 1) {
+ CharSequence t = mTextView.getTransformedText(prevCharIdx, nextCharIdx);
+ if (Character.isSpaceChar(t.charAt(0)) && Character.isSpaceChar(t.charAt(1))) {
+ mTextView.deleteText_internal(prevCharIdx, prevCharIdx + 1);
+ }
}
}
}
diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java
index a6486a8..2737f94 100644
--- a/core/java/android/widget/SeekBar.java
+++ b/core/java/android/widget/SeekBar.java
@@ -18,7 +18,6 @@ package android.widget;
import android.content.Context;
import android.util.AttributeSet;
-import android.util.ValueModel;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -34,7 +33,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
*
* @attr ref android.R.styleable#SeekBar_thumb
*/
-public class SeekBar extends AbsSeekBar implements ValueEditor<Integer> {
+public class SeekBar extends AbsSeekBar {
/**
* A callback that notifies clients when the progress level has been
@@ -70,9 +69,8 @@ public class SeekBar extends AbsSeekBar implements ValueEditor<Integer> {
void onStopTrackingTouch(SeekBar seekBar);
}
- private ValueModel<Integer> mValueModel = ValueModel.EMPTY;
private OnSeekBarChangeListener mOnSeekBarChangeListener;
-
+
public SeekBar(Context context) {
this(context, null);
}
@@ -91,23 +89,9 @@ public class SeekBar extends AbsSeekBar implements ValueEditor<Integer> {
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), fromUser);
- if (fromUser) {
- mValueModel.set(getProgress());
- }
}
}
- @Override
- public ValueModel<Integer> getValueModel() {
- return mValueModel;
- }
-
- @Override
- public void setValueModel(ValueModel<Integer> valueModel) {
- mValueModel = valueModel;
- setProgress(mValueModel.get());
- }
-
/**
* Sets a listener to receive notifications of changes to the SeekBar's progress level. Also
* provides notifications of when the user starts and stops a touch gesture within the SeekBar.
diff --git a/core/java/android/widget/ValueEditor.java b/core/java/android/widget/ValueEditor.java
deleted file mode 100755
index 2b91abf..0000000
--- a/core/java/android/widget/ValueEditor.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.widget;
-
-import android.util.ValueModel;
-
-/**
- * An interface for editors of simple values. Classes implementing this interface are normally
- * UI controls (subclasses of {@link android.view.View View}) that can provide a suitable
- * user interface to display and edit values of the specified type. This interface is
- * intended to describe editors for simple types, like {@code boolean}, {@code int} or
- * {@code String}, where the values themselves are immutable.
- * <p>
- * For example, {@link android.widget.CheckBox CheckBox} implements
- * this interface for the Boolean type as it is capable of providing an appropriate
- * mechanism for displaying and changing the value of a Boolean property.
- *
- * @param <T> the value type that this editor supports
- */
-public interface ValueEditor<T> {
- /**
- * Return the last value model that was set. If no value model has been set, the editor
- * should return the value {@link android.util.ValueModel#EMPTY}.
- *
- * @return the value model
- */
- public ValueModel<T> getValueModel();
-
- /**
- * Sets the value model for this editor. When the value model is set, the editor should
- * retrieve the value from the value model, using {@link android.util.ValueModel#get()},
- * and set its internal state accordingly. Likewise, when the editor's internal state changes
- * it should update the value model by calling {@link android.util.ValueModel#set(T)}
- * with the appropriate value.
- *
- * @param valueModel the new value model for this editor.
- */
- public void setValueModel(ValueModel<T> valueModel);
-}
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index 7dbf9ec..2ff886e 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -766,14 +766,16 @@ static Layer* android_view_GLES20Canvas_createLayer(JNIEnv* env, jobject clazz,
return layer;
}
-static void android_view_GLES20Canvas_resizeLayer(JNIEnv* env, jobject clazz,
+static bool android_view_GLES20Canvas_resizeLayer(JNIEnv* env, jobject clazz,
Layer* layer, jint width, jint height, jintArray layerInfo) {
- LayerRenderer::resizeLayer(layer, width, height);
-
- jint* storage = env->GetIntArrayElements(layerInfo, NULL);
- storage[0] = layer->getWidth();
- storage[1] = layer->getHeight();
- env->ReleaseIntArrayElements(layerInfo, storage, 0);
+ if (LayerRenderer::resizeLayer(layer, width, height)) {
+ jint* storage = env->GetIntArrayElements(layerInfo, NULL);
+ storage[0] = layer->getWidth();
+ storage[1] = layer->getHeight();
+ env->ReleaseIntArrayElements(layerInfo, storage, 0);
+ return true;
+ }
+ return false;
}
static void android_view_GLES20Canvas_setLayerPaint(JNIEnv* env, jobject clazz,
@@ -992,7 +994,7 @@ static JNINativeMethod gMethods[] = {
{ "nCreateLayerRenderer", "(I)I", (void*) android_view_GLES20Canvas_createLayerRenderer },
{ "nCreateLayer", "(IIZ[I)I", (void*) android_view_GLES20Canvas_createLayer },
- { "nResizeLayer", "(III[I)V" , (void*) android_view_GLES20Canvas_resizeLayer },
+ { "nResizeLayer", "(III[I)Z" , (void*) android_view_GLES20Canvas_resizeLayer },
{ "nSetLayerPaint", "(II)V", (void*) android_view_GLES20Canvas_setLayerPaint },
{ "nSetLayerColorFilter", "(II)V", (void*) android_view_GLES20Canvas_setLayerColorFilter },
{ "nSetOpaqueLayer", "(IZ)V", (void*) android_view_GLES20Canvas_setOpaqueLayer },
diff --git a/core/res/res/layout/keyguard_transport_control_view.xml b/core/res/res/layout/keyguard_transport_control_view.xml
index 8e76164..c40aa66 100644
--- a/core/res/res/layout/keyguard_transport_control_view.xml
+++ b/core/res/res/layout/keyguard_transport_control_view.xml
@@ -20,7 +20,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
- android:layerType="hardware"
android:id="@+id/keyguard_transport_control">
<!-- FrameLayout used as scrim to show between album art and buttons -->
diff --git a/core/tests/coretests/src/android/content/ObserverNodeTest.java b/core/tests/coretests/src/android/content/ObserverNodeTest.java
index 95b8465..1acff9c 100644
--- a/core/tests/coretests/src/android/content/ObserverNodeTest.java
+++ b/core/tests/coretests/src/android/content/ObserverNodeTest.java
@@ -23,6 +23,7 @@ import android.content.ContentService.ObserverNode;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
+import android.os.UserHandle;
import android.test.AndroidTestCase;
public class ObserverNodeTest extends AndroidTestCase {
@@ -33,6 +34,8 @@ public class ObserverNodeTest extends AndroidTestCase {
}
public void testUri() {
+ final int myUserHandle = UserHandle.myUserId();
+
ObserverNode root = new ObserverNode("");
Uri[] uris = new Uri[] {
Uri.parse("content://c/a/"),
@@ -48,21 +51,25 @@ public class ObserverNodeTest extends AndroidTestCase {
int[] nums = new int[] {4, 7, 1, 4, 2, 2, 3, 3};
// special case
- root.addObserverLocked(uris[0], new TestObserver().getContentObserver(), false, root, 0, 0);
+ root.addObserverLocked(uris[0], new TestObserver().getContentObserver(), false, root,
+ 0, 0, myUserHandle);
for(int i = 1; i < uris.length; i++) {
- root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), true, root, 0, 0);
+ root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), true, root,
+ 0, 0, myUserHandle);
}
ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>();
for (int i = nums.length - 1; i >=0; --i) {
- root.collectObserversLocked(uris[i], 0, null, false, calls);
+ root.collectObserversLocked(uris[i], 0, null, false, myUserHandle, calls);
assertEquals(nums[i], calls.size());
calls.clear();
}
}
public void testUriNotNotify() {
+ final int myUserHandle = UserHandle.myUserId();
+
ObserverNode root = new ObserverNode("");
Uri[] uris = new Uri[] {
Uri.parse("content://c/"),
@@ -77,13 +84,14 @@ public class ObserverNodeTest extends AndroidTestCase {
int[] nums = new int[] {7, 1, 3, 3, 1, 1, 1, 1};
for(int i = 0; i < uris.length; i++) {
- root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), false, root, 0, 0);
+ root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), false, root,
+ 0, 0, myUserHandle);
}
ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>();
for (int i = uris.length - 1; i >=0; --i) {
- root.collectObserversLocked(uris[i], 0, null, false, calls);
+ root.collectObserversLocked(uris[i], 0, null, false, myUserHandle, calls);
assertEquals(nums[i], calls.size());
calls.clear();
}
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp
index c3444e6..cc72df6 100644
--- a/libs/hwui/DisplayListRenderer.cpp
+++ b/libs/hwui/DisplayListRenderer.cpp
@@ -182,6 +182,10 @@ void DisplayList::clearResources() {
caches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
}
+ for (size_t i = 0; i < mLayers.size(); i++) {
+ caches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i));
+ }
+
caches.resourceCache.unlock();
for (size_t i = 0; i < mPaints.size(); i++) {
@@ -206,6 +210,7 @@ void DisplayList::clearResources() {
mPaints.clear();
mPaths.clear();
mMatrices.clear();
+ mLayers.clear();
}
void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
@@ -264,6 +269,12 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
caches.resourceCache.incrementRefcountLocked(sourcePaths.itemAt(i));
}
+ const Vector<Layer*>& layers = recorder.getLayers();
+ for (size_t i = 0; i < layers.size(); i++) {
+ mLayers.add(layers.itemAt(i));
+ caches.resourceCache.incrementRefcountLocked(layers.itemAt(i));
+ }
+
caches.resourceCache.unlock();
const Vector<SkPaint*>& paints = recorder.getPaints();
@@ -1361,6 +1372,10 @@ void DisplayListRenderer::reset() {
mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
}
+ for (size_t i = 0; i < mLayers.size(); i++) {
+ mCaches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i));
+ }
+
mCaches.resourceCache.unlock();
mBitmapResources.clear();
@@ -1379,6 +1394,8 @@ void DisplayListRenderer::reset() {
mMatrices.clear();
+ mLayers.clear();
+
mHasDrawOps = false;
}
@@ -1539,7 +1556,7 @@ status_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
status_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
addOp(DisplayList::DrawLayer);
- addInt((int) layer);
+ addLayer(layer);
addPoint(x, y);
addPaint(paint);
return DrawGlInfo::kStatusDone;
diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h
index 8e4f2d3..a0b1630 100644
--- a/libs/hwui/DisplayListRenderer.h
+++ b/libs/hwui/DisplayListRenderer.h
@@ -496,6 +496,7 @@ private:
SortedVector<SkPath*> mSourcePaths;
Vector<SkMatrix*> mMatrices;
Vector<SkiaShader*> mShaders;
+ Vector<Layer*> mLayers;
mutable SkFlattenableReadBuffer mReader;
@@ -652,6 +653,10 @@ public:
return mSourcePaths;
}
+ const Vector<Layer*>& getLayers() const {
+ return mLayers;
+ }
+
const Vector<SkMatrix*>& getMatrices() const {
return mMatrices;
}
@@ -804,6 +809,12 @@ private:
mMatrices.add(copy);
}
+ inline void addLayer(Layer* layer) {
+ addInt((int) layer);
+ mLayers.add(layer);
+ mCaches.resourceCache.incrementRefcount(layer);
+ }
+
inline void addBitmap(SkBitmap* bitmap) {
// Note that this assumes the bitmap is immutable. There are cases this won't handle
// correctly, such as creating the bitmap from scratch, drawing with it, changing its
@@ -862,6 +873,8 @@ private:
Vector<SkMatrix*> mMatrices;
+ Vector<Layer*> mLayers;
+
uint32_t mBufferSize;
int mRestoreSaveCount;
diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp
index 31e169b..76b274b 100644
--- a/libs/hwui/Layer.cpp
+++ b/libs/hwui/Layer.cpp
@@ -25,10 +25,29 @@
namespace android {
namespace uirenderer {
+Layer::Layer(const uint32_t layerWidth, const uint32_t layerHeight) {
+ mesh = NULL;
+ meshIndices = NULL;
+ meshElementCount = 0;
+ cacheable = true;
+ textureLayer = false;
+ renderTarget = GL_TEXTURE_2D;
+ texture.width = layerWidth;
+ texture.height = layerHeight;
+ colorFilter = NULL;
+ deferredUpdateScheduled = false;
+ renderer = NULL;
+ displayList = NULL;
+ fbo = 0;
+ Caches::getInstance().resourceCache.incrementRefcount(this);
+}
+
Layer::~Layer() {
if (mesh) delete mesh;
if (meshIndices) delete meshIndices;
if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter);
+ if (fbo) Caches::getInstance().fboCache.put(fbo);
+ deleteTexture();
}
void Layer::setPaint(SkPaint* paint) {
diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h
index 76da671..420073a 100644
--- a/libs/hwui/Layer.h
+++ b/libs/hwui/Layer.h
@@ -46,21 +46,7 @@ class DisplayList;
*/
struct Layer {
- Layer(const uint32_t layerWidth, const uint32_t layerHeight) {
- mesh = NULL;
- meshIndices = NULL;
- meshElementCount = 0;
- cacheable = true;
- textureLayer = false;
- renderTarget = GL_TEXTURE_2D;
- texture.width = layerWidth;
- texture.height = layerHeight;
- colorFilter = NULL;
- deferredUpdateScheduled = false;
- renderer = NULL;
- displayList = NULL;
- }
-
+ Layer(const uint32_t layerWidth, const uint32_t layerHeight);
~Layer();
/**
diff --git a/libs/hwui/LayerCache.cpp b/libs/hwui/LayerCache.cpp
index eea707e..ce74cee 100644
--- a/libs/hwui/LayerCache.cpp
+++ b/libs/hwui/LayerCache.cpp
@@ -69,15 +69,10 @@ void LayerCache::setMaxSize(uint32_t maxSize) {
void LayerCache::deleteLayer(Layer* layer) {
if (layer) {
- GLuint fbo = layer->getFbo();
- LAYER_LOGD("Destroying layer %dx%d, fbo %d", layer->getWidth(), layer->getHeight(), fbo);
-
+ LAYER_LOGD("Destroying layer %dx%d, fbo %d", layer->getWidth(), layer->getHeight(),
+ layer->getFbo());
mSize -= layer->getWidth() * layer->getHeight() * 4;
-
- if (fbo) Caches::getInstance().fboCache.put(fbo);
- layer->deleteTexture();
-
- delete layer;
+ Caches::getInstance().resourceCache.decrementRefcount(layer);
}
}
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index 02af5e2..b57d806 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -211,10 +211,8 @@ Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque
fbo, width, height);
glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
- caches.fboCache.put(fbo);
- layer->deleteTexture();
- delete layer;
+ Caches::getInstance().resourceCache.decrementRefcount(layer);
return NULL;
}
@@ -240,8 +238,7 @@ bool LayerRenderer::resizeLayer(Layer* layer, uint32_t width, uint32_t height) {
layer->texCoords.set(0.0f, height / float(layer->getHeight()),
width / float(layer->getWidth()), 0.0f);
} else {
- layer->deleteTexture();
- delete layer;
+ Caches::getInstance().resourceCache.decrementRefcount(layer);
return false;
}
}
@@ -303,8 +300,7 @@ void LayerRenderer::destroyLayer(Layer* layer) {
if (!Caches::getInstance().layerCache.put(layer)) {
LAYER_RENDERER_LOGD(" Destroyed!");
- layer->deleteTexture();
- delete layer;
+ Caches::getInstance().resourceCache.decrementRefcount(layer);
} else {
LAYER_RENDERER_LOGD(" Cached!");
#if DEBUG_LAYER_RENDERER
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 02448e8..4aefcba 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -643,10 +643,8 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLui
ALOGE("Framebuffer incomplete (GL error code 0x%x)", status);
glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
- layer->deleteTexture();
- mCaches.fboCache.put(layer->getFbo());
- delete layer;
+ Caches::getInstance().resourceCache.decrementRefcount(layer);
return false;
}
@@ -732,8 +730,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) {
// Failing to add the layer to the cache should happen only if the layer is too large
if (!mCaches.layerCache.put(layer)) {
LAYER_LOGD("Deleting layer");
- layer->deleteTexture();
- delete layer;
+ Caches::getInstance().resourceCache.decrementRefcount(layer);
}
}
diff --git a/libs/hwui/Program.h b/libs/hwui/Program.h
index a3bfaa4..a821a9c 100644
--- a/libs/hwui/Program.h
+++ b/libs/hwui/Program.h
@@ -204,8 +204,7 @@ struct ProgramDescription {
* be provided with a modulation color.
*/
bool setColor(const float r, const float g, const float b, const float a) {
- modulate = a < COLOR_COMPONENT_THRESHOLD || r < COLOR_COMPONENT_THRESHOLD ||
- g < COLOR_COMPONENT_THRESHOLD || b < COLOR_COMPONENT_THRESHOLD;
+ modulate = a < COLOR_COMPONENT_THRESHOLD;
return modulate;
}
diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp
index be8f80a..2d13f60 100644
--- a/libs/hwui/ProgramCache.cpp
+++ b/libs/hwui/ProgramCache.cpp
@@ -140,9 +140,9 @@ const char* gFS_Header_Uniforms_PointHasBitmap =
"uniform vec2 textureDimension;\n"
"uniform float pointSize;\n";
const char* gFS_Uniforms_TextureSampler =
- "uniform sampler2D sampler;\n";
+ "uniform sampler2D baseSampler;\n";
const char* gFS_Uniforms_ExternalTextureSampler =
- "uniform samplerExternalOES sampler;\n";
+ "uniform samplerExternalOES baseSampler;\n";
#define FS_UNIFORMS_DITHER \
"uniform float ditherSize;\n" \
"uniform sampler2D ditherSampler;\n"
@@ -199,27 +199,27 @@ const char* gFS_Fast_SingleColor =
"}\n\n";
const char* gFS_Fast_SingleTexture =
"\nvoid main(void) {\n"
- " gl_FragColor = texture2D(sampler, outTexCoords);\n"
+ " gl_FragColor = texture2D(baseSampler, outTexCoords);\n"
"}\n\n";
const char* gFS_Fast_SingleModulateTexture =
"\nvoid main(void) {\n"
- " gl_FragColor = color.a * texture2D(sampler, outTexCoords);\n"
+ " gl_FragColor = color.a * texture2D(baseSampler, outTexCoords);\n"
"}\n\n";
const char* gFS_Fast_SingleA8Texture =
"\nvoid main(void) {\n"
- " gl_FragColor = texture2D(sampler, outTexCoords);\n"
+ " gl_FragColor = texture2D(baseSampler, outTexCoords);\n"
"}\n\n";
const char* gFS_Fast_SingleA8Texture_ApplyGamma =
"\nvoid main(void) {\n"
- " gl_FragColor = vec4(0.0, 0.0, 0.0, pow(texture2D(sampler, outTexCoords).a, gamma));\n"
+ " gl_FragColor = vec4(0.0, 0.0, 0.0, pow(texture2D(baseSampler, outTexCoords).a, gamma));\n"
"}\n\n";
const char* gFS_Fast_SingleModulateA8Texture =
"\nvoid main(void) {\n"
- " gl_FragColor = color * texture2D(sampler, outTexCoords).a;\n"
+ " gl_FragColor = color * texture2D(baseSampler, outTexCoords).a;\n"
"}\n\n";
const char* gFS_Fast_SingleModulateA8Texture_ApplyGamma =
"\nvoid main(void) {\n"
- " gl_FragColor = color * pow(texture2D(sampler, outTexCoords).a, gamma);\n"
+ " gl_FragColor = color * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n"
"}\n\n";
const char* gFS_Fast_SingleGradient[2] = {
"\nvoid main(void) {\n"
@@ -231,10 +231,10 @@ const char* gFS_Fast_SingleGradient[2] = {
};
const char* gFS_Fast_SingleModulateGradient[2] = {
"\nvoid main(void) {\n"
- " gl_FragColor " FS_MAIN_DITHER " + color.a * texture2D(gradientSampler, linear);\n"
+ " gl_FragColor = " FS_MAIN_DITHER " + color.a * texture2D(gradientSampler, linear);\n"
"}\n\n",
"\nvoid main(void) {\n"
- " gl_FragColor " FS_MAIN_DITHER " + color.a * mix(startColor, endColor, clamp(linear, 0.0, 1.0));\n"
+ " gl_FragColor = " FS_MAIN_DITHER " + color.a * mix(startColor, endColor, clamp(linear, 0.0, 1.0));\n"
"}\n\n"
};
@@ -243,8 +243,6 @@ const char* gFS_Main_FetchColor =
" fragColor = color;\n";
const char* gFS_Main_ModulateColor =
" fragColor *= color.a;\n";
-const char* gFS_Main_ModulateColor_ApplyGamma =
- " fragColor *= pow(color.a, gamma);\n";
const char* gFS_Main_AccountForAA =
" fragColor *= (1.0 - smoothstep(boundaryWidth, 0.5, abs(0.5 - widthProportion)))\n"
" * (1.0 - smoothstep(boundaryLength, 0.5, abs(0.5 - lengthProportion)));\n";
@@ -253,15 +251,17 @@ const char* gFS_Main_AccountForAARect =
const char* gFS_Main_FetchTexture[2] = {
// Don't modulate
- " fragColor = texture2D(sampler, outTexCoords);\n",
+ " fragColor = texture2D(baseSampler, outTexCoords);\n",
// Modulate
- " fragColor = color * texture2D(sampler, outTexCoords);\n"
+ " fragColor = color * texture2D(baseSampler, outTexCoords);\n"
};
-const char* gFS_Main_FetchA8Texture[2] = {
+const char* gFS_Main_FetchA8Texture[4] = {
// Don't modulate
- " fragColor = texture2D(sampler, outTexCoords);\n",
+ " fragColor = texture2D(baseSampler, outTexCoords);\n",
+ " fragColor = texture2D(baseSampler, outTexCoords);\n",
// Modulate
- " fragColor = color * texture2D(sampler, outTexCoords).a;\n"
+ " fragColor = color * texture2D(baseSampler, outTexCoords).a;\n",
+ " fragColor = color * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n"
};
const char* gFS_Main_FetchGradient[6] = {
// Linear
@@ -289,29 +289,38 @@ const char* gFS_Main_BlendShadersBG =
" fragColor = blendShaders(gradientColor, bitmapColor)";
const char* gFS_Main_BlendShadersGB =
" fragColor = blendShaders(bitmapColor, gradientColor)";
-const char* gFS_Main_BlendShaders_Modulate[3] = {
+const char* gFS_Main_BlendShaders_Modulate[6] = {
// Don't modulate
";\n",
+ ";\n",
// Modulate
" * fragColor.a;\n",
+ " * fragColor.a;\n",
// Modulate with alpha 8 texture
- " * texture2D(sampler, outTexCoords).a;\n"
+ " * texture2D(baseSampler, outTexCoords).a;\n",
+ " * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n"
};
-const char* gFS_Main_GradientShader_Modulate[3] = {
+const char* gFS_Main_GradientShader_Modulate[6] = {
// Don't modulate
" fragColor = gradientColor;\n",
+ " fragColor = gradientColor;\n",
// Modulate
" fragColor = gradientColor * fragColor.a;\n",
+ " fragColor = gradientColor * fragColor.a;\n",
// Modulate with alpha 8 texture
- " fragColor = gradientColor * texture2D(sampler, outTexCoords).a;\n"
+ " fragColor = gradientColor * texture2D(baseSampler, outTexCoords).a;\n",
+ " fragColor = gradientColor * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n"
};
-const char* gFS_Main_BitmapShader_Modulate[3] = {
+const char* gFS_Main_BitmapShader_Modulate[6] = {
// Don't modulate
" fragColor = bitmapColor;\n",
+ " fragColor = bitmapColor;\n",
// Modulate
" fragColor = bitmapColor * fragColor.a;\n",
+ " fragColor = bitmapColor * fragColor.a;\n",
// Modulate with alpha 8 texture
- " fragColor = bitmapColor * texture2D(sampler, outTexCoords).a;\n"
+ " fragColor = bitmapColor * texture2D(baseSampler, outTexCoords).a;\n",
+ " fragColor = bitmapColor * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n"
};
const char* gFS_Main_FragColor =
" gl_FragColor = fragColor;\n";
@@ -518,6 +527,14 @@ String8 ProgramCache::generateVertexShader(const ProgramDescription& description
return shader;
}
+static bool shaderOp(const ProgramDescription& description, String8& shader,
+ const int modulateOp, const char** snippets) {
+ int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp;
+ op = op * 2 + description.hasGammaCorrection;
+ shader.append(snippets[op]);
+ return description.hasAlpha8Texture;
+}
+
String8 ProgramCache::generateFragmentShader(const ProgramDescription& description) {
String8 shader;
@@ -661,13 +678,14 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
if (description.hasTexture || description.hasExternalTexture) {
if (description.hasAlpha8Texture) {
if (!description.hasGradient && !description.hasBitmap) {
- shader.append(gFS_Main_FetchA8Texture[modulateOp]);
+ shader.append(gFS_Main_FetchA8Texture[modulateOp * 2 +
+ description.hasGammaCorrection]);
}
} else {
shader.append(gFS_Main_FetchTexture[modulateOp]);
}
} else {
- if ((!description.hasGradient && !description.hasBitmap) || description.modulate) {
+ if (!description.hasGradient && !description.hasBitmap) {
shader.append(gFS_Main_FetchColor);
}
}
@@ -688,32 +706,27 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
bool applyModulate = false;
// Case when we have two shaders set
if (description.hasGradient && description.hasBitmap) {
- int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp;
if (description.isBitmapFirst) {
shader.append(gFS_Main_BlendShadersBG);
} else {
shader.append(gFS_Main_BlendShadersGB);
}
- shader.append(gFS_Main_BlendShaders_Modulate[op]);
- applyModulate = true;
+ applyModulate = shaderOp(description, shader, modulateOp,
+ gFS_Main_BlendShaders_Modulate);
} else {
if (description.hasGradient) {
- int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp;
- shader.append(gFS_Main_GradientShader_Modulate[op]);
- applyModulate = true;
+ applyModulate = shaderOp(description, shader, modulateOp,
+ gFS_Main_GradientShader_Modulate);
} else if (description.hasBitmap) {
- int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp;
- shader.append(gFS_Main_BitmapShader_Modulate[op]);
- applyModulate = true;
+ applyModulate = shaderOp(description, shader, modulateOp,
+ gFS_Main_BitmapShader_Modulate);
}
}
+
if (description.modulate && applyModulate) {
- if (description.hasGammaCorrection) {
- shader.append(gFS_Main_ModulateColor_ApplyGamma);
- } else {
- shader.append(gFS_Main_ModulateColor);
- }
+ shader.append(gFS_Main_ModulateColor);
}
+
// Apply the color op if needed
shader.append(gFS_Main_ApplyColorOp[description.colorOp]);
diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp
index b0c57d1..1c83ea4 100644
--- a/libs/hwui/ResourceCache.cpp
+++ b/libs/hwui/ResourceCache.cpp
@@ -79,6 +79,10 @@ void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) {
incrementRefcount((void*) filterResource, kColorFilter);
}
+void ResourceCache::incrementRefcount(Layer* layerResource) {
+ incrementRefcount((void*) layerResource, kLayer);
+}
+
void ResourceCache::incrementRefcountLocked(void* resource, ResourceType resourceType) {
ssize_t index = mCache->indexOfKey(resource);
ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL;
@@ -109,6 +113,10 @@ void ResourceCache::incrementRefcountLocked(SkiaColorFilter* filterResource) {
incrementRefcountLocked((void*) filterResource, kColorFilter);
}
+void ResourceCache::incrementRefcountLocked(Layer* layerResource) {
+ incrementRefcountLocked((void*) layerResource, kLayer);
+}
+
void ResourceCache::decrementRefcount(void* resource) {
Mutex::Autolock _l(mLock);
decrementRefcountLocked(resource);
@@ -134,6 +142,10 @@ void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) {
decrementRefcount((void*) filterResource);
}
+void ResourceCache::decrementRefcount(Layer* layerResource) {
+ decrementRefcount((void*) layerResource);
+}
+
void ResourceCache::decrementRefcountLocked(void* resource) {
ssize_t index = mCache->indexOfKey(resource);
ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL;
@@ -167,6 +179,10 @@ void ResourceCache::decrementRefcountLocked(SkiaColorFilter* filterResource) {
decrementRefcountLocked((void*) filterResource);
}
+void ResourceCache::decrementRefcountLocked(Layer* layerResource) {
+ decrementRefcountLocked((void*) layerResource);
+}
+
void ResourceCache::destructor(SkPath* resource) {
Mutex::Autolock _l(mLock);
destructorLocked(resource);
@@ -280,7 +296,7 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r
if (ref->recycled && ref->resourceType == kBitmap) {
((SkBitmap*) resource)->setPixels(NULL, NULL);
}
- if (ref->destroyed) {
+ if (ref->destroyed || ref->resourceType == kLayer) {
switch (ref->resourceType) {
case kBitmap: {
SkBitmap* bitmap = (SkBitmap*) resource;
@@ -308,6 +324,11 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r
delete filter;
}
break;
+ case kLayer: {
+ Layer* layer = (Layer*) resource;
+ delete layer;
+ }
+ break;
}
}
mCache->removeItem(resource);
diff --git a/libs/hwui/ResourceCache.h b/libs/hwui/ResourceCache.h
index 60ffa7d..2053d96 100644
--- a/libs/hwui/ResourceCache.h
+++ b/libs/hwui/ResourceCache.h
@@ -23,6 +23,7 @@
#include <SkiaColorFilter.h>
#include <SkiaShader.h>
#include <utils/KeyedVector.h>
+#include "Layer.h"
namespace android {
namespace uirenderer {
@@ -35,6 +36,7 @@ enum ResourceType {
kShader,
kColorFilter,
kPath,
+ kLayer
};
class ResourceReference {
@@ -67,21 +69,25 @@ public:
void incrementRefcount(SkBitmap* resource);
void incrementRefcount(SkiaShader* resource);
void incrementRefcount(SkiaColorFilter* resource);
+ void incrementRefcount(Layer* resource);
void incrementRefcountLocked(SkPath* resource);
void incrementRefcountLocked(SkBitmap* resource);
void incrementRefcountLocked(SkiaShader* resource);
void incrementRefcountLocked(SkiaColorFilter* resource);
+ void incrementRefcountLocked(Layer* resource);
void decrementRefcount(SkBitmap* resource);
void decrementRefcount(SkPath* resource);
void decrementRefcount(SkiaShader* resource);
void decrementRefcount(SkiaColorFilter* resource);
+ void decrementRefcount(Layer* resource);
void decrementRefcountLocked(SkBitmap* resource);
void decrementRefcountLocked(SkPath* resource);
void decrementRefcountLocked(SkiaShader* resource);
void decrementRefcountLocked(SkiaColorFilter* resource);
+ void decrementRefcountLocked(Layer* resource);
void destructor(SkPath* resource);
void destructor(SkBitmap* resource);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 7cc5dec..a0ae9e3 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -317,13 +317,14 @@ public class SettingsProvider extends ContentProvider {
boolean backedUpDataChanged = false;
String property = null, table = uri.getPathSegments().get(0);
+ final boolean isGlobal = table.equals(TABLE_GLOBAL);
if (table.equals(TABLE_SYSTEM)) {
property = Settings.System.SYS_PROP_SETTING_VERSION + '_' + userHandle;
backedUpDataChanged = true;
} else if (table.equals(TABLE_SECURE)) {
property = Settings.Secure.SYS_PROP_SETTING_VERSION + '_' + userHandle;
backedUpDataChanged = true;
- } else if (table.equals(TABLE_GLOBAL)) {
+ } else if (isGlobal) {
property = Settings.Global.SYS_PROP_SETTING_VERSION; // this one is global
backedUpDataChanged = true;
}
@@ -342,8 +343,9 @@ public class SettingsProvider extends ContentProvider {
String notify = uri.getQueryParameter("notify");
if (notify == null || "true".equals(notify)) {
- getContext().getContentResolver().notifyChange(uri, null);
- if (LOCAL_LOGV) Log.v(TAG, "notifying: " + uri);
+ final int notifyTarget = isGlobal ? UserHandle.USER_ALL : userHandle;
+ getContext().getContentResolver().notifyChange(uri, null, true, notifyTarget);
+ if (LOCAL_LOGV) Log.v(TAG, "notifying for " + notifyTarget + ": " + uri);
} else {
if (LOCAL_LOGV) Log.v(TAG, "notification suppressed: " + uri);
}
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png
index ba286d5..bfe0990 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_on.png
index 3b334de..b2be115 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_on.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png
index ec1ac15..d5f1e29 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_0.png
index 6f6de2d..6fd7910 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_0.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_100.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_100.png
index b07cff9..f3632f3 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_100.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_15.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_15.png
index 6290840..228f59a 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_15.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_28.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_28.png
index d046c86..dc8510d 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_28.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_43.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_43.png
index bee1025..77abaaa 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_43.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_57.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_57.png
index a95cec5..403bfbc 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_57.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_71.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_71.png
index 58fa9c7..c0ff12c 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_71.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_85.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_85.png
index 5ea7466..18e8864 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_85.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_0.png
index 311b659..9ab1d8f 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_0.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_100.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_100.png
index 6884c16..64db815 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_100.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_15.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_15.png
index c92c5d8..3965162 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_15.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_28.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_28.png
index 02ff6e6..4b14d62 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_28.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_43.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_43.png
index 76245ef..3f51ba5 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_43.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_57.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_57.png
index 9f358fc..aecf7e6 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_57.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_71.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_71.png
index 5544567..524bf73 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_71.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_85.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_85.png
index cde5bfa..80325c7 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_85.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_unknown.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_unknown.png
index 48cd877..ceaa03b 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_unknown.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_unknown.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png
index 2a02413..2ba62f9 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_on.png
index 322a747..7d6fed5 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_on.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png
index a5c8693..464bb6a 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png
index ba0f893..dbdc524 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_default_user.png
new file mode 100644
index 0000000..03c450c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_default_user.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png
index 97324c6..e46d8a3 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png
index 9699e81..7e67171 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring.png
index 7a4fb11..5912301 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_rotation_locked.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_rotation_locked.png
index e7797b9..1a7618d 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_rotation_locked.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_rotation_locked.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
index 6e56c8c..115bc41 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png
index ce55266..39fff41 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png
index 6209b9d..97558ff 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png
index 8a50dc0..f5f0f74 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png
index d9e0a46..80472e5 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png
index 4034681..59af783 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png
index 2356cfa..54be048 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png
index 2f17ccf..2495d07 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png
index 4e60d05..7616e17 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png
index 6a71c36..2bd5949 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png
index 8875fb2..544dcf9 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png
index 4b987a0..5ca9892 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png
index 9d0bb26..7f050f8 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png
index 65a9949..be1ed56 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png
index 34fe280..5eab3c8 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png
index 928fd16..502787b 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png
index 0717cc6..e436ed8 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png
index dd44443..304c278 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png
index 2d46d93..26687ca 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png
new file mode 100644
index 0000000..b0449e1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png
index 03137e2..ce77c5e 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png
index 5c8793e..7d8d284 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
index a601b2a..bf0e995 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
index ce511b3..1782c1c 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
index 3d1bd3c..c97a167 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
index 70f364a..f999c6e 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png
index e459f64..1431c3d 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png
index 971b9e0..13ee0a5 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png
new file mode 100644
index 0000000..7e7d068
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png
index 377a009..bdba14e 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png
index d62b0bd..b51b0a6 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png
index b40f6d9..e1ac946 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png
index 6d1e410..fec4d2b 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png
new file mode 100644
index 0000000..0a31297
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png
new file mode 100644
index 0000000..3e712ad
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png
new file mode 100644
index 0000000..565ae54
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png
new file mode 100644
index 0000000..2c30f8e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
index 049086a..bf0e995 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
index aec214d..1782c1c 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
index 73ac90c..ea6d235 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
index b3956ee..f999c6e 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png
index 1a111df..53ef509 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_on.png
index 956699c..a20f6b2 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_on.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png
index 3a202d0..10ae0f0 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_0.png
index a33d423..c581919 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_100.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_100.png
index 8203b3f..2f330f7 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_100.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_15.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_15.png
index 0e237c0..2a1637c 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_15.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_28.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_28.png
index 4bbd29e..8457c2b 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_28.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_43.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_43.png
index ac0e62c..f72fe4a 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_43.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_57.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_57.png
index 2863a58..10e3275 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_57.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_71.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_71.png
index 4029d83..ca1613c 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_71.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_85.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_85.png
index d0ea00a..2bfe20d 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_85.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_0.png
index 0ffa232..b917281 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_100.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_100.png
index aa6458d..480f579 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_100.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_15.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_15.png
index 8841868..cee2a44 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_15.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_28.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_28.png
index 777bc7a..f2056db 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_28.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_43.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_43.png
index 7271089..697d4ec 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_43.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_57.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_57.png
index d2be21b..9c53dd4 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_57.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_71.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_71.png
index 1708d32..c967999 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_71.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_85.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_85.png
index 103d3b8..8df8234 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_85.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_unknown.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_unknown.png
index 8246a60..c3a4ab4 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_unknown.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_unknown.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png
index b288094..6246ebe 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_on.png
index 48fed00..ec30791 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_on.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png
index 76b65cf..2a530f8 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png
index ab274ee..9940a65 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_default_user.png
new file mode 100644
index 0000000..d90bdd3
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_default_user.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png
index 6667050..10e325d 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png
index fce92ba..79f1f47 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring.png
index 28253ea..a5f16e8 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_rotation_locked.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_rotation_locked.png
index 1ef88fc..b70df3d 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_rotation_locked.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_rotation_locked.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
index 2b2abdd..c410310 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png
index 20c13d0..d46fced 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png
index 278681d..3bd6001 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png
index 6ef198d..9599611 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png
index 79691fc..975ac27 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png
index d3c09b7..3c221cf 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png
index dd8d13a..d75ef889 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png
index 004299f..d367585 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png
index 80f72b4..97b3dda 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png
index b5bc3d9..4d49307 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png
index 192d234..5c8dc82 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png
index cc8ac74..01560e8 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png
index 8d916b4..3082ff0 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png
index 293db72..7966be8 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png
index 9bd6e55..a78c4d6 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png
index c9dc1d8..dce07ae 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png
index 641b002..828a728 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png
index 3230eb9..f1a8017 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png
index 67b0c37..9077d56 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png
new file mode 100644
index 0000000..d298624
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png
index 80096e7..2eeff7f 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png
index ba99cec..c708e00 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
index 9f8c107..bfa3f12 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
index cb44955..8302636 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
index e03e230..90aa923 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
index 78fbd30..889be88 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png
index 3b1e093..92f7fcc 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png
index 94069bd..6ac70fa 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png
new file mode 100644
index 0000000..9ab044d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png
index 6b4e5c2..473851b 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png
index 3847828..da2fe94 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png
index bf43969..44d98be 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png
index 53838ee..1a06411 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png
new file mode 100644
index 0000000..e78ab6b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png
new file mode 100644
index 0000000..1b025f26
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png
new file mode 100644
index 0000000..3036c86
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png
new file mode 100644
index 0000000..de000eb
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
index 490a172..bfa3f12 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
index 6f27626..8302636 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
index f5f5f40..d392496 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
index a9d0e2e..889be88 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png
index 8f3809b..c05d4d6 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_on.png
index dc2530d..ef8a7eb 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_on.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png
index e0cc192..5bceaf5 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_0.png
index b62fb34..2b592cc 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_100.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_100.png
index f5d8e7d..2c56c9b 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_100.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_15.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_15.png
index c57e62d..9895f71 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_15.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_28.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_28.png
index f4bfe1a..323fa8b 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_28.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_43.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_43.png
index 07d2c83..98eea99 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_43.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_57.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_57.png
index 06aaf11..64555c0 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_57.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_71.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_71.png
index 2f56daa..ad8b15f 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_71.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_85.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_85.png
index ac0d7bc..071b79b 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_85.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_0.png
index 1f5b55a..1ecedca 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_100.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_100.png
index 18cd25c..234bb63 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_100.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_15.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_15.png
index ecd4734..e3c6920 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_15.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_28.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_28.png
index dc54996..3dfbe4c 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_28.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_43.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_43.png
index 758a874..3f493f1 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_43.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_57.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_57.png
index c4ab7d5..0cce725 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_57.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_71.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_71.png
index a63e7e3..f6fff00 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_71.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_85.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_85.png
index b0f7aa6..35ef746 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_85.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_unknown.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_unknown.png
index 71fe29f..f5fbbfb 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_unknown.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_unknown.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png
index 9bd89fd..1302a26 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_on.png
index a1c0911..7ac3015 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_on.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png
index 1d9a027..b2b563b 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png
index fabb79c..b1c8753 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_default_user.png
new file mode 100644
index 0000000..fd9b677
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_default_user.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png
index 98683f9..f84e614 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png
index a5351b2..b2033df 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring.png
index 7d2d650..eb6d5a6 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_rotation_locked.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_rotation_locked.png
index b641f40..0098df4 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_rotation_locked.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_rotation_locked.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
index 349370d..011a0e8 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png
index 22aea9d..7419be9 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png
index 88df979..ddf4217 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png
index cbac90f..e237331 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png
index a085bf4..e074dd3 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png
index f104e1a..12abe5c 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png
index 3f0a8df..8d84c6e 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png
index da0a281..0a42598 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png
index a6e8c21..08634e3 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png
index f6eeb1d..10f1d09 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png
index 32ff8ff..1cbe239 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png
index 1fca536..9507162 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png
index e5fe0b2..deb8c87 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png
index bf53c7c..7186579 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png
index 2e97c3a..1aa2393 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png
index 4684eaa..adafb2c 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png
index 0bff121..67e2e11 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png
index 9836082..f47c63e 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png
index 1877a28..2421050 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png
new file mode 100644
index 0000000..cb4782e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png
index d888704..0dc8a58 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png
index 029f109..752c3f7 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
index baa6d86..7a14016 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
index 633bfc8..af7f76d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
index 6c46e32..2af3c24 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
index dea0415..a4e0243 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png
index 53d0915..16193e7 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png
index d1ee39b..780a511 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png
new file mode 100644
index 0000000..42fdbe8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png
index ad0ba68..005c6c6 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png
index 54236b4..a088e83 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png
index 7d2218b..6c2deb2 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png
index 152c428..fdb7a9b 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png
new file mode 100644
index 0000000..7d9f032
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png
new file mode 100644
index 0000000..896eacc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png
new file mode 100644
index 0000000..0224da1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png
new file mode 100644
index 0000000..fe28671
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
index 2836e4c..7a14016 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
index 01bbe33..af7f76d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
index b36c4c3..66c3b92 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
index 07f2012..a4e0243 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/qs_tile_background.xml b/packages/SystemUI/res/drawable/qs_tile_background.xml
new file mode 100644
index 0000000..83dadd8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_tile_background.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true">
+ <color android:color="#252725" />
+ </item>
+ <item>
+ <color android:color="#1B1D1B" />
+ </item>
+</selector>
diff --git a/packages/SystemUI/res/layout/quick_settings.xml b/packages/SystemUI/res/layout/quick_settings.xml
index d89f279..2dd3b9f 100644
--- a/packages/SystemUI/res/layout/quick_settings.xml
+++ b/packages/SystemUI/res/layout/quick_settings.xml
@@ -22,16 +22,20 @@
android:background="@drawable/notification_panel_bg"
>
<!-- TODO: Put into ScrollView -->
- <com.android.systemui.statusbar.phone.QuickSettingsContainerView
- android:id="@+id/quick_settings_container"
+ <ScrollView
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingBottom="@dimen/quick_settings_container_padding"
- android:paddingLeft="@dimen/quick_settings_container_padding"
- android:paddingRight="@dimen/quick_settings_container_padding"
- android:animateLayoutChanges="true"
- android:columnCount="@integer/quick_settings_num_columns"
- />
+ android:layout_height="wrap_content">
+ <com.android.systemui.statusbar.phone.QuickSettingsContainerView
+ android:id="@+id/quick_settings_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingBottom="@dimen/quick_settings_container_padding"
+ android:paddingLeft="@dimen/quick_settings_container_padding"
+ android:paddingRight="@dimen/quick_settings_container_padding"
+ android:animateLayoutChanges="true"
+ android:columnCount="@integer/quick_settings_num_columns"
+ />
+ </ScrollView>
<LinearLayout android:id="@+id/handle"
android:layout_width="match_parent"
android:layout_height="@dimen/close_handle_height"
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index 528121e..5f46e96 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -24,14 +24,17 @@
<ImageView
android:id="@+id/brightness_icon"
style="@style/SystemBarPanelSettingsIcon"
+ android:layout_gravity="center_vertical"
+ android:paddingRight="10dp"
android:src="@drawable/ic_sysbar_brightness"
/>
<com.android.systemui.statusbar.policy.ToggleSlider
android:id="@+id/brightness_slider"
android:layout_width="0dp"
- android:layout_height="match_parent"
+ android:layout_height="40dp"
android:layout_weight="1"
android:layout_marginRight="2dp"
+ android:layout_gravity="center_vertical"
systemui:text="@string/status_bar_settings_auto_brightness_label"
/>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/quick_settings_tile.xml b/packages/SystemUI/res/layout/quick_settings_tile.xml
index a571393..911f6a2 100644
--- a/packages/SystemUI/res/layout/quick_settings_tile.xml
+++ b/packages/SystemUI/res/layout/quick_settings_tile.xml
@@ -17,4 +17,4 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="@dimen/quick_settings_cell_height"
- android:background="#1B1D1B" /> \ No newline at end of file
+ android:background="@drawable/qs_tile_background" /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml b/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml
index 7cae199..ac872e6 100644
--- a/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml
+++ b/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml
@@ -16,6 +16,7 @@
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/TextAppearance.QuickSettings.TileView"
+ android:id="@+id/brightness_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_user.xml b/packages/SystemUI/res/layout/quick_settings_tile_user.xml
index 33d9a09..08e8e20 100644
--- a/packages/SystemUI/res/layout/quick_settings_tile_user.xml
+++ b/packages/SystemUI/res/layout/quick_settings_tile_user.xml
@@ -17,6 +17,12 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_qs_default_user"
+ android:scaleType="centerCrop"
+ />
<TextView
style="@style/TextAppearance.QuickSettings.TileView"
android:id="@+id/user_textview"
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index b65b013..cbd9957 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -409,6 +409,8 @@
<string name="quick_settings_battery_charged_label">Charged</string>
<!-- QuickSettings: Bluetooth [CHAR LIMIT=NONE] -->
<string name="quick_settings_bluetooth_label">Bluetooth</string>
+ <!-- QuickSettings: Bluetooth (Multiple) [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_bluetooth_multiple_devices_label">Bluetooth (<xliff:g id="number">%d</xliff:g> Devices)</string>
<!-- QuickSettings: Brightness [CHAR LIMIT=NONE] -->
<string name="quick_settings_brightness_label">Brightness</string>
<!-- QuickSettings: Rotation Unlocked [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
index cd33951..9c3756c 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
@@ -33,6 +33,7 @@ import com.android.systemui.statusbar.tablet.StatusBarPanel;
public class RecentsActivity extends Activity {
public static final String TOGGLE_RECENTS_INTENT = "com.android.systemui.TOGGLE_RECENTS";
public static final String CLOSE_RECENTS_INTENT = "com.android.systemui.CLOSE_RECENTS";
+ private static final String WAS_SHOWING = "was_showing";
private RecentsPanelView mRecentsPanel;
private IntentFilter mIntentFilter;
@@ -139,7 +140,10 @@ public class RecentsActivity extends Activity {
mRecentsPanel.setMinSwipeAlpha(
getResources().getInteger(R.integer.config_recent_item_min_alpha) / 100f);
- handleIntent(getIntent());
+ if (savedInstanceState == null ||
+ savedInstanceState.getBoolean(WAS_SHOWING)) {
+ handleIntent(getIntent());
+ }
mIntentFilter = new IntentFilter();
mIntentFilter.addAction(CLOSE_RECENTS_INTENT);
registerReceiver(mIntentReceiver, mIntentFilter);
@@ -147,6 +151,11 @@ public class RecentsActivity extends Activity {
}
@Override
+ protected void onSaveInstanceState(Bundle outState) {
+ outState.putBoolean(WAS_SHOWING, mRecentsPanel.isShowing());
+ }
+
+ @Override
protected void onDestroy() {
final SystemUIApplication app = (SystemUIApplication) getApplication();
final RecentTasksLoader recentTasksLoader = app.getRecentTasksLoader();
@@ -165,7 +174,7 @@ public class RecentsActivity extends Activity {
if (TOGGLE_RECENTS_INTENT.equals(intent.getAction())) {
if (mRecentsPanel != null) {
- if (mRecentsPanel.isShowing() && mForeground) {
+ if (mRecentsPanel.isShowing()) {
dismissAndGoBack();
} else {
final SystemUIApplication app = (SystemUIApplication) getApplication();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
index 3a10155..9fb6d7c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone;
import android.app.Dialog;
import android.app.PendingIntent;
+import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -35,6 +36,7 @@ import android.hardware.display.DisplayManager;
import android.hardware.display.WifiDisplay;
import android.hardware.display.WifiDisplayStatus;
import android.net.Uri;
+import android.os.Debug;
import android.provider.ContactsContract;
import android.provider.Settings;
import android.view.LayoutInflater;
@@ -51,6 +53,7 @@ import android.widget.TextView;
import com.android.internal.view.RotationPolicy;
import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.QuickSettingsModel.BrightnessState;
import com.android.systemui.statusbar.phone.QuickSettingsModel.RSSIState;
import com.android.systemui.statusbar.phone.QuickSettingsModel.State;
import com.android.systemui.statusbar.phone.QuickSettingsModel.UserState;
@@ -63,6 +66,7 @@ import com.android.systemui.statusbar.policy.ToggleSlider;
import java.util.ArrayList;
import java.util.Comparator;
+import java.util.Set;
/**
@@ -80,6 +84,7 @@ class QuickSettings {
private WifiDisplayListAdapter mWifiDisplayListAdapter;
private BrightnessController mBrightnessController;
+ private BluetoothController mBluetoothController;
private Dialog mBrightnessDialog;
private CursorLoader mUserInfoLoader;
@@ -116,10 +121,6 @@ class QuickSettings {
IntentFilter filter = new IntentFilter();
filter.addAction(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED);
mContext.registerReceiver(mReceiver, filter);
-
- setupQuickSettings();
- updateWifiDisplayStatus();
- updateResources();
}
void setBar(PanelBar bar) {
@@ -132,6 +133,12 @@ class QuickSettings {
void setup(NetworkController networkController, BluetoothController bluetoothController,
BatteryController batteryController, LocationController locationController) {
+ mBluetoothController = bluetoothController;
+
+ setupQuickSettings();
+ updateWifiDisplayStatus();
+ updateResources();
+
networkController.addNetworkSignalChangedCallback(mModel);
bluetoothController.addStateChangedCallback(mModel);
batteryController.addStateChangedCallback(mModel);
@@ -273,7 +280,7 @@ class QuickSettings {
@Override
public void refreshView(QuickSettingsTileView view, State state) {
TextView tv = (TextView) view.findViewById(R.id.wifi_textview);
- tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0);
+ tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0);
tv.setText(state.label);
}
});
@@ -329,7 +336,7 @@ class QuickSettings {
@Override
public void refreshView(QuickSettingsTileView view, State state) {
TextView tv = (TextView) view.findViewById(R.id.rotation_lock_textview);
- tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0);
+ tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0);
tv.setText(state.label);
}
});
@@ -381,7 +388,7 @@ class QuickSettings {
@Override
public void refreshView(QuickSettingsTileView view, State state) {
TextView tv = (TextView) view.findViewById(R.id.airplane_mode_textview);
- tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0);
+ tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0);
}
});
parent.addView(airplaneTile);
@@ -401,7 +408,27 @@ class QuickSettings {
@Override
public void refreshView(QuickSettingsTileView view, State state) {
TextView tv = (TextView) view.findViewById(R.id.bluetooth_textview);
- tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0);
+ tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0);
+
+ Resources r = mContext.getResources();
+ String label = null;
+ /*
+ //TODO: Show connected bluetooth device label
+ Set<BluetoothDevice> btDevices =
+ mBluetoothController.getBondedBluetoothDevices();
+ if (btDevices.size() == 1) {
+ // Show the name of the bluetooth device you are connected to
+ label = btDevices.iterator().next().getName();
+ } else if (btDevices.size() > 1) {
+ // Show a generic label about the number of bluetooth devices
+ label = r.getString(R.string.quick_settings_bluetooth_multiple_devices_label,
+ btDevices.size());
+ }
+ */
+ if (label == null) {
+ label = r.getString(R.string.quick_settings_bluetooth_label);
+ }
+ tv.setText(label);
}
});
parent.addView(bluetoothTile);
@@ -414,11 +441,17 @@ class QuickSettings {
brightnessTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- // startSettingsActivity(android.provider.Settings.ACTION_DISPLAY_SETTINGS);
mBar.collapseAllPanels(true);
showBrightnessDialog();
}
});
+ mModel.addBrightnessTile(brightnessTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView view, State state) {
+ TextView tv = (TextView) view.findViewById(R.id.brightness_textview);
+ tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0);
+ }
+ });
parent.addView(brightnessTile);
}
@@ -529,6 +562,7 @@ class QuickSettings {
mBrightnessController = new BrightnessController(mContext,
(ToggleSlider) mBrightnessDialog.findViewById(R.id.brightness_slider));
+ mBrightnessController.addStateChangedCallback(mModel);
mBrightnessDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
index f239110..485b3e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
@@ -39,6 +39,7 @@ import android.view.inputmethod.InputMethodSubtype;
import com.android.internal.view.RotationPolicy;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
+import com.android.systemui.statusbar.policy.BrightnessController.BrightnessStateChangeCallback;
import com.android.systemui.statusbar.policy.LocationController.LocationGpsStateChangeCallback;
import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
@@ -48,7 +49,8 @@ import java.util.List;
class QuickSettingsModel implements BluetoothStateChangeCallback,
NetworkSignalChangedCallback,
BatteryStateChangeCallback,
- LocationGpsStateChangeCallback {
+ LocationGpsStateChangeCallback,
+ BrightnessStateChangeCallback {
/** Represents the state of a given attribute. */
static class State {
@@ -67,6 +69,9 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
static class UserState extends State {
Drawable avatar;
}
+ static class BrightnessState extends State {
+ boolean autoBrightness;
+ }
/** The callback to update a given tile. */
interface RefreshCallback {
@@ -150,6 +155,10 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
private RefreshCallback mRotationLockCallback;
private State mRotationLockState = new State();
+ private QuickSettingsTileView mBrightnessTile;
+ private RefreshCallback mBrightnessCallback;
+ private BrightnessState mBrightnessState = new BrightnessState();
+
public QuickSettingsModel(Context context) {
mContext = context;
mHandler = new Handler();
@@ -406,4 +415,23 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
}
}
+ // Brightness
+ void addBrightnessTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mBrightnessTile = view;
+ mBrightnessCallback = cb;
+ onBrightnessLevelChanged();
+ }
+ @Override
+ public void onBrightnessLevelChanged() {
+ int mode = Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+ mBrightnessState.autoBrightness =
+ (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+ mBrightnessState.iconId = mBrightnessState.autoBrightness
+ ? R.drawable.ic_qs_brightness_auto_on
+ : R.drawable.ic_qs_brightness_auto_off;
+ mBrightnessCallback.refreshView(mBrightnessTile, mBrightnessState);
+ }
+
} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java
index e517dde..0567371 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback;
+import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -25,10 +26,12 @@ import android.content.IntentFilter;
import android.view.View;
import android.widget.ImageView;
-import java.util.ArrayList;
-
import com.android.systemui.R;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
public class BluetoothController extends BroadcastReceiver {
private static final String TAG = "StatusBar.BluetoothController";
@@ -39,6 +42,8 @@ public class BluetoothController extends BroadcastReceiver {
private int mContentDescriptionId = 0;
private boolean mEnabled = false;
+ private Set<BluetoothDevice> mBondedDevices = new HashSet<BluetoothDevice>();
+
private ArrayList<BluetoothStateChangeCallback> mChangeCallbacks =
new ArrayList<BluetoothStateChangeCallback>();
@@ -48,6 +53,7 @@ public class BluetoothController extends BroadcastReceiver {
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
+ filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
context.registerReceiver(this, filter);
final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
@@ -56,6 +62,7 @@ public class BluetoothController extends BroadcastReceiver {
handleConnectionStateChange(adapter.getConnectionState());
}
refreshViews();
+ updateBondedBluetoothDevices();
}
public void addIconView(ImageView v) {
@@ -66,6 +73,10 @@ public class BluetoothController extends BroadcastReceiver {
mChangeCallbacks.add(cb);
}
+ public Set<BluetoothDevice> getBondedBluetoothDevices() {
+ return mBondedDevices;
+ }
+
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
@@ -77,8 +88,25 @@ public class BluetoothController extends BroadcastReceiver {
handleConnectionStateChange(
intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE,
BluetoothAdapter.STATE_DISCONNECTED));
+ } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
+ // Fall through and update bonded devices and refresh view
}
refreshViews();
+ updateBondedBluetoothDevices();
+ }
+
+ private void updateBondedBluetoothDevices() {
+ Set<BluetoothDevice> devices = BluetoothAdapter.getDefaultAdapter().getBondedDevices();
+ if (devices != null) {
+ mBondedDevices.clear();
+ for (BluetoothDevice device : devices) {
+ if (device.getBondState() != BluetoothDevice.BOND_NONE) {
+ mBondedDevices.add(device);
+ }
+ }
+ } else {
+ mBondedDevices.clear();
+ }
}
public void handleAdapterStateChange(int adapterState) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java
index 457e9dd..bb59420 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java
@@ -29,6 +29,10 @@ import android.util.Slog;
import android.view.IWindowManager;
import android.widget.CompoundButton;
+import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
+
+import java.util.ArrayList;
+
public class BrightnessController implements ToggleSlider.Listener {
private static final String TAG = "StatusBar.BrightnessController";
@@ -39,6 +43,13 @@ public class BrightnessController implements ToggleSlider.Listener {
private ToggleSlider mControl;
private IPowerManager mPower;
+ private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
+ new ArrayList<BrightnessStateChangeCallback>();
+
+ public interface BrightnessStateChangeCallback {
+ public void onBrightnessLevelChanged();
+ }
+
public BrightnessController(Context context, ToggleSlider control) {
mContext = context;
mControl = control;
@@ -79,6 +90,10 @@ public class BrightnessController implements ToggleSlider.Listener {
control.setOnChangedListener(this);
}
+ public void addStateChangedCallback(BrightnessStateChangeCallback cb) {
+ mChangeCallbacks.add(cb);
+ }
+
public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) {
setMode(automatic ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
: Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
@@ -94,6 +109,10 @@ public class BrightnessController implements ToggleSlider.Listener {
});
}
}
+
+ for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
+ cb.onBrightnessLevelChanged();
+ }
}
private void setMode(int mode) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 556ae59..ee82777 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -556,7 +556,8 @@ public class NetworkController extends BroadcastReceiver {
}
}
mPhoneSignalIconId = iconList[iconLevel];
- mQSPhoneSignalIconId = TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[iconLevel];
+ mQSPhoneSignalIconId =
+ TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[mInetCondition][iconLevel];
mContentDescriptionPhoneSignal = mContext.getString(
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[iconLevel]);
mDataSignalIconId = TelephonyIcons.DATA_SIGNAL_STRENGTH[mInetCondition][iconLevel];
@@ -863,7 +864,7 @@ public class NetworkController extends BroadcastReceiver {
private void updateWifiIcons() {
if (mWifiConnected) {
mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel];
- mQSWifiIconId = WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mWifiLevel];
+ mQSWifiIconId = WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel];
mContentDescriptionWifi = mContext.getString(
AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH[mWifiLevel]);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index de9b218..3b953a0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -35,12 +35,17 @@ class TelephonyIcons {
R.drawable.stat_sys_signal_4_fully }
};
- static final int[] QS_TELEPHONY_SIGNAL_STRENGTH = {
- R.drawable.ic_qs_signal_0,
+ static final int[][] QS_TELEPHONY_SIGNAL_STRENGTH = {
+ { R.drawable.ic_qs_signal_0,
R.drawable.ic_qs_signal_1,
R.drawable.ic_qs_signal_2,
R.drawable.ic_qs_signal_3,
- R.drawable.ic_qs_signal_4
+ R.drawable.ic_qs_signal_4 },
+ { R.drawable.ic_qs_signal_full_0,
+ R.drawable.ic_qs_signal_full_1,
+ R.drawable.ic_qs_signal_full_2,
+ R.drawable.ic_qs_signal_full_3,
+ R.drawable.ic_qs_signal_full_4 }
};
static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING = {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
index f5d6484..8cc0338 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
@@ -32,12 +32,17 @@ class WifiIcons {
R.drawable.stat_sys_wifi_signal_4_fully }
};
- static final int[] QS_WIFI_SIGNAL_STRENGTH = {
- R.drawable.ic_qs_wifi_not_connected,
+ static final int[][] QS_WIFI_SIGNAL_STRENGTH = {
+ { R.drawable.ic_qs_wifi_0,
R.drawable.ic_qs_wifi_1,
R.drawable.ic_qs_wifi_2,
R.drawable.ic_qs_wifi_3,
- R.drawable.ic_qs_wifi_4
+ R.drawable.ic_qs_wifi_4 },
+ { R.drawable.ic_qs_wifi_0,
+ R.drawable.ic_qs_wifi_full_1,
+ R.drawable.ic_qs_wifi_full_2,
+ R.drawable.ic_qs_wifi_full_3,
+ R.drawable.ic_qs_wifi_full_4 }
};
static final int WIFI_LEVEL_COUNT = WIFI_SIGNAL_STRENGTH[0].length;
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSubdivisionLayout.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSubdivisionLayout.java
index b7d94a9..1cd796c 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSubdivisionLayout.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSubdivisionLayout.java
@@ -97,12 +97,14 @@ public class KeyguardSubdivisionLayout extends ViewGroup {
leafs.clear();
getLeafs(leafs, 1);
- // We find the first leaf who's depth is not
+ // If the tree is complete, then we start a new level at the rightmost side.
double r = log2(leafs.size());
if (Math.ceil(r) == Math.floor(r)) {
return leafs.get(leafs.size() - 1);
}
+ // Tree is not complete, find the first leaf who's depth is less than the depth of
+ // the tree.
int treeDepth = depth();
for (int i = leafs.size() - 1; i >= 0; i--) {
BiTree n = leafs.get(i);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
index f957753..70a6ffa 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
@@ -91,7 +91,14 @@ public class KeyguardWidgetFrame extends FrameLayout {
mForegroundAlpha = (int) Math.round((r * 255));
mForegroundDrawable.setAlpha(mForegroundAlpha);
+ if (getLayerType() != LAYER_TYPE_HARDWARE) {
+ setLayerType(LAYER_TYPE_HARDWARE, null);
+ }
invalidate();
+ } else {
+ if (getLayerType() != LAYER_TYPE_NONE) {
+ setLayerType(LAYER_TYPE_NONE, null);
+ }
}
}
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 989477f..db042b5 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -1794,7 +1794,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
private final void updateLruProcessInternalLocked(ProcessRecord app,
- boolean oomAdj, boolean updateActivityTime, int bestPos) {
+ boolean updateActivityTime, int bestPos) {
// put it on the LRU to keep track of when it should be exited.
int lrui = mLruProcesses.indexOf(app);
if (lrui >= 0) mLruProcesses.remove(lrui);
@@ -1851,7 +1851,7 @@ public final class ActivityManagerService extends ActivityManagerNative
if (cr.binding != null && cr.binding.service != null
&& cr.binding.service.app != null
&& cr.binding.service.app.lruSeq != mLruSeq) {
- updateLruProcessInternalLocked(cr.binding.service.app, false,
+ updateLruProcessInternalLocked(cr.binding.service.app,
updateActivityTime, i+1);
}
}
@@ -1859,21 +1859,21 @@ public final class ActivityManagerService extends ActivityManagerNative
for (int j=app.conProviders.size()-1; j>=0; j--) {
ContentProviderRecord cpr = app.conProviders.get(j).provider;
if (cpr.proc != null && cpr.proc.lruSeq != mLruSeq) {
- updateLruProcessInternalLocked(cpr.proc, false,
+ updateLruProcessInternalLocked(cpr.proc,
updateActivityTime, i+1);
}
}
-
- //Slog.i(TAG, "Putting proc to front: " + app.processName);
- if (oomAdj) {
- updateOomAdjLocked();
- }
}
final void updateLruProcessLocked(ProcessRecord app,
boolean oomAdj, boolean updateActivityTime) {
mLruSeq++;
- updateLruProcessInternalLocked(app, oomAdj, updateActivityTime, 0);
+ updateLruProcessInternalLocked(app, updateActivityTime, 0);
+
+ //Slog.i(TAG, "Putting proc to front: " + app.processName);
+ if (oomAdj) {
+ updateOomAdjLocked();
+ }
}
final ProcessRecord getProcessRecordLocked(
@@ -4455,7 +4455,13 @@ public final class ActivityManagerService extends ActivityManagerNative
enableScreenAfterBoot();
}
}
-
+
+ public final void activityResumed(IBinder token) {
+ final long origId = Binder.clearCallingIdentity();
+ mMainStack.activityResumed(token);
+ Binder.restoreCallingIdentity(origId);
+ }
+
public final void activityPaused(IBinder token) {
final long origId = Binder.clearCallingIdentity();
mMainStack.activityPaused(token, false);
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index f72d318..29ee0bc 100755
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -52,7 +52,6 @@ import android.os.IBinder;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.PowerManager;
-import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
@@ -755,8 +754,6 @@ final class ActivityStack {
completeResumeLocked(r);
checkReadyForSleepLocked();
if (DEBUG_SAVED_STATE) Slog.i(TAG, "Launch completed; removing icicle of " + r.icicle);
- r.icicle = null;
- r.haveState = false;
} else {
// This activity is not starting in the resumed state... which
// should look like we asked it to pause+stop (but remain visible),
@@ -1010,7 +1007,21 @@ final class ActivityStack {
resumeTopActivityLocked(null);
}
}
-
+
+ final void activityResumed(IBinder token) {
+ ActivityRecord r = null;
+
+ synchronized (mService) {
+ int index = indexOfTokenLocked(token);
+ if (index >= 0) {
+ r = mHistory.get(index);
+ if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; dropping state of: " + r);
+ r.icicle = null;
+ r.haveState = false;
+ }
+ }
+ }
+
final void activityPaused(IBinder token, boolean timeout) {
if (DEBUG_PAUSE) Slog.v(
TAG, "Activity paused: token=" + token + ", timeout=" + timeout);
@@ -1488,6 +1499,15 @@ final class ActivityStack {
// can be resumed...
if (mResumedActivity != null) {
if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
+ // At this point we want to put the upcoming activity's process
+ // at the top of the LRU list, since we know we will be needing it
+ // very soon and it would be a waste to let it get killed if it
+ // happens to be sitting towards the end.
+ if (next.app != null && next.app.thread != null) {
+ // No reason to do full oom adj update here; we'll let that
+ // happen whenever it needs to later.
+ mService.updateLruProcessLocked(next.app, false, true);
+ }
startPausingLocked(userLeaving, false);
return true;
}
@@ -1728,11 +1748,6 @@ final class ActivityStack {
"resume-exception", true);
return true;
}
-
- // Didn't need to use the icicle, and it is now out of date.
- if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; didn't need icicle of: " + next);
- next.icicle = null;
- next.haveState = false;
next.stopped = false;
} else {
@@ -2578,7 +2593,6 @@ final class ActivityStack {
mDismissKeyguardOnNextActivity = false;
mService.mWindowManager.dismissKeyguard();
}
- Slog.i(TAG, "DONE STARTING!");
return err;
}
diff --git a/services/java/com/android/server/display/WifiDisplayController.java b/services/java/com/android/server/display/WifiDisplayController.java
index 141cbd7..3bc19a1 100644
--- a/services/java/com/android/server/display/WifiDisplayController.java
+++ b/services/java/com/android/server/display/WifiDisplayController.java
@@ -129,6 +129,9 @@ final class WifiDisplayController implements DumpUtils.Dump {
// True if RTSP has connected.
private boolean mRemoteDisplayConnected;
+ // True if the remote submix is enabled.
+ private boolean mRemoteSubmixOn;
+
public WifiDisplayController(Context context, Handler handler, Listener listener) {
mContext = context;
mHandler = handler;
@@ -160,6 +163,7 @@ final class WifiDisplayController implements DumpUtils.Dump {
pw.println("mRemoteDisplay=" + mRemoteDisplay);
pw.println("mRemoteDisplayInterface=" + mRemoteDisplayInterface);
pw.println("mRemoteDisplayConnected=" + mRemoteDisplayConnected);
+ pw.println("mRemoteSubmixOn=" + mRemoteSubmixOn);
pw.println("mKnownWifiDisplayPeers: size=" + mKnownWifiDisplayPeers.size());
for (WifiP2pDevice device : mKnownWifiDisplayPeers) {
@@ -390,16 +394,14 @@ final class WifiDisplayController implements DumpUtils.Dump {
Slog.i(TAG, "Stopped listening for RTSP connection on " + mRemoteDisplayInterface
+ " from Wifi display: " + mConnectedDevice.deviceName);
- if (mRemoteDisplayConnected) {
- mAudioManager.setRemoteSubmixOn(false, REMOTE_SUBMIX_ADDRESS);
- }
-
mRemoteDisplay.dispose();
mRemoteDisplay = null;
mRemoteDisplayInterface = null;
mRemoteDisplayConnected = false;
mHandler.removeCallbacks(mRtspTimeout);
+ setRemoteSubmixOn(false);
+
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -483,6 +485,8 @@ final class WifiDisplayController implements DumpUtils.Dump {
mConnectingDevice = mDesiredDevice;
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = mConnectingDevice.deviceAddress;
+ // Helps with STA & P2P concurrency
+ config.groupOwnerIntent = WifiP2pConfig.MAX_GO_INTENT;
final WifiDisplay display = createWifiDisplay(mConnectingDevice);
mHandler.post(new Runnable() {
@@ -527,6 +531,8 @@ final class WifiDisplayController implements DumpUtils.Dump {
return; // done
}
+ setRemoteSubmixOn(true);
+
final WifiP2pDevice oldDevice = mConnectedDevice;
final int port = getPortNumber(mConnectedDevice);
final String iface = addr.getHostAddress() + ":" + port;
@@ -545,8 +551,6 @@ final class WifiDisplayController implements DumpUtils.Dump {
mRemoteDisplayConnected = true;
mHandler.removeCallbacks(mRtspTimeout);
- mAudioManager.setRemoteSubmixOn(true, REMOTE_SUBMIX_ADDRESS);
-
final WifiDisplay display = createWifiDisplay(mConnectedDevice);
mHandler.post(new Runnable() {
@Override
@@ -583,6 +587,13 @@ final class WifiDisplayController implements DumpUtils.Dump {
}
}
+ private void setRemoteSubmixOn(boolean on) {
+ if (mRemoteSubmixOn != on) {
+ mRemoteSubmixOn = on;
+ mAudioManager.setRemoteSubmixOn(on, REMOTE_SUBMIX_ADDRESS);
+ }
+ }
+
private void handleStateChanged(boolean enabled) {
if (mWifiP2pEnabled != enabled) {
mWifiP2pEnabled = enabled;
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index ce52d2b..536c612 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -3535,8 +3535,8 @@ public class PackageManagerService extends IPackageManager.Stub {
return DEX_OPT_DEFERRED;
} else {
Log.i(TAG, "Running dexopt on: " + pkg.applicationInfo.packageName);
- ret = mInstaller.dexopt(path, pkg.applicationInfo.uid,
- !isForwardLocked(pkg));
+ final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
+ ret = mInstaller.dexopt(path, sharedGid, !isForwardLocked(pkg));
pkg.mDidDexOpt = true;
performed = true;
}
diff --git a/services/java/com/android/server/pm/UserManagerService.java b/services/java/com/android/server/pm/UserManagerService.java
index a58c4ea..690d7c9 100644
--- a/services/java/com/android/server/pm/UserManagerService.java
+++ b/services/java/com/android/server/pm/UserManagerService.java
@@ -196,7 +196,7 @@ public class UserManagerService extends IUserManager.Stub {
synchronized (mPackagesLock) {
UserInfo info = mUsers.get(userId);
if (info == null) return null;
- ParcelFileDescriptor fd = updateIconBitmapLocked(info);
+ ParcelFileDescriptor fd = openIconBitmapLocked(info, true /* write */);
if (fd != null) {
writeUserLocked(info);
}
@@ -205,6 +205,17 @@ public class UserManagerService extends IUserManager.Stub {
}
@Override
+ public ParcelFileDescriptor getUserIcon(int userId) {
+ checkManageUsersPermission("read users");
+ synchronized (mPackagesLock) {
+ UserInfo info = mUsers.get(userId);
+ if (info == null || info.iconPath == null) return null;
+ ParcelFileDescriptor fd = openIconBitmapLocked(info, false /* read */);
+ return fd;
+ }
+ }
+
+ @Override
public void setGuestEnabled(boolean enable) {
checkManageUsersPermission("enable guest users");
synchronized (mPackagesLock) {
@@ -278,7 +289,7 @@ public class UserManagerService extends IUserManager.Stub {
}
}
- private ParcelFileDescriptor updateIconBitmapLocked(UserInfo info) {
+ private ParcelFileDescriptor openIconBitmapLocked(UserInfo info, boolean toWrite) {
try {
File dir = new File(mUsersDir, Integer.toString(info.id));
File file = new File(dir, USER_PHOTO_FILENAME);
@@ -290,8 +301,10 @@ public class UserManagerService extends IUserManager.Stub {
-1, -1);
}
ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
- MODE_CREATE|MODE_READ_WRITE);
- info.iconPath = file.getAbsolutePath();
+ toWrite ? MODE_CREATE|MODE_READ_WRITE : MODE_READ_WRITE);
+ if (toWrite) {
+ info.iconPath = file.getAbsolutePath();
+ }
return fd;
} catch (FileNotFoundException e) {
Slog.w(LOG_TAG, "Error setting photo for user ", e);
@@ -688,7 +701,7 @@ public class UserManagerService extends IUserManager.Stub {
*/
private int getNextAvailableIdLocked() {
synchronized (mPackagesLock) {
- int i = 0;
+ int i = 10;
while (i < Integer.MAX_VALUE) {
if (mUsers.indexOfKey(i) < 0) {
break;
diff --git a/services/java/com/android/server/updatable/ConfigUpdateInstallReceiver.java b/services/java/com/android/server/updatable/ConfigUpdateInstallReceiver.java
index c1f45a8..a74a648 100644
--- a/services/java/com/android/server/updatable/ConfigUpdateInstallReceiver.java
+++ b/services/java/com/android/server/updatable/ConfigUpdateInstallReceiver.java
@@ -89,12 +89,15 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver {
// get the hash of the currently used value
String currentHash = getCurrentHash(getCurrentContent());
if (!verifyVersion(currentVersion, altVersion)) {
- Slog.e(TAG, "New version is not greater than current version, aborting!");
+ EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED,
+ "New version is not greater than current version");
} else if (!verifyPreviousHash(currentHash, altRequiredHash)) {
- Slog.e(TAG, "Current hash did not match required value, aborting!");
+ EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED,
+ "Current hash did not match required value");
} else if (!verifySignature(altContent, altVersion, altRequiredHash, altSig,
cert)) {
- Slog.e(TAG, "Signature did not verify, aborting!");
+ EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED,
+ "Signature did not verify");
} else {
// install the new content
Slog.i(TAG, "Found new update, installing...");
@@ -103,8 +106,12 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver {
}
} catch (Exception e) {
Slog.e(TAG, "Could not update content!", e);
- EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED,
- updateDir.toString());
+ // keep the error message <= 100 chars
+ String errMsg = e.toString();
+ if (errMsg.length() > 100) {
+ errMsg = errMsg.substring(0, 99);
+ }
+ EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED, errMsg);
}
}
}.start();
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index 4494058..0a4e6d3 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -101,6 +101,23 @@ public class WindowAnimator {
boolean mInitialized = false;
+ // forceHiding states.
+ static final int KEYGUARD_NOT_SHOWN = 0;
+ static final int KEYGUARD_ANIMATING_IN = 1;
+ static final int KEYGUARD_SHOWN = 2;
+ static final int KEYGUARD_ANIMATING_OUT = 3;
+ int mForceHiding = KEYGUARD_NOT_SHOWN;
+
+ private String forceHidingToString() {
+ switch (mForceHiding) {
+ case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN";
+ case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
+ case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN";
+ case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
+ default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
+ }
+ }
+
WindowAnimator(final WindowManagerService service) {
mService = service;
mContext = service.mContext;
@@ -280,13 +297,7 @@ public class WindowAnimator {
getDisplayContentsAnimatorLocked(displayId).mWinAnimators;
ArrayList<WindowStateAnimator> unForceHiding = null;
boolean wallpaperInUnForceHiding = false;
-
- // forceHiding states.
- final int KEYGUARD_NOT_SHOWN = 0;
- final int KEYGUARD_ANIMATING_IN = 1;
- final int KEYGUARD_SHOWN = 2;
- final int KEYGUARD_ANIMATING_OUT = 3;
- int forceHiding = KEYGUARD_NOT_SHOWN;
+ mForceHiding = KEYGUARD_NOT_SHOWN;
for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
WindowStateAnimator winAnimator = winAnimatorList.get(i);
@@ -329,16 +340,16 @@ public class WindowAnimator {
if (win.isReadyForDisplay()) {
if (nowAnimating) {
if (winAnimator.mAnimationIsEntrance) {
- forceHiding = KEYGUARD_ANIMATING_IN;
+ mForceHiding = KEYGUARD_ANIMATING_IN;
} else {
- forceHiding = KEYGUARD_ANIMATING_OUT;
+ mForceHiding = KEYGUARD_ANIMATING_OUT;
}
} else {
- forceHiding = KEYGUARD_SHOWN;
+ mForceHiding = KEYGUARD_SHOWN;
}
}
if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
- "Force hide " + forceHiding
+ "Force hide " + mForceHiding
+ " hasSurface=" + win.mHasSurface
+ " policyVis=" + win.mPolicyVisibility
+ " destroying=" + win.mDestroying
@@ -350,9 +361,9 @@ public class WindowAnimator {
final boolean hideWhenLocked =
(winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
final boolean changed;
- if (((forceHiding == KEYGUARD_ANIMATING_IN)
+ if (((mForceHiding == KEYGUARD_ANIMATING_IN)
&& (!winAnimator.isAnimating() || hideWhenLocked))
- || ((forceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
+ || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
changed = win.hideLw(false, false);
if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
"Now policy hidden: " + win);
@@ -708,10 +719,11 @@ public class WindowAnimator {
if (dumpAll) {
if (mWindowDetachedWallpaper != null) {
pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
- pw.println(mWindowDetachedWallpaper);
+ pw.println(mWindowDetachedWallpaper);
}
pw.print(prefix); pw.print("mAnimTransactionSequence=");
- pw.println(mAnimTransactionSequence);
+ pw.print(mAnimTransactionSequence);
+ pw.println(" mForceHiding=" + forceHidingToString());
for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
pw.print(prefix); pw.print("DisplayContentsAnimator #");
pw.println(mDisplayContentsAnimators.keyAt(i));
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index a06ee3b..b62028e 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -1133,7 +1133,8 @@ final class WindowState implements WindowManagerPolicy.WindowState {
pw.print(prefix); pw.print("mConfiguration="); pw.println(mConfiguration);
}
pw.print(prefix); pw.print("mHasSurface="); pw.print(mHasSurface);
- pw.print(" mShownFrame="); mShownFrame.printShortString(pw); pw.println();
+ pw.print(" mShownFrame="); mShownFrame.printShortString(pw);
+ pw.print(" isReadyForDisplay()="); pw.println(isReadyForDisplay());
if (dumpAll) {
pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw);
pw.print(" last="); mLastFrame.printShortString(pw);
diff --git a/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java b/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java
index e39d53c..5e27ba7 100644
--- a/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java
+++ b/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java
@@ -72,6 +72,7 @@ public class MemoryUsageTest extends InstrumentationTestCase {
try {
processName = startApp(app);
measureMemory(app, processName, results);
+ closeApp();
} catch (NameNotFoundException e) {
Log.i(TAG, "Application " + app + " not found");
}
@@ -139,13 +140,22 @@ public class MemoryUsageTest extends InstrumentationTestCase {
return process;
}
+ private void closeApp() {
+ Intent homeIntent = new Intent(Intent.ACTION_MAIN);
+ homeIntent.addCategory(Intent.CATEGORY_HOME);
+ homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+ getInstrumentation().getContext().startActivity(homeIntent);
+ sleep(3000);
+ }
+
private void measureMemory(String appName, String processName,
Bundle results) {
List<Integer> pssData = new ArrayList<Integer>();
int pss = 0;
int iteration = 0;
while (iteration < MAX_ITERATIONS) {
- sleep();
+ sleep(SLEEP_TIME);
pss = getPss(processName);
Log.i(TAG, appName + "=" + pss);
if (pss < 0) {
@@ -184,9 +194,9 @@ public class MemoryUsageTest extends InstrumentationTestCase {
return (diff1 + diff2) < THRESHOLD;
}
- private void sleep() {
+ private void sleep(int time) {
try {
- Thread.sleep(SLEEP_TIME);
+ Thread.sleep(time);
} catch (InterruptedException e) {
// ignore
}
diff --git a/tools/aapt/Bundle.h b/tools/aapt/Bundle.h
index a5aa0b5..fde3bd6 100644
--- a/tools/aapt/Bundle.h
+++ b/tools/aapt/Bundle.h
@@ -61,7 +61,8 @@ public:
mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL),
mVersionCode(NULL), mVersionName(NULL), mCustomPackage(NULL), mExtraPackages(NULL),
mMaxResVersion(NULL), mDebugMode(false), mNonConstantId(false), mProduct(NULL),
- mUseCrunchCache(false), mArgc(0), mArgv(NULL)
+ mUseCrunchCache(false), mErrorOnFailedInsert(false), mOutputTextSymbols(NULL),
+ mArgc(0), mArgv(NULL)
{}
~Bundle(void) {}
@@ -110,6 +111,8 @@ public:
void setAutoAddOverlay(bool val) { mAutoAddOverlay = val; }
bool getGenDependencies() { return mGenDependencies; }
void setGenDependencies(bool val) { mGenDependencies = val; }
+ bool getErrorOnFailedInsert() { return mErrorOnFailedInsert; }
+ void setErrorOnFailedInsert(bool val) { mErrorOnFailedInsert = val; }
bool getUTF16StringsOption() {
return mWantUTF16 || !isMinSdkAtLeast(SDK_FROYO);
@@ -171,6 +174,8 @@ public:
void setProduct(const char * val) { mProduct = val; }
void setUseCrunchCache(bool val) { mUseCrunchCache = val; }
bool getUseCrunchCache() const { return mUseCrunchCache; }
+ const char* getOutputTextSymbols() const { return mOutputTextSymbols; }
+ void setOutputTextSymbols(const char* val) { mOutputTextSymbols = val; }
/*
* Set and get the file specification.
@@ -276,6 +281,8 @@ private:
bool mNonConstantId;
const char* mProduct;
bool mUseCrunchCache;
+ bool mErrorOnFailedInsert;
+ const char* mOutputTextSymbols;
/* file specification */
int mArgc;
diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp
index 9570c66..f398de0 100644
--- a/tools/aapt/Main.cpp
+++ b/tools/aapt/Main.cpp
@@ -69,7 +69,8 @@ void usage(void)
" [-F apk-file] [-J R-file-dir] \\\n"
" [--product product1,product2,...] \\\n"
" [-c CONFIGS] [--preferred-configurations CONFIGS] \\\n"
- " [raw-files-dir [raw-files-dir] ...]\n"
+ " [raw-files-dir [raw-files-dir] ...] \\\n"
+ " [--output-text-symbols DIR]\n"
"\n"
" Package the android resources. It will read assets and resources that are\n"
" supplied with the -M -A -S or raw-files-dir arguments. The -J -P -F and -R\n"
@@ -177,6 +178,14 @@ void usage(void)
" Make the resources ID non constant. This is required to make an R java class\n"
" that does not contain the final value but is used to make reusable compiled\n"
" libraries that need to access resources.\n"
+ " --error-on-failed-insert\n"
+ " Forces aapt to return an error if it fails to insert values into the manifest\n"
+ " with --debug-mode, --min-sdk-version, --target-sdk-version --version-code\n"
+ " and --version-name.\n"
+ " Insertion typically fails if the manifest already defines the attribute.\n"
+ " --output-text-symbols\n"
+ " Generates a text file containing the resource symbols of the R class in the\n"
+ " specified folder.\n"
" --ignore-assets\n"
" Assets to be ignored. Default pattern is:\n"
" %s\n",
@@ -542,6 +551,17 @@ int main(int argc, char* const argv[])
bundle.setInstrumentationPackageNameOverride(argv[0]);
} else if (strcmp(cp, "-auto-add-overlay") == 0) {
bundle.setAutoAddOverlay(true);
+ } else if (strcmp(cp, "-error-on-failed-insert") == 0) {
+ bundle.setErrorOnFailedInsert(true);
+ } else if (strcmp(cp, "-output-text-symbols") == 0) {
+ argc--;
+ argv++;
+ if (!argc) {
+ fprintf(stderr, "ERROR: No argument supplied for '-output-text-symbols' option\n");
+ wantUsage = true;
+ goto bail;
+ }
+ bundle.setOutputTextSymbols(argv[0]);
} else if (strcmp(cp, "-product") == 0) {
argc--;
argv++;
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index ee076e6..9c2e1b9 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -673,24 +673,40 @@ static bool applyFileOverlay(Bundle *bundle,
return true;
}
-void addTagAttribute(const sp<XMLNode>& node, const char* ns8,
- const char* attr8, const char* value)
+/*
+ * Inserts an attribute in a given node, only if the attribute does not
+ * exist.
+ * If errorOnFailedInsert is true, and the attribute already exists, returns false.
+ * Returns true otherwise, even if the attribute already exists.
+ */
+bool addTagAttribute(const sp<XMLNode>& node, const char* ns8,
+ const char* attr8, const char* value, bool errorOnFailedInsert)
{
if (value == NULL) {
- return;
+ return true;
}
-
+
const String16 ns(ns8);
const String16 attr(attr8);
-
+
if (node->getAttribute(ns, attr) != NULL) {
+ if (errorOnFailedInsert) {
+ fprintf(stderr, "Error: AndroidManifest.xml already defines %s (in %s);"
+ " cannot insert new value %s.\n",
+ String8(attr).string(), String8(ns).string(), value);
+ return false;
+ }
+
fprintf(stderr, "Warning: AndroidManifest.xml already defines %s (in %s);"
" using existing value in manifest.\n",
String8(attr).string(), String8(ns).string());
- return;
+
+ // don't stop the build.
+ return true;
}
node->addAttribute(ns, attr, String16(value));
+ return true;
}
static void fullyQualifyClassName(const String8& package, sp<XMLNode> node,
@@ -728,11 +744,17 @@ status_t massageManifest(Bundle* bundle, sp<XMLNode> root)
fprintf(stderr, "No <manifest> tag.\n");
return UNKNOWN_ERROR;
}
-
- addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionCode",
- bundle->getVersionCode());
- addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName",
- bundle->getVersionName());
+
+ bool errorOnFailedInsert = bundle->getErrorOnFailedInsert();
+
+ if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionCode",
+ bundle->getVersionCode(), errorOnFailedInsert)) {
+ return UNKNOWN_ERROR;
+ }
+ if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName",
+ bundle->getVersionName(), errorOnFailedInsert)) {
+ return UNKNOWN_ERROR;
+ }
if (bundle->getMinSdkVersion() != NULL
|| bundle->getTargetSdkVersion() != NULL
@@ -743,18 +765,27 @@ status_t massageManifest(Bundle* bundle, sp<XMLNode> root)
root->insertChildAt(vers, 0);
}
- addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "minSdkVersion",
- bundle->getMinSdkVersion());
- addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "targetSdkVersion",
- bundle->getTargetSdkVersion());
- addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "maxSdkVersion",
- bundle->getMaxSdkVersion());
+ if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "minSdkVersion",
+ bundle->getMinSdkVersion(), errorOnFailedInsert)) {
+ return UNKNOWN_ERROR;
+ }
+ if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "targetSdkVersion",
+ bundle->getTargetSdkVersion(), errorOnFailedInsert)) {
+ return UNKNOWN_ERROR;
+ }
+ if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "maxSdkVersion",
+ bundle->getMaxSdkVersion(), errorOnFailedInsert)) {
+ return UNKNOWN_ERROR;
+ }
}
if (bundle->getDebugMode()) {
sp<XMLNode> application = root->getChildElement(String16(), String16("application"));
if (application != NULL) {
- addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true");
+ if (!addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true",
+ errorOnFailedInsert)) {
+ return UNKNOWN_ERROR;
+ }
}
}
@@ -1821,6 +1852,110 @@ static status_t writeLayoutClasses(
return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
}
+static status_t writeTextLayoutClasses(
+ FILE* fp, const sp<AaptAssets>& assets,
+ const sp<AaptSymbols>& symbols, bool includePrivate)
+{
+ String16 attr16("attr");
+ String16 package16(assets->getPackage());
+
+ bool hasErrors = false;
+
+ size_t i;
+ size_t N = symbols->getNestedSymbols().size();
+ for (i=0; i<N; i++) {
+ sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
+ String16 nclassName16(symbols->getNestedSymbols().keyAt(i));
+ String8 realClassName(nclassName16);
+ if (fixupSymbol(&nclassName16) != NO_ERROR) {
+ hasErrors = true;
+ }
+ String8 nclassName(nclassName16);
+
+ SortedVector<uint32_t> idents;
+ Vector<uint32_t> origOrder;
+ Vector<bool> publicFlags;
+
+ size_t a;
+ size_t NA = nsymbols->getSymbols().size();
+ for (a=0; a<NA; a++) {
+ const AaptSymbolEntry& sym(nsymbols->getSymbols().valueAt(a));
+ int32_t code = sym.typeCode == AaptSymbolEntry::TYPE_INT32
+ ? sym.int32Val : 0;
+ bool isPublic = true;
+ if (code == 0) {
+ String16 name16(sym.name);
+ uint32_t typeSpecFlags;
+ code = assets->getIncludedResources().identifierForName(
+ name16.string(), name16.size(),
+ attr16.string(), attr16.size(),
+ package16.string(), package16.size(), &typeSpecFlags);
+ if (code == 0) {
+ fprintf(stderr, "ERROR: In <declare-styleable> %s, unable to find attribute %s\n",
+ nclassName.string(), sym.name.string());
+ hasErrors = true;
+ }
+ isPublic = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0;
+ }
+ idents.add(code);
+ origOrder.add(code);
+ publicFlags.add(isPublic);
+ }
+
+ NA = idents.size();
+
+ fprintf(fp, "int[] styleable %s {", nclassName.string());
+
+ for (a=0; a<NA; a++) {
+ if (a != 0) {
+ fprintf(fp, ",");
+ }
+ fprintf(fp, " 0x%08x", idents[a]);
+ }
+
+ fprintf(fp, " }\n");
+
+ for (a=0; a<NA; a++) {
+ ssize_t pos = idents.indexOf(origOrder.itemAt(a));
+ if (pos >= 0) {
+ const AaptSymbolEntry& sym = nsymbols->getSymbols().valueAt(a);
+ if (!publicFlags.itemAt(a) && !includePrivate) {
+ continue;
+ }
+ String8 name8(sym.name);
+ String16 comment(sym.comment);
+ String16 typeComment;
+ if (comment.size() <= 0) {
+ comment = getAttributeComment(assets, name8, &typeComment);
+ } else {
+ getAttributeComment(assets, name8, &typeComment);
+ }
+ String16 name(name8);
+ if (fixupSymbol(&name) != NO_ERROR) {
+ hasErrors = true;
+ }
+
+ uint32_t typeSpecFlags = 0;
+ String16 name16(sym.name);
+ assets->getIncludedResources().identifierForName(
+ name16.string(), name16.size(),
+ attr16.string(), attr16.size(),
+ package16.string(), package16.size(), &typeSpecFlags);
+ //printf("%s:%s/%s: 0x%08x\n", String8(package16).string(),
+ // String8(attr16).string(), String8(name16).string(), typeSpecFlags);
+ const bool pub = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0;
+
+ fprintf(fp,
+ "int styleable.%s_%s %d\n",
+ nclassName.string(),
+ String8(name).string(), (int)pos);
+ }
+ }
+ }
+
+ return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
+}
+
static status_t writeSymbolClass(
FILE* fp, const sp<AaptAssets>& assets, bool includePrivate,
const sp<AaptSymbols>& symbols, const String8& className, int indent,
@@ -1848,7 +1983,6 @@ static status_t writeSymbolClass(
continue;
}
String16 name(sym.name);
- String8 realName(name);
if (fixupSymbol(&name) != NO_ERROR) {
return UNKNOWN_ERROR;
}
@@ -1960,6 +2094,51 @@ static status_t writeSymbolClass(
return NO_ERROR;
}
+static status_t writeTextSymbolClass(
+ FILE* fp, const sp<AaptAssets>& assets, bool includePrivate,
+ const sp<AaptSymbols>& symbols, const String8& className)
+{
+ size_t i;
+ status_t err = NO_ERROR;
+
+ size_t N = symbols->getSymbols().size();
+ for (i=0; i<N; i++) {
+ const AaptSymbolEntry& sym = symbols->getSymbols().valueAt(i);
+ if (sym.typeCode != AaptSymbolEntry::TYPE_INT32) {
+ continue;
+ }
+
+ if (!assets->isJavaSymbol(sym, includePrivate)) {
+ continue;
+ }
+
+ String16 name(sym.name);
+ if (fixupSymbol(&name) != NO_ERROR) {
+ return UNKNOWN_ERROR;
+ }
+
+ fprintf(fp, "int %s %s 0x%08x\n",
+ className.string(),
+ String8(name).string(), (int)sym.int32Val);
+ }
+
+ N = symbols->getNestedSymbols().size();
+ for (i=0; i<N; i++) {
+ sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
+ String8 nclassName(symbols->getNestedSymbols().keyAt(i));
+ if (nclassName == "styleable") {
+ err = writeTextLayoutClasses(fp, assets, nsymbols, includePrivate);
+ } else {
+ err = writeTextSymbolClass(fp, assets, includePrivate, nsymbols, nclassName);
+ }
+ if (err != NO_ERROR) {
+ return err;
+ }
+ }
+
+ return NO_ERROR;
+}
+
status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
const String8& package, bool includePrivate)
{
@@ -1967,11 +2146,15 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
return NO_ERROR;
}
+ const char* textSymbolsDest = bundle->getOutputTextSymbols();
+
+ String8 R("R");
const size_t N = assets->getSymbols().size();
for (size_t i=0; i<N; i++) {
sp<AaptSymbols> symbols = assets->getSymbols().valueAt(i);
String8 className(assets->getSymbols().keyAt(i));
String8 dest(bundle->getRClassDir());
+
if (bundle->getMakePackageDirs()) {
String8 pkg(package);
const char* last = pkg.string();
@@ -2003,14 +2186,14 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
}
fprintf(fp,
- "/* AUTO-GENERATED FILE. DO NOT MODIFY.\n"
- " *\n"
- " * This class was automatically generated by the\n"
- " * aapt tool from the resource data it found. It\n"
- " * should not be modified by hand.\n"
- " */\n"
- "\n"
- "package %s;\n\n", package.string());
+ "/* AUTO-GENERATED FILE. DO NOT MODIFY.\n"
+ " *\n"
+ " * This class was automatically generated by the\n"
+ " * aapt tool from the resource data it found. It\n"
+ " * should not be modified by hand.\n"
+ " */\n"
+ "\n"
+ "package %s;\n\n", package.string());
status_t err = writeSymbolClass(fp, assets, includePrivate, symbols,
className, 0, bundle->getNonConstantId());
@@ -2019,14 +2202,37 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
}
fclose(fp);
+ if (textSymbolsDest != NULL && R == className) {
+ String8 textDest(textSymbolsDest);
+ textDest.appendPath(className);
+ textDest.append(".txt");
+
+ FILE* fp = fopen(textDest.string(), "w+");
+ if (fp == NULL) {
+ fprintf(stderr, "ERROR: Unable to open text symbol file %s: %s\n",
+ textDest.string(), strerror(errno));
+ return UNKNOWN_ERROR;
+ }
+ if (bundle->getVerbose()) {
+ printf(" Writing text symbols for class %s.\n", className.string());
+ }
+
+ status_t err = writeTextSymbolClass(fp, assets, includePrivate, symbols,
+ className);
+ if (err != NO_ERROR) {
+ return err;
+ }
+ fclose(fp);
+ }
+
// If we were asked to generate a dependency file, we'll go ahead and add this R.java
// as a target in the dependency file right next to it.
- if (bundle->getGenDependencies()) {
+ if (bundle->getGenDependencies() && R == className) {
// Add this R.java to the dependency file
String8 dependencyFile(bundle->getRClassDir());
dependencyFile.appendPath("R.java.d");
- fp = fopen(dependencyFile.string(), "a");
+ FILE *fp = fopen(dependencyFile.string(), "a");
fprintf(fp,"%s \\\n", dest.string());
fclose(fp);
}
@@ -2036,7 +2242,6 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
}
-
class ProguardKeepSet
{
public:
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index b3260b1..9fe1c60 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -1771,15 +1771,18 @@ public class WifiStateMachine extends StateMachine {
}
/* Disable power save and suspend optimizations during DHCP */
- mWifiNative.setPowerSave(false);
+ // Note: The order here is important for now. Brcm driver changes
+ // power settings when we control suspend mode optimizations.
+ // TODO: Remove this comment when the driver is fixed.
setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, false);
+ mWifiNative.setPowerSave(false);
}
void handlePostDhcpSetup() {
/* Restore power save and suspend optimizations */
- mWifiNative.setPowerSave(true);
setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, true);
+ mWifiNative.setPowerSave(true);
// Set the coexistence mode back to its default value
mWifiNative.setBluetoothCoexistenceMode(
@@ -2710,8 +2713,6 @@ public class WifiStateMachine extends StateMachine {
mWifiNative.stopFilteringMulticastV4Packets();
}
- mWifiNative.setPowerSave(true);
-
if (mIsScanMode) {
mWifiNative.setScanResultHandling(SCAN_ONLY_MODE);
mWifiNative.disconnect();
@@ -2736,6 +2737,7 @@ public class WifiStateMachine extends StateMachine {
mWifiNative.setSuspendOptimizations(mSuspendOptNeedsDisabled == 0
&& mUserWantsSuspendOpt.get());
}
+ mWifiNative.setPowerSave(true);
if (mP2pSupported) mWifiP2pChannel.sendMessage(WifiStateMachine.CMD_ENABLE_P2P);
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
index 100e062..213fab9 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
@@ -37,6 +37,9 @@ public class WifiP2pConfig implements Parcelable {
*/
public WpsInfo wps;
+ /** @hide */
+ public static final int MAX_GO_INTENT = 15;
+
/**
* This is an integer value between 0 and 15 where 0 indicates the least
* inclination to be a group owner and 15 indicates the highest inclination
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
index edd1dac..a42470f 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
@@ -135,7 +135,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub {
private static final int DISCOVER_TIMEOUT_S = 120;
/* Idle time after a peer is gone when the group is torn down */
- private static final int GROUP_IDLE_TIME_S = 5;
+ private static final int GROUP_IDLE_TIME_S = 25;
/**
* Delay between restarts upon failure to setup connection with supplicant