summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt48
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java22
-rw-r--r--core/java/android/app/ActivityManagerInternal.java2
-rw-r--r--core/java/android/app/EnterTransitionCoordinator.java4
-rw-r--r--core/java/android/app/ExitTransitionCoordinator.java4
-rw-r--r--core/java/android/app/IActivityManager.java2
-rw-r--r--core/java/android/app/Notification.java1
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java32
-rw-r--r--core/java/android/content/pm/IPackageInstallerCallback.aidl2
-rw-r--r--core/java/android/content/pm/IPackageInstallerSession.aidl2
-rw-r--r--core/java/android/content/pm/InstallSessionInfo.java30
-rw-r--r--core/java/android/content/pm/InstallSessionParams.java33
-rw-r--r--core/java/android/content/pm/PackageInstaller.java109
-rw-r--r--core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java12
-rw-r--r--core/java/android/hardware/hdmi/IHdmiControlService.aidl1
-rw-r--r--core/java/android/hardware/location/GeofenceHardwareImpl.java4
-rw-r--r--core/java/android/os/Process.java6
-rw-r--r--core/java/android/os/UserManager.java5
-rw-r--r--core/java/android/service/voice/AlwaysOnHotwordDetector.java88
-rw-r--r--core/java/android/text/style/TtsSpan.java4
-rw-r--r--core/java/android/view/RenderNode.java10
-rw-r--r--core/java/android/view/ViewOutlineProvider.java7
-rw-r--r--core/java/android/view/Window.java95
-rw-r--r--core/java/android/webkit/WebViewFactory.java271
-rw-r--r--core/java/com/android/internal/util/XmlUtils.java77
-rw-r--r--core/java/com/android/internal/widget/ActionBarContainer.java30
-rw-r--r--core/jni/android/graphics/BitmapFactory.cpp4
-rw-r--r--core/jni/android/graphics/NinePatchPeeker.cpp4
-rw-r--r--core/jni/android/graphics/NinePatchPeeker.h4
-rw-r--r--core/jni/android_view_RenderNode.cpp13
-rw-r--r--core/res/res/drawable-hdpi/stat_notify_wifi_in_range.pngbin1241 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/stat_sys_tether_wifi.pngbin1139 -> 0 bytes
-rw-r--r--core/res/res/drawable-ldpi/stat_notify_wifi_in_range.pngbin623 -> 0 bytes
-rw-r--r--core/res/res/drawable-ldpi/stat_sys_tether_wifi.pngbin584 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/stat_notify_wifi_in_range.pngbin810 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/stat_sys_tether_wifi.pngbin814 -> 0 bytes
-rw-r--r--core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.pngbin1679 -> 0 bytes
-rw-r--r--core/res/res/drawable-xhdpi/stat_sys_tether_wifi.pngbin1542 -> 0 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.pngbin1850 -> 0 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.pngbin1423 -> 0 bytes
-rw-r--r--core/res/res/drawable/stat_notify_wifi_in_range.xml27
-rw-r--r--core/res/res/drawable/stat_sys_tether_wifi.xml24
-rw-r--r--core/res/res/values/attrs.xml60
-rw-r--r--core/res/res/values/config.xml4
-rw-r--r--core/res/res/values/public.xml6
-rw-r--r--core/res/res/values/strings.xml45
-rw-r--r--core/res/res/values/symbols.xml2
-rw-r--r--core/res/res/xml/tv_content_rating_systems.xml127
-rw-r--r--docs/html/preview/preview_toc.cs2
-rw-r--r--docs/html/preview/tv/images/tif-overview.pngbin0 -> 74477 bytes
-rw-r--r--docs/html/preview/tv/tif/index.jd38
-rw-r--r--graphics/java/android/graphics/NinePatch.java6
-rw-r--r--graphics/java/android/graphics/Outline.java25
-rw-r--r--graphics/java/android/graphics/drawable/Drawable.java8
-rw-r--r--graphics/java/android/graphics/drawable/GradientDrawable.java1
-rw-r--r--graphics/java/android/graphics/drawable/LayerDrawable.java5
-rw-r--r--graphics/java/android/graphics/drawable/NinePatchDrawable.java2
-rw-r--r--graphics/java/android/graphics/drawable/RippleDrawable.java4
-rw-r--r--graphics/java/android/graphics/drawable/ShapeDrawable.java1
-rw-r--r--graphics/java/android/graphics/drawable/VectorDrawable.java24
-rw-r--r--libs/hwui/Outline.h16
-rw-r--r--libs/hwui/RenderNode.cpp10
-rw-r--r--media/java/android/media/AudioAttributes.java14
-rw-r--r--media/java/android/media/tv/ITvInputManager.aidl4
-rw-r--r--media/java/android/media/tv/ITvInputSession.aidl2
-rw-r--r--media/java/android/media/tv/ITvInputSessionWrapper.java8
-rw-r--r--media/java/android/media/tv/TvContentRating.java471
-rw-r--r--media/java/android/media/tv/TvContract.java26
-rw-r--r--media/java/android/media/tv/TvInputInfo.java33
-rw-r--r--media/java/android/media/tv/TvInputManager.java28
-rw-r--r--media/java/android/media/tv/TvInputService.java17
-rw-r--r--media/java/android/media/tv/TvView.java26
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java19
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.pngbin988 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.pngbin1061 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.pngbin901 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.pngbin1085 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.pngbin1055 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.pngbin1112 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.pngbin960 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.pngbin1033 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.pngbin674 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.pngbin988 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.pngbin1043 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.pngbin916 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.pngbin1052 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.pngbin1050 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.pngbin1061 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.pngbin956 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.pngbin1012 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.pngbin673 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.pngbin780 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.pngbin661 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.pngbin861 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.pngbin729 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.pngbin793 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.pngbin674 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.pngbin520 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.pngbin677 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.pngbin883 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.pngbin919 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.pngbin1114 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.pngbin522 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.pngbin735 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.pngbin1917 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.pngbin2045 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.pngbin2157 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.pngbin2212 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.pngbin1956 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.pngbin2037 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.pngbin2050 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.pngbin2127 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.pngbin1736 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.pngbin520 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.pngbin677 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.pngbin1650 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.pngbin1917 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.pngbin522 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.pngbin690 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.pngbin757 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.pngbin726 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.pngbin545 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.pngbin606 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.pngbin576 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.pngbin701 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.pngbin568 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.pngbin1158 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.pngbin1158 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.pngbin1160 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.pngbin1169 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.pngbin1197 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.pngbin1196 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.pngbin1272 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.pngbin1493 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.pngbin1557 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.pngbin1516 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.pngbin1529 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.pngbin1541 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.pngbin1493 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.pngbin1010 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.pngbin1083 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.pngbin904 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.pngbin1102 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.pngbin1059 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.pngbin1095 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.pngbin941 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.pngbin1036 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.pngbin671 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.pngbin1010 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.pngbin1063 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.pngbin922 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.pngbin1061 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.pngbin1028 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.pngbin1038 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.pngbin988 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.pngbin1010 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.pngbin677 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.pngbin780 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.pngbin661 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.pngbin854 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.pngbin726 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.pngbin791 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.pngbin673 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.pngbin520 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.pngbin677 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.pngbin894 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.pngbin925 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.pngbin1131 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.pngbin522 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.pngbin730 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.pngbin693 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.pngbin735 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.pngbin719 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.pngbin528 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.pngbin575 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.pngbin552 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.pngbin690 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.pngbin528 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.pngbin2940 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.pngbin2940 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.pngbin2945 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.pngbin2954 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.pngbin2953 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.pngbin2990 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.pngbin3034 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.pngbin826 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.pngbin891 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.pngbin711 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.pngbin896 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.pngbin889 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.pngbin814 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.pngbin816 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.pngbin770 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.pngbin596 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.pngbin826 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.pngbin892 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.pngbin708 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.pngbin888 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.pngbin877 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.pngbin804 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.pngbin820 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.pngbin751 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.pngbin587 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.pngbin635 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.pngbin547 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.pngbin711 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.pngbin619 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.pngbin633 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.pngbin574 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.pngbin449 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.pngbin526 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.pngbin713 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.pngbin756 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.pngbin861 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.pngbin444 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.pngbin625 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.pngbin543 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.pngbin567 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.pngbin558 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.pngbin459 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.pngbin490 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.pngbin454 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.pngbin544 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.pngbin474 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.pngbin2902 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.pngbin2902 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.pngbin2904 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.pngbin2906 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.pngbin2910 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.pngbin2939 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.pngbin2956 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.pngbin1253 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.pngbin1287 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.pngbin1187 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.pngbin1287 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.pngbin1273 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.pngbin1464 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.pngbin1203 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.pngbin1345 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.pngbin811 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.pngbin1253 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.pngbin1282 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.pngbin1190 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.pngbin1300 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.pngbin1302 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.pngbin1397 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.pngbin1257 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.pngbin1310 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.pngbin791 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.pngbin962 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.pngbin765 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.pngbin1018 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.pngbin920 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.pngbin1013 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.pngbin766 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.pngbin608 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.pngbin829 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.pngbin1094 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.pngbin1193 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.pngbin1465 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.pngbin600 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.pngbin938 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.pngbin864 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.pngbin955 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.pngbin906 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.pngbin618 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.pngbin720 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.pngbin627 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.pngbin811 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.pngbin657 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.pngbin3000 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.pngbin2997 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.pngbin3004 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.pngbin3018 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.pngbin3022 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.pngbin3062 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.pngbin3108 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.pngbin1643 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.pngbin1663 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.pngbin1621 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.pngbin1688 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.pngbin1687 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.pngbin1831 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.pngbin1630 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.pngbin1708 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.pngbin1243 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.pngbin1638 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.pngbin1636 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.pngbin1574 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.pngbin1622 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.pngbin1617 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.pngbin1739 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.pngbin1601 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.pngbin1615 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.pngbin1219 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.pngbin1476 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.pngbin1223 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.pngbin1319 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.pngbin1385 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.pngbin1534 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.pngbin1242 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.pngbin1248 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.pngbin1428 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.pngbin1339 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.pngbin1744 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.pngbin2133 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.pngbin1244 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.pngbin1398 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.pngbin1549 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.pngbin1717 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.pngbin1687 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.pngbin1262 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.pngbin1468 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.pngbin1264 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.pngbin1463 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.pngbin1335 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.pngbin3106 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.pngbin3107 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.pngbin3128 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.pngbin3134 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.pngbin3137 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.pngbin3176 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.pngbin3218 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.pngbin824 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.pngbin882 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.pngbin714 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.pngbin891 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.pngbin895 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.pngbin812 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.pngbin798 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.pngbin759 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.pngbin592 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.pngbin824 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.pngbin874 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.pngbin702 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.pngbin889 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.pngbin878 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.pngbin800 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.pngbin794 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.pngbin751 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.pngbin577 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.pngbin624 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.pngbin538 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.pngbin706 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.pngbin615 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.pngbin638 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.pngbin571 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.pngbin449 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.pngbin526 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.pngbin734 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.pngbin757 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.pngbin840 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.pngbin444 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.pngbin628 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.pngbin1226 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.pngbin1351 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.pngbin1451 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.pngbin1515 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.pngbin1267 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.pngbin1329 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.pngbin1382 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.pngbin1430 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.pngbin1184 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.pngbin449 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.pngbin526 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.pngbin1190 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.pngbin1226 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.pngbin444 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.pngbin543 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.pngbin578 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.pngbin557 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.pngbin480 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.pngbin508 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.pngbin468 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.pngbin557 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.pngbin484 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.pngbin1103 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.pngbin1103 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.pngbin1103 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.pngbin1106 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.pngbin1106 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.pngbin1137 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.pngbin1182 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.pngbin1333 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.pngbin1323 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.pngbin1326 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.pngbin1335 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.pngbin1333 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.pngbin1320 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.pngbin1260 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.pngbin1302 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.pngbin1185 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.pngbin1304 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.pngbin1279 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.pngbin1468 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.pngbin1222 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.pngbin1342 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.pngbin761 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.pngbin1260 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.pngbin1285 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.pngbin1194 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.pngbin1297 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.pngbin1296 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.pngbin1396 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.pngbin1235 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.pngbin1294 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.pngbin772 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.pngbin955 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.pngbin770 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.pngbin1046 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.pngbin925 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.pngbin1031 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.pngbin773 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.pngbin608 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.pngbin829 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.pngbin1072 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.pngbin1188 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.pngbin1438 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.pngbin600 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.pngbin937 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.pngbin2613 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.pngbin2806 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.pngbin2912 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.pngbin3043 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.pngbin2679 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.pngbin2766 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.pngbin2828 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.pngbin2936 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.pngbin2391 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.pngbin608 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.pngbin829 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.pngbin2358 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.pngbin2613 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.pngbin600 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.pngbin871 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.pngbin984 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.pngbin942 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.pngbin626 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.pngbin732 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.pngbin649 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.pngbin821 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.pngbin696 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.pngbin1201 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.pngbin1197 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.pngbin1202 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.pngbin1219 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.pngbin1224 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.pngbin1285 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.pngbin1320 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.pngbin1717 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.pngbin1725 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.pngbin1754 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.pngbin1765 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.pngbin1750 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.pngbin1719 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.pngbin1668 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.pngbin1685 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.pngbin1631 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.pngbin1704 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.pngbin1707 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.pngbin1815 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.pngbin1634 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.pngbin1701 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.pngbin1245 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.pngbin1651 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.pngbin1652 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.pngbin1574 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.pngbin1621 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.pngbin1625 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.pngbin1727 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.pngbin1431 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.pngbin1622 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.pngbin1219 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.pngbin1476 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.pngbin1221 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.pngbin1318 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.pngbin1383 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.pngbin1537 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.pngbin1241 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.pngbin1248 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.pngbin1428 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.pngbin1338 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.pngbin1774 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.pngbin2207 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.pngbin1244 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.pngbin1423 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.pngbin3367 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.pngbin3434 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.pngbin3382 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.pngbin3386 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.pngbin3348 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.pngbin3401 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.pngbin3334 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.pngbin3242 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.pngbin3086 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.pngbin1252 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.pngbin1428 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.pngbin3009 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.pngbin3392 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.pngbin1244 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.pngbin1570 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.pngbin1732 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.pngbin1702 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.pngbin1303 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.pngbin1469 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.pngbin1273 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.pngbin1474 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.pngbin1352 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.pngbin1336 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.pngbin1339 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.pngbin1354 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.pngbin1360 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.pngbin1387 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.pngbin1434 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.pngbin1414 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.pngbin2125 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.pngbin2168 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.pngbin2194 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.pngbin2196 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.pngbin2202 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.pngbin2125 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_0.xml31
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_1.xml34
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_1x.xml27
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_2.xml34
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_3.xml34
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_3g.xml27
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_4.xml31
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_4g.xml27
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml28
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_e.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml25
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml28
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml28
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml28
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml25
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_g.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_h.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_in.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_lte.xml30
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml25
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_out.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_signal_r.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_0.xml30
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_1.xml33
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_2.xml33
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_3.xml33
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_4.xml30
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml27
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml27
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml27
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml27
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml24
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml27
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml27
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml27
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml24
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml24
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml24
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml30
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml24
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_0.xml31
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml25
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_1.xml34
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml28
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_2.xml34
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml28
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_3.xml34
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml28
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_4.xml31
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml25
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_signal_null.xml25
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml30
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml24
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml33
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml27
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml33
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml27
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml33
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml27
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml30
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml24
-rw-r--r--packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml24
-rw-r--r--packages/SystemUI/res/layout/signal_cluster_view.xml24
-rw-r--r--packages/SystemUI/res/values/dimens.xml8
-rw-r--r--packages/SystemUI/src/com/android/systemui/EventLogTags.logtags1
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanel.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/Constants.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java276
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java316
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java202
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java94
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java69
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java24
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java60
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java66
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java35
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java44
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java105
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java21
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindow.java93
-rw-r--r--services/core/java/com/android/server/MmsServiceBroker.java21
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityManagerService.java144
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java3
-rw-r--r--services/core/java/com/android/server/hdmi/ActiveSourceHandler.java8
-rw-r--r--services/core/java/com/android/server/hdmi/Constants.java4
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java6
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java21
-rw-r--r--services/core/java/com/android/server/hdmi/RoutingControlAction.java4
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java424
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java202
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java8
-rw-r--r--services/core/java/com/android/server/tv/TvInputManagerService.java76
-rw-r--r--services/core/java/com/android/server/webkit/WebViewUpdateService.java107
-rw-r--r--services/java/com/android/server/SystemServer.java13
-rw-r--r--telephony/java/android/telephony/IccOpenLogicalChannelResponse.java2
-rw-r--r--tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java5
-rw-r--r--tools/aapt/Images.cpp39
-rw-r--r--wifi/java/android/net/wifi/ScanResult.java8
-rw-r--r--wifi/java/android/net/wifi/WifiScanner.java67
645 files changed, 5323 insertions, 1393 deletions
diff --git a/api/current.txt b/api/current.txt
index dd846fc..6e89e8b 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -465,6 +465,7 @@ package android {
field public static final int contentInsetLeft = 16843863; // 0x1010457
field public static final int contentInsetRight = 16843864; // 0x1010458
field public static final int contentInsetStart = 16843861; // 0x1010455
+ field public static final int contentRatingSystemXml = 16843957; // 0x10104b5
field public static final int controlX1 = 16843798; // 0x1010416
field public static final int controlX2 = 16843800; // 0x1010418
field public static final int controlY1 = 16843799; // 0x1010417
@@ -1435,8 +1436,12 @@ package android {
field public static final int windowNoDisplay = 16843294; // 0x101021e
field public static final int windowNoTitle = 16842838; // 0x1010056
field public static final int windowOverscan = 16843727; // 0x10103cf
+ field public static final int windowReenterTransition = 16843954; // 0x10104b2
+ field public static final int windowReturnTransition = 16843953; // 0x10104b1
field public static final int windowSharedElementEnterTransition = 16843835; // 0x101043b
field public static final int windowSharedElementExitTransition = 16843836; // 0x101043c
+ field public static final int windowSharedElementReenterTransition = 16843956; // 0x10104b4
+ field public static final int windowSharedElementReturnTransition = 16843955; // 0x10104b3
field public static final int windowShowAnimation = 16842934; // 0x10100b6
field public static final int windowShowWallpaper = 16843410; // 0x1010292
field public static final int windowSoftInputMode = 16843307; // 0x101022b
@@ -4692,6 +4697,7 @@ package android.app {
field public android.os.Bundle extras;
field public int flags;
field public android.app.PendingIntent fullScreenIntent;
+ field public android.widget.RemoteViews headsUpContentView;
field public int icon;
field public int iconLevel;
field public android.graphics.Bitmap largeIcon;
@@ -8515,9 +8521,11 @@ package android.content.pm {
method public android.graphics.Bitmap getAppIcon();
method public java.lang.CharSequence getAppLabel();
method public java.lang.String getAppPackageName();
+ method public android.content.Intent getDetailsIntent();
method public java.lang.String getInstallerPackageName();
method public float getProgress();
method public int getSessionId();
+ method public boolean isOpen();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
}
@@ -8531,7 +8539,6 @@ package android.content.pm {
method public void setInstallLocation(int);
method public void setOriginatingUri(android.net.Uri);
method public void setReferrerUri(android.net.Uri);
- method public void setSignatures(android.content.pm.Signature[]);
method public void setSize(long);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
@@ -8647,6 +8654,8 @@ package android.content.pm {
method public android.content.pm.PackageInstaller.Session openSession(int);
method public void removeSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
method public void uninstall(java.lang.String, android.content.pm.PackageInstaller.UninstallCallback);
+ field public static final java.lang.String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS";
+ field public static final java.lang.String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID";
}
public static abstract class PackageInstaller.CommitCallback {
@@ -8666,14 +8675,18 @@ package android.content.pm {
method public void close();
method public void commit(android.content.pm.PackageInstaller.CommitCallback);
method public void fsync(java.io.OutputStream) throws java.io.IOException;
+ method public java.lang.String[] list();
+ method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException;
method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException;
method public void setProgress(float);
}
public static abstract class PackageInstaller.SessionCallback {
ctor public PackageInstaller.SessionCallback();
+ method public abstract void onClosed(int);
method public abstract void onCreated(int);
method public abstract void onFinished(int, boolean);
+ method public abstract void onOpened(int);
method public abstract void onProgressChanged(int, float);
}
@@ -16835,28 +16848,14 @@ package android.media.session {
package android.media.tv {
public final class TvContentRating {
- ctor public TvContentRating(java.lang.String);
- ctor public TvContentRating(java.lang.String, java.lang.String[]);
+ method public static android.media.tv.TvContentRating createRating(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String...);
method public java.lang.String flattenToString();
+ method public java.lang.String getCountry();
+ method public java.lang.String getDomain();
method public java.lang.String getMainRating();
+ method public java.lang.String getRatingSystem();
method public java.util.List<java.lang.String> getSubRatings();
method public static android.media.tv.TvContentRating unflattenFromString(java.lang.String);
- field public static final java.lang.String RATING_KR_12 = "RATING_KR_12";
- field public static final java.lang.String RATING_KR_15 = "RATING_KR_15";
- field public static final java.lang.String RATING_KR_19 = "RATING_KR_19";
- field public static final java.lang.String RATING_KR_7 = "RATING_KR_7";
- field public static final java.lang.String RATING_KR_ALL = "RATING_KR_ALL";
- field public static final java.lang.String RATING_US_TV_14 = "RATING_US_TV_14";
- field public static final java.lang.String RATING_US_TV_G = "RATING_US_TV_G";
- field public static final java.lang.String RATING_US_TV_MA = "RATING_US_TV_MA";
- field public static final java.lang.String RATING_US_TV_PG = "RATING_US_TV_PG";
- field public static final java.lang.String RATING_US_TV_Y = "RATING_US_TV_Y";
- field public static final java.lang.String RATING_US_TV_Y7 = "RATING_US_TV_Y7";
- field public static final java.lang.String SUBRATING_US_D = "SUBRATING_US_D";
- field public static final java.lang.String SUBRATING_US_FV = "SUBRATING_US_FV";
- field public static final java.lang.String SUBRATING_US_L = "SUBRATING_US_L";
- field public static final java.lang.String SUBRATING_US_S = "SUBRATING_US_S";
- field public static final java.lang.String SUBRATING_US_V = "SUBRATING_US_V";
}
public final class TvContract {
@@ -27505,7 +27504,6 @@ package android.service.voice {
field public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 2; // 0x2
field public static final int RECOGNITION_MODE_VOICE_TRIGGER = 1; // 0x1
field public static final int STATE_HARDWARE_UNAVAILABLE = -2; // 0xfffffffe
- field public static final int STATE_INVALID = -3; // 0xfffffffd
field public static final int STATE_KEYPHRASE_ENROLLED = 2; // 0x2
field public static final int STATE_KEYPHRASE_UNENROLLED = 1; // 0x1
field public static final int STATE_KEYPHRASE_UNSUPPORTED = -1; // 0xffffffff
@@ -31751,7 +31749,7 @@ package android.text.style {
field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4
}
- public static abstract class TtsSpan.Builder {
+ public static class TtsSpan.Builder {
ctor public TtsSpan.Builder(java.lang.String);
method public android.text.style.TtsSpan build();
method public C setIntArgument(java.lang.String, int);
@@ -35322,8 +35320,12 @@ package android.view {
method protected final int getLocalFeatures();
method public android.media.session.MediaController getMediaController();
method public abstract int getNavigationBarColor();
+ method public android.transition.Transition getReenterTransition();
+ method public android.transition.Transition getReturnTransition();
method public android.transition.Transition getSharedElementEnterTransition();
method public android.transition.Transition getSharedElementExitTransition();
+ method public android.transition.Transition getSharedElementReenterTransition();
+ method public android.transition.Transition getSharedElementReturnTransition();
method public abstract int getStatusBarColor();
method public long getTransitionBackgroundFadeDuration();
method public android.transition.TransitionManager getTransitionManager();
@@ -35379,8 +35381,12 @@ package android.view {
method public void setLogo(int);
method public void setMediaController(android.media.session.MediaController);
method public abstract void setNavigationBarColor(int);
+ method public void setReenterTransition(android.transition.Transition);
+ method public void setReturnTransition(android.transition.Transition);
method public void setSharedElementEnterTransition(android.transition.Transition);
method public void setSharedElementExitTransition(android.transition.Transition);
+ method public void setSharedElementReenterTransition(android.transition.Transition);
+ method public void setSharedElementReturnTransition(android.transition.Transition);
method public void setSoftInputMode(int);
method public abstract void setStatusBarColor(int);
method public abstract void setTitle(java.lang.CharSequence);
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index bc16800..1f25dd0 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -59,7 +59,6 @@ import com.android.internal.util.ArrayUtils;
import com.android.internal.util.SizedInputStream;
import libcore.io.IoUtils;
-import libcore.io.Streams;
import java.io.File;
import java.io.FileDescriptor;
@@ -1068,6 +1067,8 @@ public final class Pm {
}
}
+ final InstallSessionInfo info = mInstaller.getSessionInfo(sessionId);
+
PackageInstaller.Session session = null;
InputStream in = null;
OutputStream out = null;
@@ -1081,16 +1082,21 @@ public final class Pm {
}
out = session.openWrite(splitName, 0, sizeBytes);
- final int n = Streams.copy(in, out);
- session.fsync(out);
+ int total = 0;
+ byte[] buffer = new byte[65536];
+ int c;
+ while ((c = in.read(buffer)) != -1) {
+ total += c;
+ out.write(buffer, 0, c);
- final InstallSessionInfo info = mInstaller.getSessionInfo(sessionId);
- if (info.sizeBytes > 0) {
- final float fraction = ((float) n / (float) info.sizeBytes);
- session.addProgress(fraction);
+ if (info.sizeBytes > 0) {
+ final float fraction = ((float) c / (float) info.sizeBytes);
+ session.addProgress(fraction);
+ }
}
+ session.fsync(out);
- System.out.println("Success: streamed " + n + " bytes");
+ System.out.println("Success: streamed " + total + " bytes");
} finally {
IoUtils.closeQuietly(out);
IoUtils.closeQuietly(in);
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 5262a5f..2a17fa6 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -25,4 +25,6 @@ public abstract class ActivityManagerInternal {
// Called by the power manager.
public abstract void goingToSleep();
public abstract void wakingUp();
+ public abstract int startIsolatedProcess(String entryPoint, String[] mainArgs,
+ String processName, String abiOverride, int uid, Runnable crashHandler);
}
diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java
index 1326064..b5d362d 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -256,7 +256,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
@Override
protected Transition getViewsTransition() {
if (mIsReturning) {
- return getWindow().getExitTransition();
+ return getWindow().getReenterTransition();
} else {
return getWindow().getEnterTransition();
}
@@ -264,7 +264,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
protected Transition getSharedElementTransition() {
if (mIsReturning) {
- return getWindow().getSharedElementExitTransition();
+ return getWindow().getSharedElementReenterTransition();
} else {
return getWindow().getSharedElementEnterTransition();
}
diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java
index 2ce6018..b3fdcc7 100644
--- a/core/java/android/app/ExitTransitionCoordinator.java
+++ b/core/java/android/app/ExitTransitionCoordinator.java
@@ -395,7 +395,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
@Override
protected Transition getViewsTransition() {
if (mIsReturning) {
- return getWindow().getEnterTransition();
+ return getWindow().getReturnTransition();
} else {
return getWindow().getExitTransition();
}
@@ -403,7 +403,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
protected Transition getSharedElementTransition() {
if (mIsReturning) {
- return getWindow().getSharedElementEnterTransition();
+ return getWindow().getSharedElementReturnTransition();
} else {
return getWindow().getSharedElementExitTransition();
}
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 5347f03..772e132 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -454,7 +454,7 @@ public interface IActivityManager extends IInterface {
* Private non-Binder interfaces
*/
/* package */ boolean testIsSystemReady();
-
+
/** Information you can retrieve about a particular application. */
public static class ContentProviderHolder implements Parcelable {
public final ProviderInfo info;
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index c7fdbed..acf7ade 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -247,7 +247,6 @@ public class Notification implements Parcelable
/**
- * @hide
* A medium-format version of {@link #contentView}, providing the Notification an
* opportunity to add action buttons to contentView. At its discretion, the system UI may
* choose to show this as a heads-up notification, which will pop up so the user can see
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 8be52a2..e28f00c 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -449,9 +449,17 @@ public class DevicePolicyManager {
* active (enabled) in the system.
*/
public boolean isAdminActive(ComponentName who) {
+ return isAdminActiveAsUser(who, UserHandle.myUserId());
+ }
+
+ /**
+ * @see #isAdminActive(ComponentName)
+ * @hide
+ */
+ public boolean isAdminActiveAsUser(ComponentName who, int userId) {
if (mService != null) {
try {
- return mService.isAdminActive(who, UserHandle.myUserId());
+ return mService.isAdminActive(who, userId);
} catch (RemoteException e) {
Log.w(TAG, "Failed talking with device policy service", e);
}
@@ -465,9 +473,17 @@ public class DevicePolicyManager {
* returned.
*/
public List<ComponentName> getActiveAdmins() {
+ return getActiveAdminsAsUser(UserHandle.myUserId());
+ }
+
+ /**
+ * @see #getActiveAdmins()
+ * @hide
+ */
+ public List<ComponentName> getActiveAdminsAsUser(int userId) {
if (mService != null) {
try {
- return mService.getActiveAdmins(UserHandle.myUserId());
+ return mService.getActiveAdmins(userId);
} catch (RemoteException e) {
Log.w(TAG, "Failed talking with device policy service", e);
}
@@ -2314,9 +2330,17 @@ public class DevicePolicyManager {
* @throws IllegalArgumentException if the userId is invalid.
*/
public ComponentName getProfileOwner() throws IllegalArgumentException {
+ return getProfileOwnerAsUser(Process.myUserHandle().getIdentifier());
+ }
+
+ /**
+ * @see #getProfileOwner()
+ * @hide
+ */
+ public ComponentName getProfileOwnerAsUser(final int userId) throws IllegalArgumentException {
if (mService != null) {
try {
- return mService.getProfileOwner(Process.myUserHandle().getIdentifier());
+ return mService.getProfileOwner(userId);
} catch (RemoteException re) {
Log.w(TAG, "Failed to get profile owner");
throw new IllegalArgumentException(
@@ -2856,7 +2880,7 @@ public class DevicePolicyManager {
* @see #setAccountManagementDisabled
*/
public String[] getAccountTypesWithManagementDisabled() {
- return getAccountTypesWithManagementDisabledAsUser(UserHandle.getCallingUserId());
+ return getAccountTypesWithManagementDisabledAsUser(UserHandle.myUserId());
}
/**
diff --git a/core/java/android/content/pm/IPackageInstallerCallback.aidl b/core/java/android/content/pm/IPackageInstallerCallback.aidl
index a31ae54..39ae1a0 100644
--- a/core/java/android/content/pm/IPackageInstallerCallback.aidl
+++ b/core/java/android/content/pm/IPackageInstallerCallback.aidl
@@ -19,6 +19,8 @@ package android.content.pm;
/** {@hide} */
oneway interface IPackageInstallerCallback {
void onSessionCreated(int sessionId);
+ void onSessionOpened(int sessionId);
void onSessionProgressChanged(int sessionId, float progress);
+ void onSessionClosed(int sessionId);
void onSessionFinished(int sessionId, boolean success);
}
diff --git a/core/java/android/content/pm/IPackageInstallerSession.aidl b/core/java/android/content/pm/IPackageInstallerSession.aidl
index 2fd7ddb..af0323f 100644
--- a/core/java/android/content/pm/IPackageInstallerSession.aidl
+++ b/core/java/android/content/pm/IPackageInstallerSession.aidl
@@ -24,7 +24,9 @@ interface IPackageInstallerSession {
void setClientProgress(float progress);
void addClientProgress(float progress);
+ String[] list();
ParcelFileDescriptor openWrite(String name, long offsetBytes, long lengthBytes);
+ ParcelFileDescriptor openRead(String name);
void close();
void commit(in IPackageInstallObserver2 observer);
diff --git a/core/java/android/content/pm/InstallSessionInfo.java b/core/java/android/content/pm/InstallSessionInfo.java
index a9c574a..f263885 100644
--- a/core/java/android/content/pm/InstallSessionInfo.java
+++ b/core/java/android/content/pm/InstallSessionInfo.java
@@ -16,7 +16,9 @@
package android.content.pm;
+import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;
@@ -32,6 +34,8 @@ public class InstallSessionInfo implements Parcelable {
public String installerPackageName;
/** {@hide} */
public float progress;
+ /** {@hide} */
+ public boolean open;
/** {@hide} */
public int mode;
@@ -53,6 +57,7 @@ public class InstallSessionInfo implements Parcelable {
sessionId = source.readInt();
installerPackageName = source.readString();
progress = source.readFloat();
+ open = source.readInt() != 0;
mode = source.readInt();
sizeBytes = source.readLong();
@@ -88,6 +93,13 @@ public class InstallSessionInfo implements Parcelable {
}
/**
+ * Return if this session is currently open.
+ */
+ public boolean isOpen() {
+ return open;
+ }
+
+ /**
* Return the package name this session is working with. May be {@code null}
* if unknown.
*/
@@ -111,6 +123,23 @@ public class InstallSessionInfo implements Parcelable {
return appLabel;
}
+ /**
+ * Return an Intent that can be started to view details about this install
+ * session. This may surface actions such as pause, resume, or cancel.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you safeguard
+ * against this.
+ *
+ * @see PackageInstaller#ACTION_SESSION_DETAILS
+ */
+ public @Nullable Intent getDetailsIntent() {
+ final Intent intent = new Intent(PackageInstaller.ACTION_SESSION_DETAILS);
+ intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId);
+ intent.setPackage(installerPackageName);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return intent;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -121,6 +150,7 @@ public class InstallSessionInfo implements Parcelable {
dest.writeInt(sessionId);
dest.writeString(installerPackageName);
dest.writeFloat(progress);
+ dest.writeInt(open ? 1 : 0);
dest.writeInt(mode);
dest.writeLong(sizeBytes);
diff --git a/core/java/android/content/pm/InstallSessionParams.java b/core/java/android/content/pm/InstallSessionParams.java
index 3de9863..1716e39 100644
--- a/core/java/android/content/pm/InstallSessionParams.java
+++ b/core/java/android/content/pm/InstallSessionParams.java
@@ -17,6 +17,7 @@
package android.content.pm;
import android.annotation.Nullable;
+import android.app.ActivityManager;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
@@ -30,6 +31,9 @@ import com.android.internal.util.IndentingPrintWriter;
*/
public class InstallSessionParams implements Parcelable {
+ /** {@hide} */
+ public static final int MODE_INVALID = -1;
+
/**
* Mode for an install session whose staged APKs should fully replace any
* existing APKs for the target app.
@@ -48,21 +52,19 @@ public class InstallSessionParams implements Parcelable {
public static final int MODE_INHERIT_EXISTING = 2;
/** {@hide} */
- public int mode;
+ public int mode = MODE_INVALID;
/** {@hide} */
public int installFlags;
/** {@hide} */
public int installLocation = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
/** {@hide} */
- public Signature[] signatures;
- /** {@hide} */
public long sizeBytes = -1;
/** {@hide} */
public String appPackageName;
/** {@hide} */
public Bitmap appIcon;
/** {@hide} */
- public CharSequence appLabel;
+ public String appLabel;
/** {@hide} */
public Uri originatingUri;
/** {@hide} */
@@ -86,7 +88,6 @@ public class InstallSessionParams implements Parcelable {
mode = source.readInt();
installFlags = source.readInt();
installLocation = source.readInt();
- signatures = (Signature[]) source.readParcelableArray(null);
sizeBytes = source.readLong();
appPackageName = source.readString();
appIcon = source.readParcelable(null);
@@ -106,16 +107,13 @@ public class InstallSessionParams implements Parcelable {
}
/**
- * Optionally provide a set of certificates for the app being installed.
- * <p>
- * If the APKs staged in the session aren't consistent with these
- * signatures, the install will fail. Regardless of this value, all APKs in
- * the app must have the same signing certificates.
- *
- * @see PackageInfo#signatures
+ * @deprecated use {@link PackageInstaller.Session#openRead(String)} to
+ * calculate message digest instead.
+ * @hide
*/
+ @Deprecated
public void setSignatures(@Nullable Signature[] signatures) {
- this.signatures = signatures;
+ throw new UnsupportedOperationException();
}
/**
@@ -146,7 +144,8 @@ public class InstallSessionParams implements Parcelable {
/**
* Optionally set an icon representing the app being installed. This should
- * be at least {@link android.R.dimen#app_icon_size} in both dimensions.
+ * be roughly {@link ActivityManager#getLauncherLargeIconSize()} in both
+ * dimensions.
*/
public void setAppIcon(@Nullable Bitmap appIcon) {
this.appIcon = appIcon;
@@ -156,7 +155,7 @@ public class InstallSessionParams implements Parcelable {
* Optionally set a label representing the app being installed.
*/
public void setAppLabel(@Nullable CharSequence appLabel) {
- this.appLabel = appLabel;
+ this.appLabel = (appLabel != null) ? appLabel.toString() : null;
}
/**
@@ -184,7 +183,6 @@ public class InstallSessionParams implements Parcelable {
pw.printPair("mode", mode);
pw.printHexPair("installFlags", installFlags);
pw.printPair("installLocation", installLocation);
- pw.printPair("signatures", (signatures != null));
pw.printPair("sizeBytes", sizeBytes);
pw.printPair("appPackageName", appPackageName);
pw.printPair("appIcon", (appIcon != null));
@@ -205,11 +203,10 @@ public class InstallSessionParams implements Parcelable {
dest.writeInt(mode);
dest.writeInt(installFlags);
dest.writeInt(installLocation);
- dest.writeParcelableArray(signatures, flags);
dest.writeLong(sizeBytes);
dest.writeString(appPackageName);
dest.writeParcelable(appIcon, flags);
- dest.writeString(appLabel != null ? appLabel.toString() : null);
+ dest.writeString(appLabel);
dest.writeParcelable(originatingUri, flags);
dest.writeParcelable(referrerUri, flags);
dest.writeString(abiOverride);
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index a114bb8..8af827e 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -18,9 +18,10 @@ package android.content.pm;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.app.PackageInstallObserver;
import android.app.PackageUninstallObserver;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.FileBridge;
import android.os.Handler;
@@ -32,7 +33,9 @@ import android.util.ExceptionUtils;
import java.io.Closeable;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
+import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -63,6 +66,27 @@ import java.util.List;
* </ul>
*/
public class PackageInstaller {
+ /**
+ * Activity Action: Show details about a particular install session. This
+ * may surface actions such as pause, resume, or cancel.
+ * <p>
+ * This should always be scoped to the installer package that owns the
+ * session. Clients should use {@link InstallSessionInfo#getDetailsIntent()}
+ * to build this intent correctly.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you safeguard
+ * against this.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS";
+
+ /**
+ * An integer session ID.
+ *
+ * @see #ACTION_SESSION_DETAILS
+ */
+ public static final String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID";
+
private final PackageManager mPm;
private final IPackageInstaller mInstaller;
private final int mUserId;
@@ -180,14 +204,32 @@ public class PackageInstaller {
/**
* Events for observing session lifecycle.
+ * <p>
+ * A typical session lifecycle looks like this:
+ * <ul>
+ * <li>An installer creates a session to indicate pending app delivery. All
+ * install details are available at this point.
+ * <li>The installer opens the session to deliver APK data. Note that a
+ * session may be opened and closed multiple times as network connectivity
+ * changes. The installer may deliver periodic progress updates.
+ * <li>The installer commits or abandons the session, resulting in the
+ * session being finished.
+ * </ul>
*/
public static abstract class SessionCallback {
/**
- * New session has been created.
+ * New session has been created. Details about the session can be
+ * obtained from {@link PackageInstaller#getSessionInfo(int)}.
*/
public abstract void onCreated(int sessionId);
/**
+ * Session has been opened. A session is usually opened when the
+ * installer is actively writing data.
+ */
+ public abstract void onOpened(int sessionId);
+
+ /**
* Progress for given session has been updated.
* <p>
* Note that this progress may not directly correspond to the value
@@ -198,6 +240,11 @@ public class PackageInstaller {
public abstract void onProgressChanged(int sessionId, float progress);
/**
+ * Session has been closed.
+ */
+ public abstract void onClosed(int sessionId);
+
+ /**
* Session has completely finished, either with success or failure.
*/
public abstract void onFinished(int sessionId, boolean success);
@@ -207,8 +254,10 @@ public class PackageInstaller {
private static class SessionCallbackDelegate extends IPackageInstallerCallback.Stub implements
Handler.Callback {
private static final int MSG_SESSION_CREATED = 1;
- private static final int MSG_SESSION_PROGRESS_CHANGED = 2;
- private static final int MSG_SESSION_FINISHED = 3;
+ private static final int MSG_SESSION_OPENED = 2;
+ private static final int MSG_SESSION_PROGRESS_CHANGED = 3;
+ private static final int MSG_SESSION_CLOSED = 4;
+ private static final int MSG_SESSION_FINISHED = 5;
final SessionCallback mCallback;
final Handler mHandler;
@@ -224,9 +273,15 @@ public class PackageInstaller {
case MSG_SESSION_CREATED:
mCallback.onCreated(msg.arg1);
return true;
+ case MSG_SESSION_OPENED:
+ mCallback.onOpened(msg.arg1);
+ return true;
case MSG_SESSION_PROGRESS_CHANGED:
mCallback.onProgressChanged(msg.arg1, (float) msg.obj);
return true;
+ case MSG_SESSION_CLOSED:
+ mCallback.onClosed(msg.arg1);
+ return true;
case MSG_SESSION_FINISHED:
mCallback.onFinished(msg.arg1, msg.arg2 != 0);
return true;
@@ -240,12 +295,22 @@ public class PackageInstaller {
}
@Override
+ public void onSessionOpened(int sessionId) {
+ mHandler.obtainMessage(MSG_SESSION_OPENED, sessionId, 0).sendToTarget();
+ }
+
+ @Override
public void onSessionProgressChanged(int sessionId, float progress) {
mHandler.obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, 0, progress)
.sendToTarget();
}
@Override
+ public void onSessionClosed(int sessionId) {
+ mHandler.obtainMessage(MSG_SESSION_CLOSED, sessionId, 0).sendToTarget();
+ }
+
+ @Override
public void onSessionFinished(int sessionId, boolean success) {
mHandler.obtainMessage(MSG_SESSION_FINISHED, sessionId, success ? 1 : 0)
.sendToTarget();
@@ -373,7 +438,7 @@ public class PackageInstaller {
ExceptionUtils.maybeUnwrapIOException(e);
throw e;
} catch (RemoteException e) {
- throw new IOException(e);
+ throw e.rethrowAsRuntimeException();
}
}
@@ -391,6 +456,40 @@ public class PackageInstaller {
}
/**
+ * List all APK names contained in this session.
+ * <p>
+ * This returns all names which have been previously written through
+ * {@link #openWrite(String, long, long)} as part of this session.
+ */
+ public @NonNull String[] list() {
+ try {
+ return mSession.list();
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
+ /**
+ * Open a stream to read an APK file from the session.
+ * <p>
+ * This is only valid for names which have been previously written
+ * through {@link #openWrite(String, long, long)} as part of this
+ * session. For example, this stream may be used to calculate a
+ * {@link MessageDigest} of a written APK before committing.
+ */
+ public @NonNull InputStream openRead(@NonNull String name) throws IOException {
+ try {
+ final ParcelFileDescriptor pfd = mSession.openRead(name);
+ return new ParcelFileDescriptor.AutoCloseInputStream(pfd);
+ } catch (RuntimeException e) {
+ ExceptionUtils.maybeUnwrapIOException(e);
+ throw e;
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
+ /**
* Attempt to commit everything staged in this session. This may require
* user intervention, and so it may not happen immediately. The final
* result of the commit will be reported through the given callback.
diff --git a/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java b/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java
index 27829a7..6e1844a 100644
--- a/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java
+++ b/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java
@@ -65,6 +65,18 @@ public final class HdmiCecDeviceInfo implements Parcelable {
*/
public static final int ADDR_INTERNAL = 0;
+ /**
+ * Physical address used to indicate the source comes from internal device.
+ * The physical address of TV(0) is used.
+ */
+ public static final int PATH_INTERNAL = 0x0000;
+
+ /** Invalid physical address (routing path) */
+ public static final int PATH_INVALID = 0xFFFF;
+
+ /** Invalid port ID */
+ public static final int PORT_INVALID = -1;
+
// Logical address, physical address, device type, vendor id and display name
// are immutable value.
private final int mLogicalAddress;
diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
index 808e0c9..920a1f4 100644
--- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl
+++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
@@ -37,6 +37,7 @@ import java.util.List;
*/
interface IHdmiControlService {
int[] getSupportedTypes();
+ HdmiCecDeviceInfo getActiveSource();
void oneTouchPlay(IHdmiControlCallback callback);
void queryDisplayStatus(IHdmiControlCallback callback);
void addHotplugEventListener(IHdmiHotplugEventListener listener);
diff --git a/core/java/android/hardware/location/GeofenceHardwareImpl.java b/core/java/android/hardware/location/GeofenceHardwareImpl.java
index 6734878..5c7a8da 100644
--- a/core/java/android/hardware/location/GeofenceHardwareImpl.java
+++ b/core/java/android/hardware/location/GeofenceHardwareImpl.java
@@ -139,8 +139,8 @@ public final class GeofenceHardwareImpl {
private void updateFusedHardwareAvailability() {
boolean fusedSupported;
try {
- fusedSupported = mFusedService.isSupported();
- } catch(RemoteException e) {
+ fusedSupported = (mFusedService != null ? mFusedService.isSupported() : false);
+ } catch (RemoteException e) {
Log.e(TAG, "RemoteException calling LocationManagerService");
fusedSupported = false;
}
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index afac239..c3ac012 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -61,6 +61,12 @@ public class Process {
public static final String SECONDARY_ZYGOTE_SOCKET = "zygote_secondary";
/**
+ * Defines the root UID.
+ * @hide
+ */
+ public static final int ROOT_UID = 0;
+
+ /**
* Defines the UID/GID under which system code runs.
*/
public static final int SYSTEM_UID = 1000;
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index d385131..13f93a7 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -625,8 +625,9 @@ public class UserManager {
Settings.Secure.putStringForUser(context.getContentResolver(),
Settings.Secure.SKIP_FIRST_USE_HINTS, "1", guest.id);
try {
- mService.setUserRestrictions(
- mService.getDefaultGuestRestrictions(), guest.id);
+ Bundle guestRestrictions = mService.getDefaultGuestRestrictions();
+ guestRestrictions.putBoolean(DISALLOW_SMS, true);
+ mService.setUserRestrictions(guestRestrictions, guest.id);
} catch (RemoteException re) {
Log.w(TAG, "Could not update guest restrictions");
}
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index 3f53ad4..5248131 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -45,18 +45,22 @@ public class AlwaysOnHotwordDetector {
* Indicates that this hotword detector is no longer valid for any recognition
* and should not be used anymore.
*/
- public static final int STATE_INVALID = -3;
+ private static final int STATE_INVALID = -3;
+
/**
* Indicates that recognition for the given keyphrase is not available on the system
* because of the hardware configuration.
+ * No further interaction should be performed with the detector that returns this availability.
*/
public static final int STATE_HARDWARE_UNAVAILABLE = -2;
/**
* Indicates that recognition for the given keyphrase is not supported.
+ * No further interaction should be performed with the detector that returns this availability.
*/
public static final int STATE_KEYPHRASE_UNSUPPORTED = -1;
/**
* Indicates that the given keyphrase is not enrolled.
+ * The caller may choose to begin an enrollment flow for the keyphrase.
*/
public static final int STATE_KEYPHRASE_UNENROLLED = 1;
/**
@@ -91,12 +95,14 @@ public class AlwaysOnHotwordDetector {
// Must be kept in sync with the related attribute defined as searchKeyphraseRecognitionFlags.
/**
- * Simple recognition of the key phrase. Returned by {@link #getSupportedRecognitionModes()}
+ * Simple recognition of the key phrase.
+ * Returned by {@link #getSupportedRecognitionModes()}
*/
public static final int RECOGNITION_MODE_VOICE_TRIGGER
= SoundTrigger.RECOGNITION_MODE_VOICE_TRIGGER;
/**
- * Trigger only if one user is identified. Returned by {@link #getSupportedRecognitionModes()}
+ * User identification performed with the keyphrase recognition.
+ * Returned by {@link #getSupportedRecognitionModes()}
*/
public static final int RECOGNITION_MODE_USER_IDENTIFICATION
= SoundTrigger.RECOGNITION_MODE_USER_IDENTIFICATION;
@@ -149,16 +155,11 @@ public class AlwaysOnHotwordDetector {
*
* Availability implies whether the hardware on this system is capable of listening for
* the given keyphrase or not. <p/>
- * If the return code is one of {@link #STATE_HARDWARE_UNAVAILABLE} or
- * {@link #STATE_KEYPHRASE_UNSUPPORTED},
- * detection is not possible and no further interaction should be
- * performed with this detector. <br/>
- * If it is {@link #STATE_KEYPHRASE_UNENROLLED} the caller may choose to begin
- * an enrollment flow for the keyphrase. <br/>
- * and for {@link #STATE_KEYPHRASE_ENROLLED} a recognition can be started as desired. <p/>
*
- * If the return code is {@link #STATE_INVALID}, this detector is stale.
- * A new detector should be obtained for use in the future.
+ * @see AlwaysOnHotwordDetector#STATE_HARDWARE_UNAVAILABLE
+ * @see AlwaysOnHotwordDetector#STATE_KEYPHRASE_UNSUPPORTED
+ * @see AlwaysOnHotwordDetector#STATE_KEYPHRASE_UNENROLLED
+ * @see AlwaysOnHotwordDetector#STATE_KEYPHRASE_ENROLLED
*/
void onAvailabilityChanged(int status);
/**
@@ -217,9 +218,15 @@ public class AlwaysOnHotwordDetector {
/**
* Gets the recognition modes supported by the associated keyphrase.
*
+ * @see #RECOGNITION_MODE_USER_IDENTIFICATION
+ * @see #RECOGNITION_MODE_VOICE_TRIGGER
+ *
* @throws UnsupportedOperationException if the keyphrase itself isn't supported.
* Callers should only call this method after a supported state callback on
* {@link Callback#onAvailabilityChanged(int)} to avoid this exception.
+ * @throws IllegalStateException if the detector is in an invalid state.
+ * This may happen if another detector has been instantiated or the
+ * {@link VoiceInteractionService} hosting this detector has been shut down.
*/
public int getSupportedRecognitionModes() {
synchronized (mLock) {
@@ -228,6 +235,11 @@ public class AlwaysOnHotwordDetector {
}
private int getSupportedRecognitionModesLocked() {
+ if (mAvailability == STATE_INVALID) {
+ throw new IllegalStateException(
+ "getSupportedRecognitionModes called on an invalid detector");
+ }
+
// This method only makes sense if we can actually support a recognition.
if (mAvailability != STATE_KEYPHRASE_ENROLLED
&& mAvailability != STATE_KEYPHRASE_UNENROLLED) {
@@ -247,9 +259,16 @@ public class AlwaysOnHotwordDetector {
* @throws UnsupportedOperationException if the recognition isn't supported.
* Callers should only call this method after a supported state callback on
* {@link Callback#onAvailabilityChanged(int)} to avoid this exception.
+ * @throws IllegalStateException if the detector is in an invalid state.
+ * This may happen if another detector has been instantiated or the
+ * {@link VoiceInteractionService} hosting this detector has been shut down.
*/
public void startRecognition(int recognitionFlags) {
synchronized (mLock) {
+ if (mAvailability == STATE_INVALID) {
+ throw new IllegalStateException("startRecognition called on an invalid detector");
+ }
+
// Check if we can start/stop a recognition.
if (mAvailability != STATE_KEYPHRASE_ENROLLED) {
throw new UnsupportedOperationException(
@@ -268,9 +287,16 @@ public class AlwaysOnHotwordDetector {
* @throws UnsupportedOperationException if the recognition isn't supported.
* Callers should only call this method after a supported state callback on
* {@link Callback#onAvailabilityChanged(int)} to avoid this exception.
+ * @throws IllegalStateException if the detector is in an invalid state.
+ * This may happen if another detector has been instantiated or the
+ * {@link VoiceInteractionService} hosting this detector has been shut down.
*/
public void stopRecognition() {
synchronized (mLock) {
+ if (mAvailability == STATE_INVALID) {
+ throw new IllegalStateException("stopRecognition called on an invalid detector");
+ }
+
// Check if we can start/stop a recognition.
if (mAvailability != STATE_KEYPHRASE_ENROLLED) {
throw new UnsupportedOperationException(
@@ -293,14 +319,28 @@ public class AlwaysOnHotwordDetector {
* @throws UnsupportedOperationException if managing they keyphrase isn't supported.
* Callers should only call this method after a supported state callback on
* {@link Callback#onAvailabilityChanged(int)} to avoid this exception.
+ * @throws IllegalStateException if the detector is in an invalid state.
+ * This may happen if another detector has been instantiated or the
+ * {@link VoiceInteractionService} hosting this detector has been shut down.
*/
public Intent getManageIntent(int action) {
+ synchronized (mLock) {
+ return getManageIntentLocked(action);
+ }
+ }
+
+ private Intent getManageIntentLocked(int action) {
+ if (mAvailability == STATE_INVALID) {
+ throw new IllegalStateException("getManageIntent called on an invalid detector");
+ }
+
// This method only makes sense if we can actually support a recognition.
if (mAvailability != STATE_KEYPHRASE_ENROLLED
&& mAvailability != STATE_KEYPHRASE_UNENROLLED) {
throw new UnsupportedOperationException(
"Managing the given keyphrase is not supported");
}
+
if (action != MANAGE_ACTION_ENROLL
&& action != MANAGE_ACTION_RE_ENROLL
&& action != MANAGE_ACTION_UN_ENROLL) {
@@ -387,7 +427,6 @@ public class AlwaysOnHotwordDetector {
if (DBG) Slog.d(TAG, "starting recognition...");
int status = startRecognitionLocked();
if (status == STATUS_OK) {
- mInternalState |= FLAG_STARTED;
mHandler.sendEmptyMessage(MSG_DETECTION_STARTED);
} else {
if (DBG) Slog.d(TAG, "failed to start recognition: " + status);
@@ -404,7 +443,6 @@ public class AlwaysOnHotwordDetector {
if (DBG) Slog.d(TAG, "stopping recognition...");
int status = stopRecognitionLocked();
if (status == STATUS_OK) {
- mInternalState &= ~FLAG_STARTED;
if (!requested) mHandler.sendEmptyMessage(MSG_DETECTION_STOPPED);
} else {
if (!requested) mHandler.sendEmptyMessage(MSG_DETECTION_ERROR);
@@ -483,20 +521,42 @@ public class AlwaysOnHotwordDetector {
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
+ synchronized (mLock) {
+ if (mAvailability == STATE_INVALID) {
+ Slog.w(TAG, "Received message: " + msg.what + " for an invalid detector");
+ return;
+ }
+ }
+
switch (msg.what) {
case MSG_STATE_CHANGED:
mExternalCallback.onAvailabilityChanged(msg.arg1);
break;
case MSG_HOTWORD_DETECTED:
+ synchronized (mLock) {
+ mInternalState &= ~FLAG_REQUESTED;
+ mInternalState &= ~FLAG_STARTED;
+ }
mExternalCallback.onDetected((byte[]) msg.obj);
break;
case MSG_DETECTION_STARTED:
+ synchronized (mLock) {
+ mInternalState |= FLAG_STARTED;
+ }
mExternalCallback.onDetectionStarted();
break;
case MSG_DETECTION_STOPPED:
+ synchronized (mLock) {
+ mInternalState &= ~FLAG_REQUESTED;
+ mInternalState &= ~FLAG_STARTED;
+ }
mExternalCallback.onDetectionStopped();
break;
case MSG_DETECTION_ERROR:
+ synchronized (mLock) {
+ mInternalState &= ~FLAG_REQUESTED;
+ mInternalState &= ~FLAG_STARTED;
+ }
mExternalCallback.onError();
break;
default:
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index f3a48a6..cb447fd 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -518,7 +518,7 @@ public class TtsSpan implements ParcelableSpan {
* This class uses generics so methods from this class can return instances
* of its child classes, resulting in a fluent API (CRTP pattern).
*/
- public static abstract class Builder<C extends Builder<C>> {
+ public static class Builder<C extends Builder<?>> {
// Holds the type of this class.
private final String mType;
@@ -580,7 +580,7 @@ public class TtsSpan implements ParcelableSpan {
* this builder like {@link TtsSpan.TextBuilder} and
* {@link TtsSpan.CardinalBuilder} are likely more useful.
*/
- public static class SemioticClassBuilder<C extends SemioticClassBuilder<C>>
+ public static class SemioticClassBuilder<C extends SemioticClassBuilder<?>>
extends Builder<C> {
public SemioticClassBuilder(String type) {
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index e9ec565..eee4973 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -355,9 +355,10 @@ public class RenderNode {
return nSetOutlineEmpty(mNativeRenderNode);
} else if (outline.mRect != null) {
return nSetOutlineRoundRect(mNativeRenderNode, outline.mRect.left, outline.mRect.top,
- outline.mRect.right, outline.mRect.bottom, outline.mRadius);
+ outline.mRect.right, outline.mRect.bottom, outline.mRadius, outline.mAlpha);
} else if (outline.mPath != null) {
- return nSetOutlineConvexPath(mNativeRenderNode, outline.mPath.mNativePath);
+ return nSetOutlineConvexPath(mNativeRenderNode, outline.mPath.mNativePath,
+ outline.mAlpha);
}
throw new IllegalArgumentException("Unrecognized outline?");
}
@@ -849,8 +850,9 @@ public class RenderNode {
private static native boolean nSetProjectBackwards(long renderNode, boolean shouldProject);
private static native boolean nSetProjectionReceiver(long renderNode, boolean shouldRecieve);
private static native boolean nSetOutlineRoundRect(long renderNode, int left, int top,
- int right, int bottom, float radius);
- private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath);
+ int right, int bottom, float radius, float alpha);
+ private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath,
+ float alpha);
private static native boolean nSetOutlineEmpty(long renderNode);
private static native boolean nSetOutlineNone(long renderNode);
private static native boolean nSetClipToOutline(long renderNode, boolean clipToOutline);
diff --git a/core/java/android/view/ViewOutlineProvider.java b/core/java/android/view/ViewOutlineProvider.java
index 64624ae..4054031 100644
--- a/core/java/android/view/ViewOutlineProvider.java
+++ b/core/java/android/view/ViewOutlineProvider.java
@@ -25,7 +25,8 @@ import android.graphics.drawable.Drawable;
public abstract class ViewOutlineProvider {
/**
* Default outline provider for Views, which queries the Outline from the View's background,
- * or returns <code>false</code> if the View does not have a background.
+ * or generates a 0 alpha, rectangular Outline the size of the View if a background
+ * isn't present.
*
* @see Drawable#getOutline(Outline)
*/
@@ -35,6 +36,10 @@ public abstract class ViewOutlineProvider {
Drawable background = view.getBackground();
if (background != null) {
background.getOutline(outline);
+ } else {
+
+ outline.setRect(0, 0, view.getWidth(), view.getHeight());
+ outline.setAlpha(0.0f);
}
}
};
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index c169d35..e7b3152 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -1425,6 +1425,21 @@ public abstract class Window {
public void setEnterTransition(Transition transition) {}
/**
+ * Sets the Transition that will be used to move Views out of the scene when the Window is
+ * preparing to close, for example after a call to
+ * {@link android.app.Activity#finishAfterTransition()}. The exiting
+ * Views will be those that are regular Views or ViewGroups that have
+ * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+ * {@link android.transition.Visibility} as entering is governed by changing visibility from
+ * {@link View#VISIBLE} to {@link View#INVISIBLE}. If <code>transition</code> is null,
+ * entering Views will remain unaffected. If nothing is set, the default will be to
+ * use the same value as set in {@link #setEnterTransition(android.transition.Transition)}.
+ * @param transition The Transition to use to move Views out of the Scene when the Window
+ * is preparing to close.
+ */
+ public void setReturnTransition(Transition transition) {}
+
+ /**
* Sets the Transition that will be used to move Views out of the scene when starting a
* new Activity. The exiting Views will be those that are regular Views or ViewGroups that
* have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
@@ -1437,6 +1452,20 @@ public abstract class Window {
public void setExitTransition(Transition transition) {}
/**
+ * Sets the Transition that will be used to move Views in to the scene when returning from
+ * a previously-started Activity. The entering Views will be those that are regular Views
+ * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions
+ * will extend {@link android.transition.Visibility} as exiting is governed by changing
+ * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null,
+ * the views will remain unaffected. If nothing is set, the default will be to use the same
+ * transition as {@link #setExitTransition(android.transition.Transition)}.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @param transition The Transition to use to move Views into the scene when reentering from a
+ * previously-started Activity.
+ */
+ public void setReenterTransition(Transition transition) {}
+
+ /**
* Returns the transition used to move Views into the initial scene. The entering
* Views will be those that are regular Views or ViewGroups that have
* {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
@@ -1449,6 +1478,19 @@ public abstract class Window {
public Transition getEnterTransition() { return null; }
/**
+ * Returns he Transition that will be used to move Views out of the scene when the Window is
+ * preparing to close, for example after a call to
+ * {@link android.app.Activity#finishAfterTransition()}. The exiting
+ * Views will be those that are regular Views or ViewGroups that have
+ * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+ * {@link android.transition.Visibility} as entering is governed by changing visibility from
+ * {@link View#VISIBLE} to {@link View#INVISIBLE}.
+ * @return The Transition to use to move Views out of the Scene when the Window
+ * is preparing to close.
+ */
+ public Transition getReturnTransition() { return null; }
+
+ /**
* Returns the Transition that will be used to move Views out of the scene when starting a
* new Activity. The exiting Views will be those that are regular Views or ViewGroups that
* have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
@@ -1461,6 +1503,18 @@ public abstract class Window {
public Transition getExitTransition() { return null; }
/**
+ * Returns the Transition that will be used to move Views in to the scene when returning from
+ * a previously-started Activity. The entering Views will be those that are regular Views
+ * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions
+ * will extend {@link android.transition.Visibility} as exiting is governed by changing
+ * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @return The Transition to use to move Views into the scene when reentering from a
+ * previously-started Activity.
+ */
+ public Transition getReenterTransition() { return null; }
+
+ /**
* Sets the Transition that will be used for shared elements transferred into the content
* Scene. Typical Transitions will affect size and location, such as
* {@link android.transition.ChangeBounds}. A null
@@ -1472,6 +1526,19 @@ public abstract class Window {
public void setSharedElementEnterTransition(Transition transition) {}
/**
+ * Sets the Transition that will be used for shared elements transferred back to a
+ * calling Activity. Typical Transitions will affect size and location, such as
+ * {@link android.transition.ChangeBounds}. A null
+ * value will cause transferred shared elements to blink to the final position.
+ * If no value is set, the default will be to use the same value as
+ * {@link #setSharedElementEnterTransition(android.transition.Transition)}.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @param transition The Transition to use for shared elements transferred out of the content
+ * Scene.
+ */
+ public void setSharedElementReturnTransition(Transition transition) {}
+
+ /**
* Returns the Transition that will be used for shared elements transferred into the content
* Scene. Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
* @return Transition to use for sharend elements transferred into the content Scene.
@@ -1479,6 +1546,13 @@ public abstract class Window {
public Transition getSharedElementEnterTransition() { return null; }
/**
+ * Returns the Transition that will be used for shared elements transferred back to a
+ * calling Activity. Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @return Transition to use for sharend elements transferred into the content Scene.
+ */
+ public Transition getSharedElementReturnTransition() { return null; }
+
+ /**
* Sets the Transition that will be used for shared elements after starting a new Activity
* before the shared elements are transferred to the called Activity. If the shared elements
* must animate during the exit transition, this Transition should be used. Upon completion,
@@ -1490,6 +1564,17 @@ public abstract class Window {
public void setSharedElementExitTransition(Transition transition) {}
/**
+ * Sets the Transition that will be used for shared elements reentering from a started
+ * Activity after it has returned the shared element to it start location. If no value
+ * is set, this will default to
+ * {@link #setSharedElementExitTransition(android.transition.Transition)}.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @param transition The Transition to use for shared elements in the launching Window
+ * after the shared element has returned to the Window.
+ */
+ public void setSharedElementReenterTransition(Transition transition) {}
+
+ /**
* Returns the Transition to use for shared elements in the launching Window prior
* to transferring to the launched Activity's Window.
* Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
@@ -1500,6 +1585,16 @@ public abstract class Window {
public Transition getSharedElementExitTransition() { return null; }
/**
+ * Returns the Transition that will be used for shared elements reentering from a started
+ * Activity after it has returned the shared element to it start location.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ *
+ * @return the Transition that will be used for shared elements reentering from a started
+ * Activity after it has returned the shared element to it start location.
+ */
+ public Transition getSharedElementReenterTransition() { return null; }
+
+ /**
* Controls how the transition set in
* {@link #setEnterTransition(android.transition.Transition)} overlaps with the exit
* transition of the calling Activity. When true, the transition will start as soon as possible.
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index 2c7b3eb..2e836fb 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -16,16 +16,26 @@
package android.webkit;
+import android.app.ActivityManagerInternal;
+import android.app.Application;
+import android.app.AppGlobals;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StrictMode;
+import android.os.SystemProperties;
+import android.text.TextUtils;
import android.util.AndroidRuntimeException;
import android.util.Log;
+import com.android.server.LocalServices;
import dalvik.system.VMRuntime;
import java.io.File;
+import java.util.Arrays;
import com.android.internal.os.Zygote;
@@ -42,17 +52,15 @@ public final class WebViewFactory {
private static final String NULL_WEBVIEW_FACTORY =
"com.android.webview.nullwebview.NullWebViewFactoryProvider";
- // TODO(torne): we need to use a system property instead of hardcoding the library paths to
- // enable it to be changed when a webview update apk is installed.
- private static final String CHROMIUM_WEBVIEW_NATIVE_LIB_32 =
- "/system/lib/libwebviewchromium.so";
- private static final String CHROMIUM_WEBVIEW_NATIVE_LIB_64 =
- "/system/lib64/libwebviewchromium.so";
private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_32 =
"/data/misc/shared_relro/libwebviewchromium32.relro";
private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_64 =
"/data/misc/shared_relro/libwebviewchromium64.relro";
+ public static final String CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY =
+ "persist.sys.webview.vmsize";
+ private static final long CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES = 100 * 1024 * 1024;
+
private static final String LOGTAG = "WebViewFactory";
private static final boolean DEBUG = false;
@@ -64,8 +72,8 @@ public final class WebViewFactory {
private static boolean sAddressSpaceReserved = false;
public static String getWebViewPackageName() {
- // TODO: Make this dynamic based on resource configuration.
- return "com.android.webview";
+ return AppGlobals.getInitialApplication().getString(
+ com.android.internal.R.string.config_webViewPackageName);
}
static WebViewFactoryProvider getProvider() {
@@ -99,10 +107,18 @@ public final class WebViewFactory {
}
private static Class<WebViewFactoryProvider> getFactoryClass() throws ClassNotFoundException {
+ Application initialApplication = AppGlobals.getInitialApplication();
try {
- return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY);
- } catch (ClassNotFoundException e) {
- Log.e(LOGTAG, "Chromium WebView does not exist");
+ Context webViewContext = initialApplication.createPackageContext(
+ getWebViewPackageName(),
+ Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
+ initialApplication.getAssets().addAssetPath(
+ webViewContext.getApplicationInfo().sourceDir);
+ ClassLoader clazzLoader = webViewContext.getClassLoader();
+ return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY, true,
+ clazzLoader);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(LOGTAG, "Chromium WebView package does not exist");
return (Class<WebViewFactoryProvider>) Class.forName(NULL_WEBVIEW_FACTORY);
}
}
@@ -114,79 +130,197 @@ public final class WebViewFactory {
public static void prepareWebViewInZygote() {
try {
System.loadLibrary("webviewchromium_loader");
- sAddressSpaceReserved = nativeReserveAddressSpace(CHROMIUM_WEBVIEW_NATIVE_LIB_32,
- CHROMIUM_WEBVIEW_NATIVE_LIB_64);
+ long addressSpaceToReserve =
+ SystemProperties.getLong(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY,
+ CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES);
+ sAddressSpaceReserved = nativeReserveAddressSpace(addressSpaceToReserve);
+
if (sAddressSpaceReserved) {
- if (DEBUG) Log.v(LOGTAG, "address space reserved");
+ if (DEBUG) {
+ Log.v(LOGTAG, "address space reserved: " + addressSpaceToReserve + " bytes");
+ }
} else {
- Log.e(LOGTAG, "reserving address space failed");
+ Log.e(LOGTAG, "reserving " + addressSpaceToReserve +
+ " bytes of address space failed");
}
- } catch (Throwable e) {
+ } catch (Throwable t) {
// Log and discard errors at this stage as we must not crash the zygote.
- Log.e(LOGTAG, "error preparing native loader", e);
+ Log.e(LOGTAG, "error preparing native loader", t);
}
}
/**
* Perform any WebView loading preparations that must happen at boot from the system server,
- * after the package manager has started.
+ * after the package manager has started or after an update to the webview is installed.
* This must be called in the system server.
* Currently, this means spawning the child processes which will create the relro files.
*/
public static void prepareWebViewInSystemServer() {
+ String[] nativePaths = null;
+ try {
+ nativePaths = getWebViewNativeLibraryPaths();
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ prepareWebViewInSystemServer(nativePaths);
+ }
+
+ private static void prepareWebViewInSystemServer(String[] nativeLibraryPaths) {
if (DEBUG) Log.v(LOGTAG, "creating relro files");
- if (new File(CHROMIUM_WEBVIEW_NATIVE_LIB_64).exists()) {
- createRelroFile(Build.SUPPORTED_64_BIT_ABIS[0]);
+
+ // We must always trigger createRelRo regardless of the value of nativeLibraryPaths. Any
+ // unexpected values will be handled there to ensure that we trigger notifying any process
+ // waiting on relreo creation.
+ if (Build.SUPPORTED_32_BIT_ABIS.length > 0) {
+ if (DEBUG) Log.v(LOGTAG, "Create 32 bit relro");
+ createRelroFile(false /* is64Bit */, nativeLibraryPaths);
+ }
+
+ if (Build.SUPPORTED_64_BIT_ABIS.length > 0) {
+ if (DEBUG) Log.v(LOGTAG, "Create 64 bit relro");
+ createRelroFile(true /* is64Bit */, nativeLibraryPaths);
}
- if (new File(CHROMIUM_WEBVIEW_NATIVE_LIB_32).exists()) {
- createRelroFile(Build.SUPPORTED_32_BIT_ABIS[0]);
+ }
+
+ public static void onWebViewUpdateInstalled() {
+ String[] nativeLibs = null;
+ try {
+ nativeLibs = WebViewFactory.getWebViewNativeLibraryPaths();
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+
+ if (nativeLibs != null) {
+ long newVmSize = 0L;
+
+ for (String path : nativeLibs) {
+ if (DEBUG) Log.d(LOGTAG, "Checking file size of " + path);
+ if (path == null) continue;
+ File f = new File(path);
+ if (f.exists()) {
+ long length = f.length();
+ if (length > newVmSize) {
+ newVmSize = length;
+ }
+ }
+ }
+
+ if (DEBUG) {
+ Log.v(LOGTAG, "Based on library size, need " + newVmSize +
+ " bytes of address space.");
+ }
+ // The required memory can be larger than the file on disk (due to .bss), and an
+ // upgraded version of the library will likely be larger, so always attempt to reserve
+ // twice as much as we think to allow for the library to grow during this boot cycle.
+ newVmSize = Math.max(2 * newVmSize, CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES);
+ Log.d(LOGTAG, "Setting new address space to " + newVmSize);
+ SystemProperties.set(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY,
+ Long.toString(newVmSize));
+ }
+ prepareWebViewInSystemServer(nativeLibs);
+ }
+
+ private static String[] getWebViewNativeLibraryPaths()
+ throws PackageManager.NameNotFoundException {
+ final String NATIVE_LIB_FILE_NAME = "libwebviewchromium.so";
+
+ PackageManager pm = AppGlobals.getInitialApplication().getPackageManager();
+ ApplicationInfo ai = pm.getApplicationInfo(getWebViewPackageName(), 0);
+
+ String path32;
+ String path64;
+ boolean primaryArchIs64bit = VMRuntime.is64BitAbi(ai.primaryCpuAbi);
+ if (!TextUtils.isEmpty(ai.secondaryCpuAbi)) {
+ // Multi-arch case.
+ if (primaryArchIs64bit) {
+ // Primary arch: 64-bit, secondary: 32-bit.
+ path64 = ai.nativeLibraryDir;
+ path32 = ai.secondaryNativeLibraryDir;
+ } else {
+ // Primary arch: 32-bit, secondary: 64-bit.
+ path64 = ai.secondaryNativeLibraryDir;
+ path32 = ai.nativeLibraryDir;
+ }
+ } else if (primaryArchIs64bit) {
+ // Single-arch 64-bit.
+ path64 = ai.nativeLibraryDir;
+ path32 = "";
+ } else {
+ // Single-arch 32-bit.
+ path32 = ai.nativeLibraryDir;
+ path64 = "";
}
+ if (!TextUtils.isEmpty(path32)) path32 += "/" + NATIVE_LIB_FILE_NAME;
+ if (!TextUtils.isEmpty(path64)) path64 += "/" + NATIVE_LIB_FILE_NAME;
+ return new String[] { path32, path64 };
}
- private static void createRelroFile(String abi) {
+ private static void createRelroFile(final boolean is64Bit, String[] nativeLibraryPaths) {
+ final String abi =
+ is64Bit ? Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0];
+
+ // crashHandler is invoked by the ActivityManagerService when the isolated process crashes.
+ Runnable crashHandler = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Log.e(LOGTAG, "relro file creator for " + abi + " crashed. Proceeding without");
+ getUpdateService().notifyRelroCreationCompleted(is64Bit, false);
+ } catch (RemoteException e) {
+ Log.e(LOGTAG, "Cannot reach WebViewUpdateService. " + e.getMessage());
+ }
+ }
+ };
+
try {
- Process.start("android.webkit.WebViewFactory$RelroFileCreator",
- "WebViewLoader-" + abi,
- Process.SHARED_RELRO_UID,
- Process.SHARED_RELRO_UID,
- null,
- 0, // TODO(torne): do we need to set debug flags?
- Zygote.MOUNT_EXTERNAL_NONE,
- Build.VERSION.SDK_INT,
- null,
- abi,
- null);
- } catch (Throwable e) {
+ if (nativeLibraryPaths == null
+ || nativeLibraryPaths[0] == null || nativeLibraryPaths[1] == null) {
+ throw new IllegalArgumentException(
+ "Native library paths to the WebView RelRo process must not be null!");
+ }
+ int pid = LocalServices.getService(ActivityManagerInternal.class).startIsolatedProcess(
+ RelroFileCreator.class.getName(), nativeLibraryPaths, "WebViewLoader-" + abi, abi,
+ Process.SHARED_RELRO_UID, crashHandler);
+ if (pid <= 0) throw new Exception("Failed to start the relro file creator process");
+ } catch (Throwable t) {
// Log and discard errors as we must not crash the system server.
- Log.e(LOGTAG, "error starting relro file creator for abi " + abi, e);
+ Log.e(LOGTAG, "error starting relro file creator for abi " + abi, t);
+ crashHandler.run();
}
}
private static class RelroFileCreator {
// Called in an unprivileged child process to create the relro file.
public static void main(String[] args) {
- if (!sAddressSpaceReserved) {
- Log.e(LOGTAG, "can't create relro file; address space not reserved");
- return;
- }
- boolean result = nativeCreateRelroFile(CHROMIUM_WEBVIEW_NATIVE_LIB_32,
- CHROMIUM_WEBVIEW_NATIVE_LIB_64,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
- if (!result) {
- Log.e(LOGTAG, "failed to create relro file");
- } else if (DEBUG) {
- Log.v(LOGTAG, "created relro file");
- }
- try {
- getUpdateService().notifyRelroCreationCompleted(VMRuntime.getRuntime().is64Bit(),
- result);
- } catch (RemoteException e) {
- Log.e(LOGTAG, "error notifying update service", e);
- }
+ boolean result = false;
+ boolean is64Bit = VMRuntime.getRuntime().is64Bit();
+ try{
+ if (args.length != 2 || args[0] == null || args[1] == null) {
+ Log.e(LOGTAG, "Invalid RelroFileCreator args: " + Arrays.toString(args));
+ return;
+ }
+ Log.v(LOGTAG, "RelroFileCreator (64bit = " + is64Bit + "), " +
+ " 32-bit lib: " + args[0] + ", 64-bit lib: " + args[1]);
+ if (!sAddressSpaceReserved) {
+ Log.e(LOGTAG, "can't create relro file; address space not reserved");
+ return;
+ }
+ result = nativeCreateRelroFile(args[0] /* path32 */,
+ args[1] /* path64 */,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
+ if (result && DEBUG) Log.v(LOGTAG, "created relro file");
+ } finally {
+ // We must do our best to always notify the update service, even if something fails.
+ try {
+ getUpdateService().notifyRelroCreationCompleted(is64Bit, result);
+ } catch (RemoteException e) {
+ Log.e(LOGTAG, "error notifying update service", e);
+ }
+
+ if (!result) Log.e(LOGTAG, "failed to create relro file");
- // Must explicitly exit or else this process will just sit around after we return.
- System.exit(0);
+ // Must explicitly exit or else this process will just sit around after we return.
+ System.exit(0);
+ }
}
}
@@ -203,14 +337,19 @@ public final class WebViewFactory {
return;
}
- boolean result = nativeLoadWithRelroFile(CHROMIUM_WEBVIEW_NATIVE_LIB_32,
- CHROMIUM_WEBVIEW_NATIVE_LIB_64,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
- if (!result) {
- Log.w(LOGTAG, "failed to load with relro file, proceeding without");
- } else if (DEBUG) {
- Log.v(LOGTAG, "loaded with relro file");
+ try {
+ String[] args = getWebViewNativeLibraryPaths();
+ boolean result = nativeLoadWithRelroFile(args[0] /* path32 */,
+ args[1] /* path64 */,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
+ if (!result) {
+ Log.w(LOGTAG, "failed to load with relro file, proceeding without");
+ } else if (DEBUG) {
+ Log.v(LOGTAG, "loaded with relro file");
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(LOGTAG, "Failed to list WebView package libraries for loadNativeLibrary", e);
}
}
@@ -218,7 +357,7 @@ public final class WebViewFactory {
return IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
}
- private static native boolean nativeReserveAddressSpace(String lib32, String lib64);
+ private static native boolean nativeReserveAddressSpace(long addressSpaceToReserve);
private static native boolean nativeCreateRelroFile(String lib32, String lib64,
String relro32, String relro64);
private static native boolean nativeLoadWithRelroFile(String lib32, String lib64,
diff --git a/core/java/com/android/internal/util/XmlUtils.java b/core/java/com/android/internal/util/XmlUtils.java
index dca9921..7db70ba 100644
--- a/core/java/com/android/internal/util/XmlUtils.java
+++ b/core/java/com/android/internal/util/XmlUtils.java
@@ -16,12 +16,18 @@
package com.android.internal.util;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap.CompressFormat;
+import android.net.Uri;
+import android.util.Base64;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -1415,6 +1421,20 @@ public class XmlUtils {
out.attribute(null, name, Long.toString(value));
}
+ public static float readFloatAttribute(XmlPullParser in, String name) throws IOException {
+ final String value = in.getAttributeValue(null, name);
+ try {
+ return Float.parseFloat(value);
+ } catch (NumberFormatException e) {
+ throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
+ }
+ }
+
+ public static void writeFloatAttribute(XmlSerializer out, String name, float value)
+ throws IOException {
+ out.attribute(null, name, Float.toString(value));
+ }
+
public static boolean readBooleanAttribute(XmlPullParser in, String name) {
final String value = in.getAttributeValue(null, name);
return Boolean.parseBoolean(value);
@@ -1425,6 +1445,63 @@ public class XmlUtils {
out.attribute(null, name, Boolean.toString(value));
}
+ public static Uri readUriAttribute(XmlPullParser in, String name) {
+ final String value = in.getAttributeValue(null, name);
+ return (value != null) ? Uri.parse(value) : null;
+ }
+
+ public static void writeUriAttribute(XmlSerializer out, String name, Uri value)
+ throws IOException {
+ if (value != null) {
+ out.attribute(null, name, value.toString());
+ }
+ }
+
+ public static String readStringAttribute(XmlPullParser in, String name) {
+ return in.getAttributeValue(null, name);
+ }
+
+ public static void writeStringAttribute(XmlSerializer out, String name, String value)
+ throws IOException {
+ if (value != null) {
+ out.attribute(null, name, value);
+ }
+ }
+
+ public static byte[] readByteArrayAttribute(XmlPullParser in, String name) {
+ final String value = in.getAttributeValue(null, name);
+ if (value != null) {
+ return Base64.decode(value, Base64.DEFAULT);
+ } else {
+ return null;
+ }
+ }
+
+ public static void writeByteArrayAttribute(XmlSerializer out, String name, byte[] value)
+ throws IOException {
+ if (value != null) {
+ out.attribute(null, name, Base64.encodeToString(value, Base64.DEFAULT));
+ }
+ }
+
+ public static Bitmap readBitmapAttribute(XmlPullParser in, String name) {
+ final byte[] value = readByteArrayAttribute(in, name);
+ if (value != null) {
+ return BitmapFactory.decodeByteArray(value, 0, value.length);
+ } else {
+ return null;
+ }
+ }
+
+ public static void writeBitmapAttribute(XmlSerializer out, String name, Bitmap value)
+ throws IOException {
+ if (value != null) {
+ final ByteArrayOutputStream os = new ByteArrayOutputStream();
+ value.compress(CompressFormat.PNG, 90, os);
+ writeByteArrayAttribute(out, name, os.toByteArray());
+ }
+ }
+
/** @hide */
public interface WriteMapCallback {
/**
diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java
index 790b611..9e24844 100644
--- a/core/java/com/android/internal/widget/ActionBarContainer.java
+++ b/core/java/com/android/internal/widget/ActionBarContainer.java
@@ -16,10 +16,12 @@
package com.android.internal.widget;
+import android.annotation.NonNull;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
+import android.graphics.Outline;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.ActionMode;
@@ -324,18 +326,36 @@ public class ActionBarContainer extends FrameLayout {
* projection surfaces.
*/
private class ActionBarBackgroundDrawable extends Drawable {
- @Override
- public void draw(Canvas canvas) {
+ private Drawable getDrawable() {
if (mIsSplit) {
- if (mSplitBackground != null) mSplitBackground.draw(canvas);
+ if (mSplitBackground != null) {
+ return mSplitBackground;
+ }
} else {
if (mBackground != null) {
- mBackground.draw(canvas);
+ return mBackground;
}
if (mStackedBackground != null && mIsStacked) {
- mStackedBackground.draw(canvas);
+ return mStackedBackground;
}
}
+ return null;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ final Drawable drawable = getDrawable();
+ if (drawable != null) {
+ drawable.draw(canvas);
+ }
+ }
+
+ @Override
+ public void getOutline(@NonNull Outline outline) {
+ final Drawable drawable = getDrawable();
+ if (drawable != null) {
+ drawable.getOutline(outline);
+ }
}
@Override
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index a890eb4..2ce1b15 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -353,7 +353,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding
ninePatchInsets = env->NewObject(gInsetStruct_class, gInsetStruct_constructorMethodID,
peeker.mOpticalInsets[0], peeker.mOpticalInsets[1], peeker.mOpticalInsets[2], peeker.mOpticalInsets[3],
peeker.mOutlineInsets[0], peeker.mOutlineInsets[1], peeker.mOutlineInsets[2], peeker.mOutlineInsets[3],
- peeker.mOutlineRadius, peeker.mOutlineFilled, scale);
+ peeker.mOutlineRadius, peeker.mOutlineAlpha, scale);
if (javaBitmap != NULL) {
env->SetObjectField(javaBitmap, gBitmap_ninePatchInsetsFieldID, ninePatchInsets);
}
@@ -589,7 +589,7 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) {
"Landroid/graphics/NinePatch$InsetStruct;");
gInsetStruct_class = (jclass) env->NewGlobalRef(env->FindClass("android/graphics/NinePatch$InsetStruct"));
- gInsetStruct_constructorMethodID = env->GetMethodID(gInsetStruct_class, "<init>", "(IIIIIIIIFZF)V");
+ gInsetStruct_constructorMethodID = env->GetMethodID(gInsetStruct_class, "<init>", "(IIIIIIIIFIF)V");
int ret = AndroidRuntime::registerNativeMethods(env,
"android/graphics/BitmapFactory$Options",
diff --git a/core/jni/android/graphics/NinePatchPeeker.cpp b/core/jni/android/graphics/NinePatchPeeker.cpp
index ea5193b..1dafa1b 100644
--- a/core/jni/android/graphics/NinePatchPeeker.cpp
+++ b/core/jni/android/graphics/NinePatchPeeker.cpp
@@ -48,11 +48,11 @@ bool NinePatchPeeker::peek(const char tag[], const void* data, size_t length) {
} else if (!strcmp("npLb", tag) && length == sizeof(int32_t) * 4) {
mHasInsets = true;
memcpy(&mOpticalInsets, data, sizeof(int32_t) * 4);
- } else if (!strcmp("npOl", tag) && length == 24) { // 4 int32_ts, 1 float, 1 int32_t sized bool
+ } else if (!strcmp("npOl", tag) && length == 24) { // 4 int32_ts, 1 float, 1 int32_t sized byte
mHasInsets = true;
memcpy(&mOutlineInsets, data, sizeof(int32_t) * 4);
mOutlineRadius = ((const float*)data)[4];
- mOutlineFilled = ((const int32_t*)data)[5] & 0x01;
+ mOutlineAlpha = ((const int32_t*)data)[5] & 0xff;
}
return true; // keep on decoding
}
diff --git a/core/jni/android/graphics/NinePatchPeeker.h b/core/jni/android/graphics/NinePatchPeeker.h
index 8d3e6cf..7c18b2d 100644
--- a/core/jni/android/graphics/NinePatchPeeker.h
+++ b/core/jni/android/graphics/NinePatchPeeker.h
@@ -33,7 +33,7 @@ public:
, mPatchSize(0)
, mHasInsets(false)
, mOutlineRadius(0)
- , mOutlineFilled(false) {
+ , mOutlineAlpha(0) {
memset(mOpticalInsets, 0, 4 * sizeof(int32_t));
memset(mOutlineInsets, 0, 4 * sizeof(int32_t));
}
@@ -50,7 +50,7 @@ public:
int32_t mOpticalInsets[4];
int32_t mOutlineInsets[4];
float mOutlineRadius;
- bool mOutlineFilled;
+ uint8_t mOutlineAlpha;
};
#endif // NinePatchPeeker_h
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index ff54fb9..1e9d722 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -140,18 +140,19 @@ static jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env,
static jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
jobject clazz, jlong renderNodePtr, jint left, jint top,
- jint right, jint bottom, jfloat radius) {
+ jint right, jint bottom, jfloat radius, jfloat alpha) {
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
- renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, radius);
+ renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom,
+ radius, alpha);
renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
return true;
}
static jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
- jobject clazz, jlong renderNodePtr, jlong outlinePathPtr) {
+ jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) {
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
- renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath);
+ renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha);
renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
return true;
}
@@ -480,8 +481,8 @@ static JNINativeMethod gMethods[] = {
{ "nSetProjectBackwards", "(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards },
{ "nSetProjectionReceiver","(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver },
- { "nSetOutlineRoundRect", "(JIIIIF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
- { "nSetOutlineConvexPath", "(JJ)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
+ { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
+ { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
{ "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
{ "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone },
{ "nSetClipToOutline", "(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
diff --git a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index 8148ab8..0000000
--- a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png
deleted file mode 100644
index 7d4df50..0000000
--- a/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-ldpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index 1ff50ea..0000000
--- a/core/res/res/drawable-ldpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_sys_tether_wifi.png b/core/res/res/drawable-ldpi/stat_sys_tether_wifi.png
deleted file mode 100644
index b4b3cfd..0000000
--- a/core/res/res/drawable-ldpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index b7e2a6a..0000000
--- a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png
deleted file mode 100644
index 869ad35..0000000
--- a/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index 0dbae57..0000000
--- a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-xhdpi/stat_sys_tether_wifi.png
deleted file mode 100644
index dc48646..0000000
--- a/core/res/res/drawable-xhdpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index 47e74fb..0000000
--- a/core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.png
deleted file mode 100644
index da44e6a..0000000
--- a/core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/stat_notify_wifi_in_range.xml b/core/res/res/drawable/stat_notify_wifi_in_range.xml
new file mode 100644
index 0000000..9a5407d
--- /dev/null
+++ b/core/res/res/drawable/stat_notify_wifi_in_range.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="26.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.100000,14.000000l-3.400000,0.000000l0.000000,-1.500000c0.000000,-1.800000 0.800000,-2.800000 1.500000,-3.400000C18.100000,8.300000 19.200001,8.000000 20.600000,8.000000c1.200000,0.000000 2.300000,0.300000 3.100000,0.800000l1.900000,-2.300000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.500000,-8.100000L19.100000,14.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.500000,17.799999c0.000000,-0.800000 0.100000,-1.300000 0.200000,-1.600000c0.200000,-0.300000 0.500000,-0.700000 1.100000,-1.200000c0.400000,-0.400000 0.700000,-0.800000 1.000000,-1.100000s0.400000,-0.800000 0.400000,-1.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.400000,-1.200000c-0.300000,-0.300000 -0.700000,-0.400000 -1.200000,-0.400000c-0.400000,0.000000 -0.800000,0.100000 -1.100000,0.300000c-0.300000,0.200000 -0.400000,0.600000 -0.400000,1.100000l-1.900000,0.000000c0.000000,-1.000000 0.300000,-1.700000 1.000000,-2.200000c0.600000,-0.500000 1.500000,-0.800000 2.500000,-0.800000c1.100000,0.000000 2.000000,0.300000 2.600000,0.800000c0.600000,0.500000 0.900000,1.300000 0.900000,2.300000c0.000000,0.700000 -0.200000,1.300000 -0.600000,1.800000c-0.400000,0.600000 -0.900000,1.100000 -1.500000,1.600000c-0.300000,0.300000 -0.500000,0.500000 -0.600000,0.700000c-0.100000,0.200000 -0.100000,0.600000 -0.100000,1.000000L19.500000,17.700001zM21.400000,21.000000l-1.900000,0.000000l0.000000,-1.800000l1.900000,0.000000L21.400000,21.000000z"/>
+</vector>
diff --git a/core/res/res/drawable/stat_sys_tether_wifi.xml b/core/res/res/drawable/stat_sys_tether_wifi.xml
new file mode 100644
index 0000000..a816db8
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_tether_wifi.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="26.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 5cb3068..a31f18f 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -464,24 +464,48 @@
<attr name="windowEnterTransition" format="reference"/>
<!-- Reference to a Transition XML resource defining the desired Transition
+ used to move Views out of the scene when the Window is
+ preparing to close. Corresponds to
+ {@link android.view.Window#setReturnTransition(android.transition.Transition)}. -->
+ <attr name="windowReturnTransition" format="reference"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move Views out of the Window's content Scene when launching a new Activity.
Corresponds to
{@link android.view.Window#setExitTransition(android.transition.Transition)}. -->
<attr name="windowExitTransition" format="reference"/>
<!-- Reference to a Transition XML resource defining the desired Transition
+ used to move Views in to the scene when returning from a previously-started Activity.
+ Corresponds to
+ {@link android.view.Window#setReenterTransition(android.transition.Transition)}. -->
+ <attr name="windowReenterTransition" format="reference"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move shared elements transferred into the Window's initial content Scene.
Corresponds to {@link android.view.Window#setSharedElementEnterTransition(
android.transition.Transition)}. -->
<attr name="windowSharedElementEnterTransition" format="reference"/>
<!-- Reference to a Transition XML resource defining the desired Transition
+ used to move shared elements transferred back to a calling Activity.
+ Corresponds to {@link android.view.Window#setSharedElementReturnTransition(
+ android.transition.Transition)}. -->
+ <attr name="windowSharedElementReturnTransition" format="reference"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used when starting a new Activity to move shared elements prior to transferring
to the called Activity.
Corresponds to {@link android.view.Window#setSharedElementExitTransition(
android.transition.Transition)}. -->
<attr name="windowSharedElementExitTransition" format="reference"/>
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used for shared elements transferred back to a calling Activity.
+ Corresponds to {@link android.view.Window#setSharedElementReenterTransition(
+ android.transition.Transition)}. -->
+ <attr name="windowSharedElementReenterTransition" format="reference"/>
+
<!-- Flag indicating whether this Window's transition should overlap with
the exiting transition of the calling Activity. Corresponds to
{@link android.view.Window#setAllowEnterTransitionOverlap(boolean)}. -->
@@ -1751,30 +1775,54 @@
or a fraction of the screen size in that dimension. -->
<attr name="windowFixedHeightMajor" format="dimension|fraction" />
<attr name="windowOutsetBottom" format="dimension" />
- <!-- Reference to a TransitionManager XML resource defining the desired Transition
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move Views into the initial Window's content Scene. Corresponds to
{@link android.view.Window#setEnterTransition(android.transition.Transition)}. -->
<attr name="windowEnterTransition"/>
- <!-- Reference to a TransitionManager XML resource defining the desired Transition
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used to move Views out of the scene when the Window is
+ preparing to close. Corresponds to
+ {@link android.view.Window#setReturnTransition(android.transition.Transition)}. -->
+ <attr name="windowReturnTransition"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move Views out of the Window's content Scene when launching a new Activity.
Corresponds to
{@link android.view.Window#setExitTransition(android.transition.Transition)}. -->
<attr name="windowExitTransition"/>
- <!-- Reference to a TransitionManager XML resource defining the desired Transition
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used to move Views in to the scene when returning from a previously-started Activity.
+ Corresponds to
+ {@link android.view.Window#setReenterTransition(android.transition.Transition)}. -->
+ <attr name="windowReenterTransition"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move shared elements transferred into the Window's initial content Scene.
Corresponds to {@link android.view.Window#setSharedElementEnterTransition(
android.transition.Transition)}. -->
<attr name="windowSharedElementEnterTransition"/>
- <!-- Reference to a TransitionManager XML resource defining the desired Transition
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used to move shared elements transferred back to a calling Activity.
+ Corresponds to {@link android.view.Window#setSharedElementReturnTransition(
+ android.transition.Transition)}. -->
+ <attr name="windowSharedElementReturnTransition"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used when starting a new Activity to move shared elements prior to transferring
to the called Activity.
Corresponds to {@link android.view.Window#setSharedElementExitTransition(
android.transition.Transition)}. -->
<attr name="windowSharedElementExitTransition"/>
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used for shared elements transferred back to a calling Activity.
+ Corresponds to {@link android.view.Window#setSharedElementReenterTransition(
+ android.transition.Transition)}. -->
+ <attr name="windowSharedElementReenterTransition"/>
+
<!-- Flag indicating whether this Window's transition should overlap with
the exiting transition of the calling Activity. Corresponds to
@@ -7211,7 +7259,9 @@
<!-- Component name of an activity that allows the user to modify
the settings for this service. -->
<attr name="settingsActivity" />
- <!-- Type of this service. -->
+ <!-- Component name of an xml file that describes the structure of TV content ratings that
+ this service uses. -->
+ <attr name="contentRatingSystemXml" format="reference" />
</declare-styleable>
<declare-styleable name="ResolverDrawerLayout">
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 217658c..b9e5c66 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1661,4 +1661,8 @@
<!--Support decoding the user data payload as pack GSM 8-bit (a GSM alphabet
string that's stored in 8-bit unpacked format) characters.-->
<bool translatable="false" name="config_sms_decode_gsm_8bit_data">false</bool>
+
+ <!-- Package name providing WebView implementation. -->
+ <string name="config_webViewPackageName" translatable="false">com.android.webview</string>
+
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 0cb14e3..08398f0 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2265,6 +2265,10 @@
<public type="attr" name="windowClipToOutline" />
<public type="attr" name="datePickerDialogTheme" />
<public type="attr" name="showText" />
+ <public type="attr" name="windowReturnTransition" />
+ <public type="attr" name="windowReenterTransition" />
+ <public type="attr" name="windowSharedElementReturnTransition" />
+ <public type="attr" name="windowSharedElementReenterTransition" />
<public-padding type="dimen" name="l_resource_pad" end="0x01050010" />
@@ -2556,4 +2560,6 @@
<public type="raw" name="loaderror" id="0x01100000"/>
<!-- WebView error page for when domain lookup fails. @hide @SystemApi -->
<public type="raw" name="nodomain"/>
+
+ <public type="attr" name="contentRatingSystemXml"/>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 11c41e3..195851f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3754,10 +3754,10 @@
<!-- DO NOT TRANSLATE -->
<string name="locale_replacement">""</string>
- <!-- Title of the pop-up dialog in which the user switches input method components. -->
- <string name="select_input_method">Choose input method</string>
- <!-- Title of a button to open the settings for input methods [CHAR LIMIT=30] -->
- <string name="configure_input_methods">Set up input methods</string>
+ <!-- Title of the pop-up dialog in which the user switches keyboard, also known as input method. -->
+ <string name="select_input_method">Change keyboard</string>
+ <!-- Title of a button to open the settings to enable or disable keyboards, also known as input methods [CHAR LIMIT=30] -->
+ <string name="configure_input_methods">Choose keyboards</string>
<!-- Summary text of a toggle switch to enable/disable use of the physical keyboard in the input method selector [CHAR LIMIT=25] -->
<string name="use_physical_keyboard">Physical keyboard</string>
<!-- Title of the physical keyboard category in the input method selector [CHAR LIMIT=10] -->
@@ -4841,4 +4841,41 @@
<!-- Lock-to-app unlock password string -->
<string name="lock_to_app_unlock_password">password</string>
+ <string name="display_name_ustvpg" translatable="false">US-TV</string>
+ <string name="description_ustvpg">The TV Parental Guidelines</string>
+ <string name="display_name_krtv" translatable="false">KR-TV</string>
+
+ <string name="display_name_ustvpg_d" translatable="false">D</string>
+ <string name="display_name_ustvpg_l" translatable="false">L</string>
+ <string name="display_name_ustvpg_s" translatable="false">S</string>
+ <string name="display_name_ustvpg_v" translatable="false">V</string>
+ <string name="display_name_ustvpg_fv" translatable="false">FV</string>
+ <string name="display_name_ustvpg_y" translatable="false">TV-Y</string>
+ <string name="display_name_ustvpg_y7" translatable="false">TV-Y7</string>
+ <string name="display_name_ustvpg_g" translatable="false">TV-G</string>
+ <string name="display_name_ustvpg_pg" translatable="false">TV-PG</string>
+ <string name="display_name_ustvpg_14" translatable="false">TV-14</string>
+ <string name="display_name_ustvpg_ma" translatable="false">TV-MA</string>
+ <string name="display_name_krtv_all" translatable="false">모든연령시청가</string>
+ <string name="display_name_krtv_7" translatable="false">7세이상시청가</string>
+ <string name="display_name_krtv_12" translatable="false">12세이상시청가</string>
+ <string name="display_name_krtv_15" translatable="false">15세이상시청가</string>
+ <string name="display_name_krtv_19" translatable="false">19세이상시청가</string>
+
+ <string name="description_ustvpg_d">Suggestive dialogue (Usually means talks about sex)</string>
+ <string name="description_ustvpg_l">Coarse language</string>
+ <string name="description_ustvpg_s">Sexual content</string>
+ <string name="description_ustvpg_v">Violence</string>
+ <string name="description_ustvpg_fv">Fantasy violence (Children\'s programming only)</string>
+ <string name="description_ustvpg_y">This program is designed to be appropriate for all children.</string>
+ <string name="description_ustvpg_y7">This program is designed for children age 7 and above.</string>
+ <string name="description_ustvpg_g">Most parents would find this program suitable for all ages.</string>
+ <string name="description_ustvpg_pg">This program contains material that parents may find unsuitable for younger children.</string>
+ <string name="description_ustvpg_14">This program contains some material that many parents would find unsuitable for children under 14 years of age.</string>
+ <string name="description_ustvpg_ma">This program is specifically designed to be viewed by adults and therefore may be unsuitable for children under 17.</string>
+ <string name="description_krtv_all">모든 연령의 시청자가 시청하기에 부적절한 내용이 없는 등급을 말한다.</string>
+ <string name="description_krtv_7">7세미만의 어린이가 시청하기에 부적절한 내용이 포함되어 있어 보호자의 시청지도가 필요한 등급을 말한다.</string>
+ <string name="description_krtv_12">12세미만의 청소년이 시청하기에 부적절한 내용이 포함되어 있어 보호자의 시청지도가 필요한 등급을 말한다.</string>
+ <string name="description_krtv_15">15세미만의 청소년이 시청하기에 부적절한 내용이 포함되어 있어 보호자의 시청지도가 필요한 등급을 말한다.</string>
+ <string name="description_krtv_19">19세미만의 청소년이 시청하기에 부적절한 내용이 포함되어 있어 청소년이 시청할 수 없는 등급을 말한다.</string>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 6e23557..ccd7005 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1259,6 +1259,7 @@
<java-symbol type="xml" name="audio_assets" />
<java-symbol type="xml" name="global_keys" />
<java-symbol type="xml" name="default_zen_mode_config" />
+ <java-symbol type="xml" name="tv_content_rating_systems" />
<java-symbol type="raw" name="accessibility_gestures" />
<java-symbol type="raw" name="incognito_mode_start_page" />
@@ -1838,6 +1839,7 @@
<java-symbol type="attr" name="actionModeWebSearchDrawable" />
<java-symbol type="string" name="websearch" />
<java-symbol type="drawable" name="ic_media_video_poster" />
+ <java-symbol type="string" name="config_webViewPackageName" />
<!-- From SubtitleView -->
<java-symbol type="dimen" name="subtitle_corner_radius" />
diff --git a/core/res/res/xml/tv_content_rating_systems.xml b/core/res/res/xml/tv_content_rating_systems.xml
new file mode 100644
index 0000000..238ce13
--- /dev/null
+++ b/core/res/res/xml/tv_content_rating_systems.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2014, 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.
+*/
+-->
+<rating-system-definitions>
+ <rating-system-definition id="US_TVPG"
+ displayName="@string/display_name_ustvpg"
+ description="@string/description_ustvpg"
+ country="US">
+ <sub-rating-definition id="US_TVPG_D"
+ displayName="@string/display_name_ustvpg_d"
+ description="@string/description_ustvpg_d" />
+ <sub-rating-definition id="US_TVPG_L"
+ displayName="@string/display_name_ustvpg_l"
+ description="@string/description_ustvpg_l" />
+ <sub-rating-definition id="US_TVPG_S"
+ displayName="@string/display_name_ustvpg_s"
+ description="@string/description_ustvpg_s" />
+ <sub-rating-definition id="US_TVPG_V"
+ displayName="@string/display_name_ustvpg_v"
+ description="@string/description_ustvpg_v" />
+ <sub-rating-definition id="US_TVPG_FV"
+ displayName="@string/display_name_ustvpg_fv"
+ description="@string/description_ustvpg_fv" />
+
+ <rating-definition id="US_TVPG_TV_Y"
+ displayName="@string/display_name_ustvpg_y"
+ description="@string/description_ustvpg_y"
+ ageHint="0" />
+ <rating-definition id="US_TVPG_TV_Y7"
+ displayName="@string/display_name_ustvpg_y7"
+ description="@string/description_ustvpg_y7"
+ ageHint="7">
+ <sub-rating id="US_TVPG_FV" />
+ </rating-definition>
+ <rating-definition id="US_TVPG_TV_G"
+ displayName="@string/display_name_ustvpg_g"
+ description="@string/description_ustvpg_g"
+ ageHint="0" />
+ <rating-definition id="US_TVPG_TV_PG"
+ displayName="@string/display_name_ustvpg_pg"
+ description="@string/description_ustvpg_pg"
+ ageHint="14">
+ <sub-rating id="US_TVPG_D" />
+ <sub-rating id="US_TVPG_L" />
+ <sub-rating id="US_TVPG_S" />
+ <sub-rating id="US_TVPG_V" />
+ </rating-definition>
+ <rating-definition id="US_TVPG_TV_14"
+ displayName="@string/display_name_ustvpg_14"
+ description="@string/description_ustvpg_14"
+ ageHint="14">
+ <sub-rating id="US_TVPG_D" />
+ <sub-rating id="US_TVPG_L" />
+ <sub-rating id="US_TVPG_S" />
+ <sub-rating id="US_TVPG_V" />
+ </rating-definition>
+ <rating-definition id="US_TVPG_TV_MA"
+ displayName="@string/display_name_ustvpg_ma"
+ description="@string/description_ustvpg_ma"
+ ageHint="17">
+ <sub-rating id="US_TVPG_L" />
+ <sub-rating id="US_TVPG_S" />
+ <sub-rating id="US_TVPG_V" />
+ </rating-definition>
+ <order>
+ <rating id="US_TVPG_Y" />
+ <rating id="US_TVPG_Y7" />
+ </order>
+ <order>
+ <rating id="US_TVPG_TV_G" />
+ <rating id="US_TVPG_TV_PG" />
+ <rating id="US_TVPG_TV_14" />
+ <rating id="US_TVPG_TV_MA" />
+ </order>
+ </rating-system-definition>
+
+ <rating-system-definition id="KR_TV"
+ displayName="@string/display_name_krtv"
+ country="KR">
+ <rating-definition id="KR_TV_ALL"
+ displayName="@string/display_name_krtv_all"
+ description="@string/description_krtv_all"
+ ageHint="0" />
+ <rating-definition id="KR_TV_7"
+ displayName="@string/display_name_krtv_7"
+ description="@string/description_krtv_7"
+ ageHint="7">
+ </rating-definition>
+ <rating-definition id="KR_TV_12"
+ displayName="@string/display_name_krtv_12"
+ description="@string/description_krtv_12"
+ ageHint="12">
+ </rating-definition>
+ <rating-definition id="KR_TV_15"
+ displayName="@string/display_name_krtv_15"
+ description="@string/description_krtv_15"
+ ageHint="15">
+ </rating-definition>
+ <rating-definition id="KR_TV_19"
+ displayName="@string/display_name_krtv_19"
+ description="@string/description_krtv_19"
+ ageHint="19">
+ </rating-definition>
+ <order>
+ <rating id="KR_TV_ALL" />
+ <rating id="KR_TV_7" />
+ <rating id="KR_TV_12" />
+ <rating id="KR_TV_15" />
+ <rating id="KR_TV_19" />
+ </order>
+ </rating-system-definition>
+</rating-system-definitions>
diff --git a/docs/html/preview/preview_toc.cs b/docs/html/preview/preview_toc.cs
index a505905..819976e 100644
--- a/docs/html/preview/preview_toc.cs
+++ b/docs/html/preview/preview_toc.cs
@@ -68,6 +68,8 @@
Recommendations</a></li>
</ul>
</li>
+ <li><a href="<?cs var:toroot ?>preview/tv/tif/index.html">
+ TV Input Framework</a></li>
<li><a href="<?cs var:toroot ?>preview/tv/games/index.html">
Games on TV</a></li>
<li><a href="<?cs var:toroot ?>preview/tv/start/hardware-features.html">
diff --git a/docs/html/preview/tv/images/tif-overview.png b/docs/html/preview/tv/images/tif-overview.png
new file mode 100644
index 0000000..197775e
--- /dev/null
+++ b/docs/html/preview/tv/images/tif-overview.png
Binary files differ
diff --git a/docs/html/preview/tv/tif/index.jd b/docs/html/preview/tv/tif/index.jd
new file mode 100644
index 0000000..ef02def
--- /dev/null
+++ b/docs/html/preview/tv/tif/index.jd
@@ -0,0 +1,38 @@
+page.title=TV Input Framework
+page.tags=tif
+
+@jd:body
+
+<p>
+ Watching live television shows and other continuous, channel-based content is a big part of the
+ TV experience. Android supports receiving and playback of live video content through the TV Input
+ Framework. This framework provides a unified method for receiving audio and video channel content
+ from hardware sources, such as HDMI ports and built-in-tuners, and software sources, such as
+ video streamed over the internet.
+</p>
+<p>
+ The framework enables developers to define live TV input sources by implementing a TV input
+ service. This service publishes a list of channels and programs to the TV Provider. The live TV
+ app on a TV device gets the list of available channels and programs from the TV Provider and
+ displays them to a user. When a user selects a specific channel, the live TV app creates a
+ session for the associated TV input service through the TV Input Manager, and tells the TV input
+ service to tune to the requested channel and play the content to a display surface provided by
+ the TV app.
+</p>
+
+<img src="{@docRoot}preview/tv/images/tif-overview.png" id="figure1">
+<p class="img-caption">
+ <strong>Figure 1.</strong> Functional diagram of the TV Input Framework
+</p>
+
+<p>
+ The TV Input Framework is designed to provide access to a wide variety of live TV input sources
+ and bring them together in a single user interface for users to browse, view, and enjoy content.
+ Building a TV input service for your content can help make it more accessible on TV devices.
+</p>
+
+<p>
+ The APIs for the TV Input Framework are available in the L Developer Preview and you can
+ review them in the preview API reference docs. However, more changes are planned, so stay tuned
+ for additional information with the official Android platform launch.
+</p>
diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java
index 335bce0..3bccf08 100644
--- a/graphics/java/android/graphics/NinePatch.java
+++ b/graphics/java/android/graphics/NinePatch.java
@@ -43,7 +43,7 @@ public class NinePatch {
@SuppressWarnings({"UnusedDeclaration"}) // called from JNI
InsetStruct(int opticalLeft, int opticalTop, int opticalRight, int opticalBottom,
int outlineLeft, int outlineTop, int outlineRight, int outlineBottom,
- float outlineRadius, boolean outlineFilled, float decodeScale) {
+ float outlineRadius, int outlineAlpha, float decodeScale) {
opticalRect = new Rect(opticalLeft, opticalTop, opticalRight, opticalBottom);
outlineRect = new Rect(outlineLeft, outlineTop, outlineRight, outlineBottom);
@@ -55,13 +55,13 @@ public class NinePatch {
outlineRect.scaleRoundIn(decodeScale);
}
this.outlineRadius = outlineRadius * decodeScale;
- this.outlineFilled = outlineFilled;
+ this.outlineAlpha = outlineAlpha / 255.0f;
}
public final Rect opticalRect;
public final Rect outlineRect;
public final float outlineRadius;
- public final boolean outlineFilled;
+ public final float outlineAlpha;
}
private final Bitmap mBitmap;
diff --git a/graphics/java/android/graphics/Outline.java b/graphics/java/android/graphics/Outline.java
index 3a4c2a7..1cf5f37 100644
--- a/graphics/java/android/graphics/Outline.java
+++ b/graphics/java/android/graphics/Outline.java
@@ -37,9 +37,8 @@ public final class Outline {
public Rect mRect;
/** @hide */
public float mRadius;
-
/** @hide */
- public boolean mIsFilled;
+ public float mAlpha;
/**
* Constructs an empty Outline. Call one of the setter methods to make
@@ -63,7 +62,6 @@ public final class Outline {
mPath = null;
mRect = null;
mRadius = 0;
- mIsFilled = true;
}
/**
@@ -92,24 +90,24 @@ public final class Outline {
}
/**
- * Sets whether the outline represents a fully opaque area.
+ * Sets the alpha represented by the Outline.
*
- * A filled outline is assumed, by the drawing system, to fully cover content beneath it,
- * meaning content beneath may be optimized away.
+ * Content producing a fully opaque (alpha = 1.0f) outline is assumed, by the drawing system,
+ * to fully cover content beneath it, meaning content beneath may be optimized away.
*
* @hide
*/
- public void setFilled(boolean isFilled) {
- mIsFilled = isFilled;
+ public void setAlpha(float alpha) {
+ mAlpha = alpha;
}
/**
- * Returns whether the outline represents a fully opaque area.
+ * Sets the alpha represented by the Outline.
*
* @hide
*/
- public boolean isFilled() {
- return !isEmpty() && mIsFilled;
+ public float getAlpha() {
+ return mAlpha;
}
/**
@@ -132,7 +130,7 @@ public final class Outline {
mRect.set(src.mRect);
}
mRadius = src.mRadius;
- mIsFilled = src.mIsFilled;
+ mAlpha = src.mAlpha;
}
/**
@@ -164,7 +162,6 @@ public final class Outline {
mRect.set(left, top, right, bottom);
mRadius = radius;
mPath = null;
- mIsFilled = true;
}
/**
@@ -193,7 +190,6 @@ public final class Outline {
mPath.reset();
mPath.addOval(left, top, right, bottom, Path.Direction.CW);
mRect = null;
- mIsFilled = true;
}
/**
@@ -220,6 +216,5 @@ public final class Outline {
mPath.set(convexPath);
mRect = null;
mRadius = -1.0f;
- mIsFilled = true;
}
}
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index acb34c2..df9f3c3 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -861,16 +861,14 @@ public abstract class Drawable {
* This method is called by the default {@link android.view.ViewOutlineProvider} to define
* the outline of the View.
* <p>
- * The default behavior defines the outline to be the bounding rectangle. Subclasses that wish
- * to convey a different shape must override this method.
- *
- * @return true if this drawable actually has an outline, else false. The outline must be
- * populated by the drawable if true is returned.
+ * The default behavior defines the outline to be the bounding rectangle of 0 alpha.
+ * Subclasses that wish to convey a different shape or alpha value must override this method.
*
* @see android.view.View#setOutlineProvider(android.view.ViewOutlineProvider)
*/
public void getOutline(@NonNull Outline outline) {
outline.setRect(getBounds());
+ outline.setAlpha(getAlpha() / 255.0f);
}
/**
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index 4815586..a383aab 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -1413,6 +1413,7 @@ public class GradientDrawable extends Drawable {
public void getOutline(Outline outline) {
final GradientState st = mGradientState;
final Rect bounds = getBounds();
+ outline.setAlpha(mAlpha / 255.0f);
switch (st.mShape) {
case RECTANGLE:
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index 073100a..d094ce4 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -595,12 +595,9 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
}
/**
- * Populates <code>outline</code> with the first available layer outline.
- * Returns <code>true</code> if an outline is available, <code>false</code>
- * otherwise.
+ * Populates <code>outline</code> with the first available (non-empty) layer outline.
*
* @param outline Outline in which to place the first available layer outline
- * @return <code>true</code> if an outline is available
*/
@Override
public void getOutline(@NonNull Outline outline) {
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index 6afce41..3397e94 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -296,7 +296,7 @@ public class NinePatchDrawable extends Drawable {
bounds.right - outlineInsets.right,
bounds.bottom - outlineInsets.bottom,
insets.outlineRadius);
- outline.setFilled(insets.outlineFilled);
+ outline.setAlpha(insets.outlineAlpha * (getAlpha() / 255.0f));
return;
}
}
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index eb7291c..cf675ed 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -585,11 +585,9 @@ public class RippleDrawable extends LayerDrawable {
/**
* Populates <code>outline</code> with the first available layer outline,
- * excluding the mask layer. Returns <code>true</code> if an outline is
- * available, <code>false</code> otherwise.
+ * excluding the mask layer.
*
* @param outline Outline in which to place the first available layer outline
- * @return <code>true</code> if an outline is available
*/
@Override
public void getOutline(@NonNull Outline outline) {
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index 2bed3b0..394f584 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -470,6 +470,7 @@ public class ShapeDrawable extends Drawable {
public void getOutline(Outline outline) {
if (mShapeState.mShape != null) {
mShapeState.mShape.getOutline(outline);
+ outline.setAlpha(getAlpha() / 255.0f);
}
}
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index f41b11a..be02c9b 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -364,13 +364,19 @@ public class VectorDrawable extends Drawable {
/** @hide */
public static VectorDrawable create(Resources resources, int rid) {
try {
- final XmlPullParser xpp = resources.getXml(rid);
- final AttributeSet attrs = Xml.asAttributeSet(xpp);
- final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- factory.setNamespaceAware(true);
+ final XmlPullParser parser = resources.getXml(rid);
+ final AttributeSet attrs = Xml.asAttributeSet(parser);
+ int type;
+ while ((type=parser.next()) != XmlPullParser.START_TAG &&
+ type != XmlPullParser.END_DOCUMENT) {
+ // Empty loop
+ }
+ if (type != XmlPullParser.START_TAG) {
+ throw new XmlPullParserException("No start tag found");
+ }
final VectorDrawable drawable = new VectorDrawable();
- drawable.inflate(resources, xpp, attrs);
+ drawable.inflate(resources, parser, attrs);
return drawable;
} catch (XmlPullParserException e) {
@@ -436,10 +442,10 @@ public class VectorDrawable extends Drawable {
if (pathRenderer.mViewportWidth <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
- "<viewport> tag requires viewportWidth > 0");
+ "<vector> tag requires viewportWidth > 0");
} else if (pathRenderer.mViewportHeight <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
- "<viewport> tag requires viewportHeight > 0");
+ "<vector> tag requires viewportHeight > 0");
}
pathRenderer.mBaseWidth = a.getDimension(
@@ -449,10 +455,10 @@ public class VectorDrawable extends Drawable {
if (pathRenderer.mBaseWidth <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
- "<size> tag requires width > 0");
+ "<vector> tag requires width > 0");
} else if (pathRenderer.mBaseHeight <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
- "<size> tag requires height > 0");
+ "<vector> tag requires height > 0");
}
}
diff --git a/libs/hwui/Outline.h b/libs/hwui/Outline.h
index 83426e8..6dacd5e 100644
--- a/libs/hwui/Outline.h
+++ b/libs/hwui/Outline.h
@@ -28,18 +28,20 @@ public:
Outline()
: mShouldClip(false)
, mType(kOutlineType_None)
- , mRadius(0) {}
+ , mRadius(0)
+ , mAlpha(0.0f) {}
- void setRoundRect(int left, int top, int right, int bottom, float radius) {
+ void setRoundRect(int left, int top, int right, int bottom, float radius, float alpha) {
mType = kOutlineType_RoundRect;
mBounds.set(left, top, right, bottom);
mRadius = radius;
mPath.reset();
mPath.addRoundRect(SkRect::MakeLTRB(left, top, right, bottom),
radius, radius);
+ mAlpha = alpha;
}
- void setConvexPath(const SkPath* outline) {
+ void setConvexPath(const SkPath* outline, float alpha) {
if (!outline) {
setEmpty();
return;
@@ -47,22 +49,29 @@ public:
mType = kOutlineType_ConvexPath;
mPath = *outline;
mBounds.set(outline->getBounds());
+ mAlpha = alpha;
}
void setEmpty() {
mType = kOutlineType_Empty;
mPath.reset();
+ mAlpha = 0.0f;
}
void setNone() {
mType = kOutlineType_None;
mPath.reset();
+ mAlpha = 0.0f;
}
bool isEmpty() const {
return mType == kOutlineType_Empty;
}
+ float getAlpha() const {
+ return mAlpha;
+ }
+
void setShouldClip(bool clip) {
mShouldClip = clip;
}
@@ -103,6 +112,7 @@ private:
OutlineType mType;
Rect mBounds;
float mRadius;
+ float mAlpha;
SkPath mPath;
};
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 0662ca2..fa1b21d 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -594,7 +594,12 @@ void RenderNode::buildZSortedChildList(Vector<ZDrawRenderNodeOpPair>& zTranslate
template <class T>
void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& handler) {
- if (properties().getAlpha() <= 0.0f || !properties().getOutline().getPath()) return;
+ if (properties().getAlpha() <= 0.0f
+ || properties().getOutline().getAlpha() <= 0.0f
+ || !properties().getOutline().getPath()) {
+ // no shadow to draw
+ return;
+ }
mat4 shadowMatrixXY(transformFromParent);
applyViewPropertyTransforms(shadowMatrixXY);
@@ -607,8 +612,9 @@ void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T&
const SkPath* revealClipPath = properties().getRevealClip().getPath();
if (revealClipPath && revealClipPath->isEmpty()) return;
+ float casterAlpha = properties().getAlpha() * properties().getOutline().getAlpha();
DisplayListOp* shadowOp = new (handler.allocator()) DrawShadowOp(
- shadowMatrixXY, shadowMatrixZ, properties().getAlpha(),
+ shadowMatrixXY, shadowMatrixZ, casterAlpha,
outlinePath, revealClipPath);
handler(shadowOp, PROPERTY_SAVECOUNT, properties().getClipToBounds());
}
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index 099cd3f..1225fd1 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -19,6 +19,7 @@ package android.media;
import android.annotation.IntDef;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -257,12 +258,7 @@ public final class AudioAttributes implements Parcelable {
aa.mSource = mSource;
aa.mFlags = mFlags;
aa.mTags = (HashSet<String>) mTags.clone();
- final Iterator<String> tagIterator = mTags.iterator();
- String allTagsInOne = new String();
- while (tagIterator.hasNext()) {
- allTagsInOne += tagIterator.next() + ";";
- }
- aa.mFormattedTags = allTagsInOne;
+ aa.mFormattedTags = TextUtils.join(";", mTags);
return aa;
}
@@ -503,12 +499,14 @@ public final class AudioAttributes implements Parcelable {
boolean hasFlattenedTags = ((in.readInt() & FLATTEN_TAGS) == FLATTEN_TAGS);
mTags = new HashSet<String>();
if (hasFlattenedTags) {
- mTags.add(in.readString());
+ mFormattedTags = new String(in.readString());
+ mTags.add(mFormattedTags);
} else {
String[] tagsArray = in.readStringArray();
for (int i = tagsArray.length - 1 ; i >= 0 ; i--) {
mTags.add(tagsArray[i]);
}
+ mFormattedTags = TextUtils.join(";", mTags);
}
}
@@ -535,7 +533,7 @@ public final class AudioAttributes implements Parcelable {
+ " usage=" + mUsage
+ " content=" + mContentType
+ " flags=0x" + Integer.toHexString(mFlags).toUpperCase()
- + " tags=" + mTags);
+ + " tags=" + mFormattedTags);
}
/** @hide */
diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl
index 41c4f07..a2b7d6b 100644
--- a/media/java/android/media/tv/ITvInputManager.aidl
+++ b/media/java/android/media/tv/ITvInputManager.aidl
@@ -38,6 +38,8 @@ interface ITvInputManager {
List<TvInputInfo> getTvInputList(int userId);
TvInputInfo getTvInputInfo(in String inputId, int userId);
+ List<Uri> getTvContentRatingSystemXmls(int userId);
+
void registerCallback(in ITvInputManagerCallback callback, int userId);
void unregisterCallback(in ITvInputManagerCallback callback, int userId);
@@ -56,7 +58,7 @@ interface ITvInputManager {
void dispatchSurfaceChanged(in IBinder sessionToken, int format, int width, int height,
int userId);
void setVolume(in IBinder sessionToken, float volume, int userId);
- void tune(in IBinder sessionToken, in Uri channelUri, int userId);
+ void tune(in IBinder sessionToken, in Uri channelUri, in Bundle params, int userId);
void setCaptionEnabled(in IBinder sessionToken, boolean enabled, int userId);
void selectTrack(in IBinder sessionToken, in TvTrackInfo track, int userId);
void unselectTrack(in IBinder sessionToken, in TvTrackInfo track, int userId);
diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl
index df14ad6..9a0be25 100644
--- a/media/java/android/media/tv/ITvInputSession.aidl
+++ b/media/java/android/media/tv/ITvInputSession.aidl
@@ -35,7 +35,7 @@ oneway interface ITvInputSession {
// TODO: Remove this once it becomes irrelevant for applications to handle audio focus. The plan
// is to introduce some new concepts that will solve a number of problems in audio policy today.
void setVolume(float volume);
- void tune(in Uri channelUri);
+ void tune(in Uri channelUri, in Bundle params);
void setCaptionEnabled(boolean enabled);
void selectTrack(in TvTrackInfo track);
void unselectTrack(in TvTrackInfo track);
diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java
index 9fb552c..a809da9 100644
--- a/media/java/android/media/tv/ITvInputSessionWrapper.java
+++ b/media/java/android/media/tv/ITvInputSessionWrapper.java
@@ -111,7 +111,9 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand
return;
}
case DO_TUNE: {
- mTvInputSessionImpl.tune((Uri) msg.obj);
+ SomeArgs args = (SomeArgs) msg.obj;
+ mTvInputSessionImpl.tune((Uri) args.arg1, (Bundle) args.arg2);
+ args.recycle();
return;
}
case DO_SET_CAPTION_ENABLED: {
@@ -184,8 +186,8 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand
}
@Override
- public void tune(Uri channelUri) {
- mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_TUNE, channelUri));
+ public void tune(Uri channelUri, Bundle params) {
+ mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_TUNE, channelUri, params));
}
@Override
diff --git a/media/java/android/media/tv/TvContentRating.java b/media/java/android/media/tv/TvContentRating.java
index 986a7d9..1ace775 100644
--- a/media/java/android/media/tv/TvContentRating.java
+++ b/media/java/android/media/tv/TvContentRating.java
@@ -17,149 +17,275 @@
package android.media.tv;
import android.annotation.SystemApi;
+import android.net.Uri;
import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.Log;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
/**
* A class representing a TV content rating.
+ * When a TV input service provides the content rating information of a program into TV provider,
+ * TvContentRating class will be used for generating the value of {@link
+ * TvContract.Programs#COLUMN_CONTENT_RATING}. To create an object of {@link TvContentRating}, use
+ * the {@link #createRating} method with valid arguments. The arguments could be a system defined
+ * strings, or a TV input service defined strings.
+ * TV input service defined strings are in an xml file defined in <code>&lt;{@link
+ * android.R.styleable#TvInputService tv-input}&gt;</code> with the {@link
+ * android.R.attr#contentRatingSystemXml contentRatingSystemXml} attribute by the TV input service.
+ *
+ * <h3> Content Rating System XML format </h3>
+ * The XML file for publishing content rating system should follow the DTD bellow:
+ * <p><pre class="prettyprint">
+ * &lt;?xml version="1.0" encoding="UTF-8"?&gt;
+ * &lt;!DOCTYPE rating-systems [
+ * &lt;!ELEMENT rating-system-definitions (rating-system-definition+)&gt;
+ * &lt;!ELEMENT rating-system-definition (
+ * (sub-rating-definition*, rating-definition, sub-rating-definition*)+, order*)&gt;
+ * &lt;!ATTLIST rating-system-definition
+ * id ID #REQUIRED
+ * displayName CDATA #IMPLIED
+ * description CDATA #IMPLIED
+ * country CDATA #IMPLIED&gt;
+ * &lt;!ELEMENT sub-rating-definition EMPTY&gt;
+ * &lt;!ATTLIST sub-rating-definition
+ * id ID #REQUIRED
+ * displayName CDATA #IMPLIED
+ * icon CDATA #IMPLIED
+ * description CDATA #IMPLIED&gt;
+ * &lt;!ELEMENT rating-definition (sub-rating*))&gt;
+ * &lt;!ATTLIST rating-definition
+ * id ID #REQUIRED
+ * displayName CDATA #IMPLIED
+ * icon CDATA #IMPLIED
+ * description CDATA #IMPLIED&gt;
+ * &lt;!ELEMENT sub-rating EMPTY&gt;
+ * &lt;!ATTLIST sub-rating id IDREF #REQUIRED&gt;
+ * &lt;!ELEMENT order (rating, rating+)&gt;
+ * &lt;!ELEMENT rating EMPTY&gt;
+ * &lt;!ATTLIST rating id IDREF #REQUIRED&gt;
+ * ]&gt;
+ * </pre></p>
+ *
+ * <h3>System defined rating strings</h3>
+ *
+ * <u>System defined string for {@code domain}</u>
+ * <table border="0" cellspacing="0" cellpadding="0">
+ * <tr>
+ * <td>String value</td>
+ * <td>Comments</td>
+ * </tr>
+ * <tr>
+ * <td>android.media.tv</td>
+ * <td>Used for creating system defined content ratings</td>
+ * </tr>
+ * </table>
+ * <u>System defined string for {@code ratingSystem}</u>
+ * <table border="0" cellspacing="0" cellpadding="0">
+ * <tr>
+ * <td>String value</td>
+ * <td>Comments</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG</td>
+ * <td>The TV Parental Guidelines for US TV content ratings</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV</td>
+ * <td>The South Korean television rating system</td>
+ * </tr>
+ * </table>
+ *
+ * <u>System defined string for {@code rating}</u>
+ * <table border="0" cellspacing="0" cellpadding="0">
+ * <tr>
+ * <td>String value</td>
+ * <td>Comments</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_Y</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated this are designed to be
+ * appropriate for all children. Whether animated or live-action, the themes and elements
+ * in this program are specifically designed for a very young audience, including children
+ * from ages 2-6. This program is not expected to frighten younger children.</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_Y7</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated this are designed for children
+ * age 7 and above. It may be more appropriate for children who have acquired the
+ * developmental skills needed to distinguish between make-believe and reality. Themes and
+ * elements in this program may include mild fantasy violence or comedic violence, or may
+ * frighten children under the age of 7. Therefore, parents may wish to consider the
+ * suitability of this program for their very young children. This rating may contain
+ * fantasy violence (US_TVPG_FV) when programs are generally more intense or more combative
+ * than other programs in this category.</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_G</td>
+ * <td>A rating string for the US_TVPG domain. Most parents would find this program suitable
+ * for all ages. Although this rating does not signify a program designed specifically for
+ * children, most parents may let younger children watch this program unattended. It
+ * contains little or no violence, no strong language and little or no sexual dialogue or
+ * situations.</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_PG</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated this contain material that
+ * parents may find unsuitable for younger children. Many parents may want to watch it with
+ * their younger children. The theme itself may call for parental guidance and/or the
+ * program may contain one or more of the following: some suggestive dialogue (US_TVPG_D),
+ * infrequent coarse language (US_TVPG_L), some sexual situations (US_TVPG_S), or moderate
+ * violence (US_TVPG_V).</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_14</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated this contains some material
+ * that many parents would find unsuitable for children under 14 years of age. Parents are
+ * strongly urged to exercise greater care in monitoring this program and are cautioned
+ * against letting children under the age of 14 watch unattended. This program may contain
+ * one or more of the following: intensely suggestive dialogue (US_TVPG_D), strong coarse
+ * language (US_TVPG_L), intense sexual situations (US_TVPG_S), or intense violence
+ * (US_TVPG_V).</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_MA</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated TV-MA are specifically
+ * designed to be viewed by adults and therefore may be unsuitable for children under 17.
+ * This program may contain one or more of the following: crude indecent language
+ * (US_TVPG_L), explicit sexual activity (US_TVPG_S), or graphic violence (US_TVPG_V).</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_ALL</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that are
+ * appropriate for all ages. This program usually involves programs designed for children or
+ * families. This rating does not have an icon.</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_7</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that may contain
+ * material inappropriate for children younger than 7, and parental discretion should be
+ * used. Some cartoon programs not deemed strictly as "educational", and films rated "G" or
+ * "PG" in North America may fall into the 7 category.</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_12</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that may deemed
+ * inappropriate for those younger than 12, and parental discretion should be used. Usually
+ * used for animations that have stronger themes or violence then those designed for
+ * children, or for reality shows that have mild violence, themes, or language.</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_15</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that contain
+ * material that may be inappropriate for children under 15, and that parental discretion
+ * should be used. Examples include most dramas, and talk shows on OTA (over-the-air) TV
+ * (KBS, MBC, SBS), and many American TV shows/dramas on Cable TV channels like OCN and
+ * OnStyle. The programs that have this rating may include moderate or strong adult themes,
+ * language, sexual inference, and violence. As with the TV-14 rating in North America, this
+ * rating is commonly applied to live events where the occurrence of inappropriate dialogue
+ * is unpredictable. Since 2007, this rating is the most used rating for TV.</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_19</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that are intended
+ * for adults only. 19-rated programs cannot air during the hours of 7:00AM to 9:00AM, and
+ * 1:00PM to 10:00PM. Programs that receive this rating will almost certainly have adult
+ * themes, sexual situations, frequent use of strong language and disturbing scenes of
+ * violence.</td>
+ * </tr>
+ * </table>
+ *
+ * <u>System defined string for {@code subRating}</u>
+ * <table border="0" cellspacing="0" cellpadding="0">
+ * <tr>
+ * <td>String value</td>
+ * <td>Comments</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_D</td>
+ * <td>Suggestive dialogue (Not used with US_TVPG_TV_MA)</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_L</td>
+ * <td>Coarse language</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_S</td>
+ * <td>Sexual content</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_V</td>
+ * <td>Violence</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_FV</td>
+ * <td>Fantasy violence (exclusive to US_TVPG_TV_Y7)</td>
+ * </tr>
+ * </table>
*/
public final class TvContentRating {
private static final String TAG = "TvContentRating";
- private static final int RATING_PREFIX_LENGTH = 10;
- private static final String PREFIX_RATING_US = "RATING_US_";
- private static final String PREFIX_SUBRATING_US = "SUBRATING_US_";
+ /** @hide */
+ public static final Uri SYSTEM_CONTENT_RATING_SYSTEM_XML = Uri.parse(
+ "android.resource://system/" + com.android.internal.R.xml.tv_content_rating_systems);
- /**
- * Rating constant for TV-Y from the TV Parental Guidelines system in US. This program is
- * designed to be appropriate for all children.
- */
- public static final String RATING_US_TV_Y = PREFIX_RATING_US + "TV_Y";
- /**
- * Rating constant for TV-Y7 from the TV Parental Guidelines system in US. This program is
- * designed for children age 7 and above.
- */
- public static final String RATING_US_TV_Y7 = PREFIX_RATING_US + "TV_Y7";
- /**
- * Rating constant for TV-G from the TV Parental Guidelines system in US. Most parents would
- * find this program suitable for all ages.
- */
- public static final String RATING_US_TV_G = PREFIX_RATING_US + "TV_G";
- /**
- * Rating constant for TV-PG from the TV Parental Guidelines system in US. This program contains
- * material that parents may find unsuitable for younger children.
- */
- public static final String RATING_US_TV_PG = PREFIX_RATING_US + "TV_PG";
- /**
- * Rating constant for TV-14 from the TV Parental Guidelines system in US. This program contains
- * some material that many parents would find unsuitable for children under 14 years of age.
- */
- public static final String RATING_US_TV_14 = PREFIX_RATING_US + "TV_14";
- /**
- * Rating constant for TV-MA from the TV Parental Guidelines system in US. This program is
- * specifically designed to be viewed by adults and therefore may be unsuitable for children
- * under 17.
- */
- public static final String RATING_US_TV_MA = PREFIX_RATING_US + "TV_MA";
-
- /**
- * Sub-rating constant for D (Suggestive dialogue) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_D = PREFIX_SUBRATING_US + "D";
- /**
- * Sub-rating constant for L (Coarse language) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_L = PREFIX_SUBRATING_US + "L";
- /**
- * Sub-rating constant for S (Sexual content) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_S = PREFIX_SUBRATING_US + "S";
- /**
- * Sub-rating constant for V (Violence) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_V = PREFIX_SUBRATING_US + "V";
- /**
- * Sub-rating constant for FV (Fantasy violence) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_FV = PREFIX_SUBRATING_US + "FV";
+ // TODO: Consider to use other DELIMITER. In some countries such as India may use this delimiter
+ // in the main ratings.
+ private static final String DELIMITER = "/";
- private static final String PREFIX_RATING_KR = "RATING_KR_";
+ private final String mDomain;
+ private final String mCountryCode;
+ private final String mRatingSystem;
+ private final String mRating;
+ private final String[] mSubRatings;
/**
- * Rating constant for 'ALL' from the South Korean television rating system. This rating is for
- * programming that is appropriate for all ages.
- */
- public static final String RATING_KR_ALL = PREFIX_RATING_KR + "ALL";
- /**
- * Rating constant for '7' from the South Korean television rating system. This rating is for
- * programming that may contain material inappropriate for children younger than 7, and parental
- * discretion should be used.
- */
- public static final String RATING_KR_7 = PREFIX_RATING_KR + "7";
- /**
- * Rating constant for '12' from the South Korean television rating system. This rating is for
- * programs that may deemed inappropriate for those younger than 12, and parental discretion
- * should be used.
- */
- public static final String RATING_KR_12 = PREFIX_RATING_KR + "12";
- /**
- * Rating constant for '15' from the South Korean television rating system. This rating is for
- * programs that contain material that may be inappropriate for children under 15, and that
- * parental discretion should be used.
- */
- public static final String RATING_KR_15 = PREFIX_RATING_KR + "15";
- /**
- * Rating constant for '19' from the South Korean television rating system. This rating is for
- * programs that are intended for adults only. 19-rated programming cannot air during the hours
- * of 7:00AM to 9:00AM, and 1:00PM to 10:00PM.
+ * Creates a TvContentRating object.
+ *
+ * @param domain The domain name.
+ * @param countryCode The country code in ISO 3166-2 format or {@code null}.
+ * @param ratingSystem The rating system id.
+ * @param rating The content rating string.
+ * @param subRatings The string array of sub-ratings.
+ * @return A TvContentRating object, or null if creation failed.
*/
- public static final String RATING_KR_19 = PREFIX_RATING_KR + "19";
-
- private static final String DELIMITER = "/";
-
- // A mapping from two-letter country code (ISO 3166-1 alpha-2) to its rating-to-sub-ratings map.
- // This is used for validating the builder parameters.
- private static final Map<String, Map<String, String[]>> sRatings
- = new ArrayMap<String, Map<String, String[]>>();
-
- static {
- Map<String, String[]> usRatings = new ArrayMap<String, String[]>();
- usRatings.put(RATING_US_TV_Y, null);
- usRatings.put(RATING_US_TV_Y7, new String[] { SUBRATING_US_FV });
- usRatings.put(RATING_US_TV_G, null);
- usRatings.put(RATING_US_TV_PG, new String[] {
- SUBRATING_US_D, SUBRATING_US_L, SUBRATING_US_S, SUBRATING_US_V });
- usRatings.put(RATING_US_TV_14, new String[] {
- SUBRATING_US_D, SUBRATING_US_L, SUBRATING_US_S, SUBRATING_US_V });
- usRatings.put(RATING_US_TV_MA, new String[] {
- SUBRATING_US_L, SUBRATING_US_S, SUBRATING_US_V });
- sRatings.put(PREFIX_RATING_US, usRatings);
-
- Map<String, String[]> krRatings = new ArrayMap<String, String[]>();
- krRatings.put(RATING_KR_ALL, null);
- krRatings.put(RATING_KR_7, null);
- krRatings.put(RATING_KR_12, null);
- krRatings.put(RATING_KR_15, null);
- krRatings.put(RATING_KR_19, null);
- sRatings.put(PREFIX_RATING_KR, krRatings);
+ public static TvContentRating createRating(String domain, String countryCode,
+ String ratingSystem, String rating, String... subRatings) {
+ if (TextUtils.isEmpty(domain)) {
+ throw new IllegalArgumentException("domain cannot be empty");
+ }
+ if (TextUtils.isEmpty(rating)) {
+ throw new IllegalArgumentException("rating cannot be empty");
+ }
+ return new TvContentRating(domain, countryCode, ratingSystem, rating, subRatings);
}
- private final String mRating;
- private final String[] mSubRatings;
-
/**
- * Constructs a TvContentRating object from a given rating constant.
+ * Recovers a TvContentRating from a String that was previously created with
+ * {@link #flattenToString}.
*
- * @param rating The rating constant defined in this class.
+ * @param ratingString The String that was returned by flattenToString().
+ * @return a new TvContentRating containing the domain, countryCode, rating system, rating and
+ * sub-ratings information was encoded in {@code ratingString}.
+ * @see #flattenToString
*/
- public TvContentRating(String rating) {
- this(rating, null);
+ public static TvContentRating unflattenFromString(String ratingString) {
+ if (TextUtils.isEmpty(ratingString)) {
+ throw new IllegalArgumentException("ratingString cannot be empty");
+ }
+ String[] strs = ratingString.split(DELIMITER);
+ if (strs.length < 4) {
+ throw new IllegalArgumentException("Invalid rating string: " + ratingString);
+ }
+ if (strs.length > 4) {
+ String[] subRatings = new String[strs.length - 4];
+ System.arraycopy(strs, 4, subRatings, 0, subRatings.length);
+ return new TvContentRating(strs[0], strs[1], strs[2], strs[3], subRatings);
+ }
+ return new TvContentRating(strs[0], strs[1], strs[2], strs[3], null);
}
/**
@@ -168,57 +294,45 @@ public final class TvContentRating {
* @param rating The rating constant defined in this class.
* @param subRatings The String array of sub-rating constants defined in this class.
*/
- public TvContentRating(String rating, String[] subRatings) {
- if (TextUtils.isEmpty(rating)) {
- throw new IllegalArgumentException("rating cannot be null");
- }
+ private TvContentRating(String domain, String countryCode,
+ String ratingSystem, String rating, String[] subRatings) {
+ mDomain = domain;
+ mCountryCode = countryCode;
+ mRatingSystem = ratingSystem;
mRating = rating;
mSubRatings = subRatings;
- String prefix = "";
- if (mRating.length() > RATING_PREFIX_LENGTH) {
- prefix = mRating.substring(0, RATING_PREFIX_LENGTH);
- }
- Map<String, String[]> ratings = sRatings.get(prefix);
- if (ratings != null) {
- if (!ratings.keySet().contains(mRating)) {
- Log.w(TAG, "Unknown rating: " + mRating);
- } else if (mSubRatings != null) {
- String[] validSubRatings = ratings.get(mRating);
- if (validSubRatings == null) {
- Log.w(TAG, "Invalid subratings: " + mSubRatings);
- } else {
- List<String> validSubRatingList = Arrays.asList(subRatings);
- for (String sr : mSubRatings) {
- if (TextUtils.isEmpty(sr)) {
- throw new IllegalArgumentException(
- "subRatings cannot contain empty elements");
- }
- if (!validSubRatingList.contains(sr)) {
- Log.w(TAG, "Invalid subrating: " + sr);
- break;
- }
- }
- }
- }
- } else {
- Log.w(TAG, "Rating undefined for " + mRating);
- }
}
/**
- * Returns the main rating constant.
- *
- * @return the rating string that starts with "RATING_" prefix as defined in this class.
+ * Returns the domain.
+ */
+ public String getDomain() {
+ return mDomain;
+ }
+
+ /**
+ * Returns the country code in ISO 3166-2 format or {@code null}.
+ */
+ public String getCountry() {
+ return mCountryCode;
+ }
+
+ /**
+ * Returns the rating system id.
+ */
+ public String getRatingSystem() {
+ return mRatingSystem;
+ }
+
+ /**
+ * Returns the main rating.
*/
public String getMainRating() {
return mRating;
}
/**
- * Returns the list of sub-rating constants.
- *
- * @return the unmodifiable {@code List} of sub-rating strings that start with "SUBRATING_"
- * prefix as defined in this class.
+ * Returns the unmodifiable {@code List} of sub-rating strings.
*/
public List<String> getSubRatings() {
if (mSubRatings == null) {
@@ -238,10 +352,14 @@ public final class TvContentRating {
* @see #unflattenFromString
*/
public String flattenToString() {
- // TODO: Consider removing all obvious/redundant sub-strings including "RATING" and
- // "SUBRATING" and find out a storage-efficient string format such as:
- // <country>-<primary>/<sub1>/<sub2>/<sub3>
- StringBuilder builder = new StringBuilder(mRating);
+ StringBuilder builder = new StringBuilder();
+ builder.append(mDomain);
+ builder.append(DELIMITER);
+ builder.append(mCountryCode);
+ builder.append(DELIMITER);
+ builder.append(mRatingSystem);
+ builder.append(DELIMITER);
+ builder.append(mRating);
if (mSubRatings != null) {
for (String subRating : mSubRatings) {
builder.append(DELIMITER);
@@ -252,31 +370,6 @@ public final class TvContentRating {
}
/**
- * Recovers a TvContentRating from a String that was previously created with
- * {@link #flattenToString}.
- *
- * @param ratingString The String that was returned by flattenToString().
- * @return a new TvContentRating containing the rating and sub-ratings information was encoded
- * in {@code ratingString}.
- * @see #flattenToString
- */
- public static TvContentRating unflattenFromString(String ratingString) {
- if (TextUtils.isEmpty(ratingString)) {
- throw new IllegalArgumentException("Empty rating string");
- }
- String[] strs = ratingString.split(DELIMITER);
- if (strs.length < 1) {
- throw new IllegalArgumentException("Invalid rating string: " + ratingString);
- }
- if (strs.length > 1) {
- String[] subRatings = new String[strs.length - 1];
- System.arraycopy(strs, 1, subRatings, 0, subRatings.length);
- return new TvContentRating(strs[0], subRatings);
- }
- return new TvContentRating(strs[0]);
- }
-
- /**
* Returns true if this rating has the same main rating as the specified rating and when this
* rating's sub-ratings contain the other's.
* <p>
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index 1a43051..5a0ea0d 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -509,7 +509,7 @@ public final class TvContract {
* The ID of the TV input service that provides this TV channel.
* <p>
* Use {@link #buildInputId} to build the ID.
- * <p>
+ * </p><p>
* This is a required field.
* </p><p>
* Type: TEXT
@@ -662,7 +662,7 @@ public final class TvContract {
* {@link Programs#COLUMN_VIDEO_HEIGHT} to get more accurate video resolution.
* </p><p>
* Type: TEXT
- * </p><p>
+ * </p>
* @see #getVideoResolution
*/
public static final String COLUMN_VIDEO_FORMAT = "video_format";
@@ -688,8 +688,7 @@ public final class TvContract {
* the channel is searchable and can be included in search results, a value of 0 indicates
* the channel and its TV programs are hidden from search. If not specified, this value is
* set to 1 (searchable) by default.
- * </p>
- * <p>
+ * </p><p>
* Type: INTEGER (boolean)
* </p>
*/
@@ -743,14 +742,12 @@ public final class TvContract {
* To access this directory, append {@link Channels.Logo#CONTENT_DIRECTORY} to the raw
* channel URI. The resulting URI represents an image file, and should be interacted
* using ContentResolver.openAssetFileDescriptor.
- * </p>
- * <p>
+ * </p><p>
* Note that this sub-directory also supports opening the logo as an asset file in write
* mode. Callers can create or replace the primary logo associated with this channel by
* opening the asset file and writing the full-size photo contents into it. When the file
* is closed, the image will be parsed, sized down if necessary, and stored.
- * </p>
- * <p>
+ * </p><p>
* Usage example:
* <pre>
* public void writeChannelLogo(long channelId, byte[] logo) {
@@ -1180,6 +1177,19 @@ public final class TvContract {
*/
public static final String COLUMN_DESCRIPTION = "description";
+ /**
+ * Extra parameters of the tune operation.
+ * <p>
+ * This column contains an encoded string which is comma-separated key-value pairs.
+ * (Ex. "[key1]=[value1], [key2]=[value2]"). COLUMN_TUNE_PARAMS will use '%' as an escape
+ * character for the characters of '%', '=', and ','.
+ * </p><p>
+ * Type: TEXT
+ * </p>
+ * @see TvInputManager.Session.tune(Uri, Bundle)
+ */
+ public static final String COLUMN_TUNE_PARAMS = "tune_params";
+
private WatchedPrograms() {}
}
}
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index e48b805..bc0538c 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -18,6 +18,7 @@ package android.media.tv;
import android.annotation.SystemApi;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -118,6 +119,7 @@ public final class TvInputInfo implements Parcelable {
private String mLabel;
private Uri mIconUri;
private boolean mIsConnectedToHdmiSwitch;
+ private Uri mRatingSystemXmlUri;
static {
sHardwareTypeToTvInputType.put(TvInputHardwareInfo.TV_INPUT_TYPE_OTHER_HARDWARE,
@@ -237,6 +239,19 @@ public final class TvInputInfo implements Parcelable {
Log.d(TAG, "Settings activity loaded. [" + input.mSettingsActivity + "] for "
+ si.name);
}
+ int contentRatingSystemXml = sa.getResourceId(
+ com.android.internal.R.styleable.TvInputService_contentRatingSystemXml, -1);
+ if (contentRatingSystemXml != -1) {
+ input.mRatingSystemXmlUri = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
+ .authority(si.packageName)
+ .appendPath(Integer.toString(contentRatingSystemXml))
+ .build();
+ if (DEBUG) {
+ Log.d(TAG, "Content rating xml loaded. [" + contentRatingSystemXml + "] for "
+ + si.name);
+ }
+ }
sa.recycle();
input.mLabel = label;
@@ -346,6 +361,15 @@ public final class TvInputInfo implements Parcelable {
}
/**
+ * Returns the resource uri for the rating system xml of this TV input service.
+ * @hide
+ */
+ @SystemApi
+ public Uri getRatingSystemXmlUri() {
+ return mRatingSystemXmlUri;
+ }
+
+ /**
* Returns {@code true} if this TV input is pass-though which does not have any real channels
* in TvProvider. {@code false} otherwise.
*
@@ -449,9 +473,10 @@ public final class TvInputInfo implements Parcelable {
dest.writeString(mSetupActivity);
dest.writeString(mSettingsActivity);
dest.writeInt(mType);
- dest.writeString(mIconUri == null ? null : mIconUri.toString());
+ dest.writeParcelable(mIconUri, flags);
dest.writeString(mLabel);
dest.writeByte(mIsConnectedToHdmiSwitch ? (byte) 1 : 0);
+ dest.writeParcelable(mRatingSystemXmlUri, flags);
}
private Drawable loadDefaultIcon(Context context) {
@@ -521,11 +546,9 @@ public final class TvInputInfo implements Parcelable {
mSetupActivity = in.readString();
mSettingsActivity = in.readString();
mType = in.readInt();
- String mIconUriString = in.readString();
- if (mIconUriString != null) {
- mIconUri = Uri.parse(mIconUriString);
- }
+ mIconUri = in.readParcelable(null);
mLabel = in.readString();
mIsConnectedToHdmiSwitch = in.readByte() == 1 ? true : false;
+ mRatingSystemXmlUri = in.readParcelable(null);
}
}
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index 49b2240..0334083 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -800,6 +800,19 @@ public final class TvInputManager {
}
/**
+ * Returns the list of xml resource uris for TV content rating systems.
+ * @hide
+ */
+ @SystemApi
+ public List<Uri> getTvContentRatingSystemXmls() {
+ try {
+ return mService.getTvContentRatingSystemXmls(mUserId);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
* Creates a {@link Session} for a given TV input.
* <p>
* The number of sessions that can be created at the same time is limited by the capability of
@@ -1012,6 +1025,19 @@ public final class TvInputManager {
* @throws IllegalArgumentException if the argument is {@code null}.
*/
public void tune(Uri channelUri) {
+ tune(channelUri, null);
+ }
+
+ /**
+ * Tunes to a given channel.
+ *
+ * @param channelUri The URI of a channel.
+ * @param params A set of extra parameters which might be handled with this tune event.
+ * @throws IllegalArgumentException if {@code channelUri} is {@code null}.
+ * @hide
+ */
+ @SystemApi
+ public void tune(Uri channelUri, Bundle params) {
if (channelUri == null) {
throw new IllegalArgumentException("channelUri cannot be null");
}
@@ -1021,7 +1047,7 @@ public final class TvInputManager {
}
mTracks = null;
try {
- mService.tune(mToken, channelUri, mUserId);
+ mService.tune(mToken, channelUri, params, mUserId);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index 29a2230..7ce278c 100644
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -558,6 +558,19 @@ public abstract class TvInputService extends Service {
public abstract boolean onTune(Uri channelUri);
/**
+ * Calls {@link #onTune(Uri)}. Override this method in order to handle {@code params}.
+ *
+ * @param channelUri The URI of the channel.
+ * @param params The extra parameters from other applications.
+ * @return {@code true} the tuning was successful, {@code false} otherwise.
+ * @hide
+ */
+ @SystemApi
+ public boolean onTune(Uri channelUri, Bundle params) {
+ return onTune(channelUri);
+ }
+
+ /**
* Enables or disables the caption.
* <p>
* The locale for the user's preferred captioning language can be obtained by calling
@@ -809,8 +822,8 @@ public abstract class TvInputService extends Service {
/**
* Calls {@link #onTune}.
*/
- void tune(Uri channelUri) {
- onTune(channelUri);
+ void tune(Uri channelUri, Bundle params) {
+ onTune(channelUri, params);
// TODO: Handle failure.
}
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index 7031f05..2696a63 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -203,10 +203,23 @@ public class TvView extends ViewGroup {
/**
* Tunes to a given channel.
*
- * @param inputId the id of TV input which will play the given channel.
+ * @param inputId The id of TV input which will play the given channel.
* @param channelUri The URI of a channel.
*/
public void tune(String inputId, Uri channelUri) {
+ tune(inputId, channelUri, null);
+ }
+
+ /**
+ * Tunes to a given channel.
+ *
+ * @param inputId The id of TV input which will play the given channel.
+ * @param channelUri The URI of a channel.
+ * @param params Extra parameters which might be handled with the tune event.
+ * @hide
+ */
+ @SystemApi
+ public void tune(String inputId, Uri channelUri, Bundle params) {
if (DEBUG) Log.d(TAG, "tune(" + channelUri + ")");
if (TextUtils.isEmpty(inputId)) {
throw new IllegalArgumentException("inputId cannot be null or an empty string");
@@ -218,11 +231,12 @@ public class TvView extends ViewGroup {
}
if (mSessionCallback != null && mSessionCallback.mInputId.equals(inputId)) {
if (mSession != null) {
- mSession.tune(channelUri);
+ mSession.tune(channelUri, params);
} else {
// Session is not created yet. Replace the channel which will be set once the
// session is made.
mSessionCallback.mChannelUri = channelUri;
+ mSessionCallback.mTuneParams = params;
}
} else {
reset();
@@ -231,7 +245,7 @@ public class TvView extends ViewGroup {
// The previous callbacks will be ignored. For the logic, mSessionCallback
// is newly assigned for every createSession request and compared with
// MySessionCreateCallback.this.
- mSessionCallback = new MySessionCallback(inputId, channelUri);
+ mSessionCallback = new MySessionCallback(inputId, channelUri, params);
mTvInputManager.createSession(inputId, mSessionCallback, mHandler);
}
}
@@ -722,10 +736,12 @@ public class TvView extends ViewGroup {
private class MySessionCallback extends SessionCallback {
final String mInputId;
Uri mChannelUri;
+ Bundle mTuneParams;
- MySessionCallback(String inputId, Uri channelUri) {
+ MySessionCallback(String inputId, Uri channelUri, Bundle tuneParams) {
mInputId = inputId;
mChannelUri = channelUri;
+ mTuneParams = tuneParams;
}
@Override
@@ -754,7 +770,7 @@ public class TvView extends ViewGroup {
}
}
createSessionOverlayView();
- mSession.tune(mChannelUri);
+ mSession.tune(mChannelUri, mTuneParams);
if (mHasStreamVolume) {
mSession.setStreamVolume(mStreamVolume);
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index dd7a828..91199c1 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -190,33 +190,34 @@ public class SettingsHelper {
String localeString = loc.getLanguage();
String country = loc.getCountry();
if (!TextUtils.isEmpty(country)) {
- localeString += "_" + country;
+ localeString += "-" + country;
}
return localeString.getBytes();
}
/**
- * Sets the locale specified. Input data is the equivalent of "ll_cc".getBytes(), where
- * "ll" is the language code and "cc" is the country code.
+ * Sets the locale specified. Input data is the byte representation of a
+ * BCP-47 language tag. For backwards compatibility, strings of the form
+ * {@code ll_CC} are also accepted, where {@code ll} is a two letter language
+ * code and {@code CC} is a two letter country code.
+ *
* @param data the locale string in bytes.
*/
void setLocaleData(byte[] data, int size) {
// Check if locale was set by the user:
Configuration conf = mContext.getResources().getConfiguration();
- Locale loc = conf.locale;
// TODO: The following is not working as intended because the network is forcing a locale
// change after registering. Need to find some other way to detect if the user manually
// changed the locale
if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard
final String[] availableLocales = mContext.getAssets().getLocales();
- String localeCode = new String(data, 0, size);
- String language = new String(data, 0, 2);
- String country = size > 4 ? new String(data, 3, 2) : "";
- loc = null;
+ // Replace "_" with "-" to deal with older backups.
+ String localeCode = new String(data, 0, size).replace('_', '-');
+ Locale loc = null;
for (int i = 0; i < availableLocales.length; i++) {
if (availableLocales[i].equals(localeCode)) {
- loc = new Locale(language, country);
+ loc = Locale.forLanguageTag(localeCode);
break;
}
}
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png
deleted file mode 100644
index a14b8d8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png
+++ /dev/null
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
deleted file mode 100644
index b226694..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png
+++ /dev/null
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
deleted file mode 100644
index cbabd61..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png
+++ /dev/null
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
deleted file mode 100644
index 1e9fbfd..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png
+++ /dev/null
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
deleted file mode 100644
index 0676919..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png
+++ /dev/null
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
deleted file mode 100644
index 12569d1..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png
+++ /dev/null
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
deleted file mode 100644
index 3ad9e76..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png
+++ /dev/null
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
deleted file mode 100644
index 7d5f6d0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png
+++ /dev/null
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
deleted file mode 100644
index 2102263..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index c288137..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.png
+++ /dev/null
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
deleted file mode 100644
index 2e3e486..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png
+++ /dev/null
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
deleted file mode 100644
index c24cd4d..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png
+++ /dev/null
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
deleted file mode 100644
index 04e8220..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png
+++ /dev/null
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
deleted file mode 100644
index f8ed8f0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png
+++ /dev/null
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
deleted file mode 100644
index 4f76f66..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png
+++ /dev/null
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
deleted file mode 100644
index 9570dae..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index b23a043..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.png
+++ /dev/null
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
deleted file mode 100644
index 75de8cd..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png
+++ /dev/null
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
deleted file mode 100644
index c0ae67c..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png
+++ /dev/null
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
deleted file mode 100644
index 858afc8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 9dfde67..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.png
+++ /dev/null
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
deleted file mode 100644
index 4fea255..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png
+++ /dev/null
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
deleted file mode 100644
index fa905cc..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png
+++ /dev/null
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
deleted file mode 100644
index 5b5b5d2..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png
+++ /dev/null
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
deleted file mode 100644
index 250653b..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
+++ /dev/null
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
deleted file mode 100644
index 497c69f..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 5128c0d..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 05bb0a0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png
+++ /dev/null
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
deleted file mode 100644
index dd8ba8f..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
+++ /dev/null
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
deleted file mode 100644
index d750726..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
+++ /dev/null
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
deleted file mode 100644
index da77a35..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png
+++ /dev/null
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
deleted file mode 100644
index c416fc3..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png
+++ /dev/null
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
deleted file mode 100644
index c500691..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png
+++ /dev/null
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
deleted file mode 100644
index ae87896..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png
+++ /dev/null
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
deleted file mode 100644
index e47ef7a..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png
+++ /dev/null
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
deleted file mode 100644
index 9fd1ae6..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png
+++ /dev/null
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
deleted file mode 100644
index 93b45b4..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png
+++ /dev/null
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
deleted file mode 100644
index 21b2c61..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png
+++ /dev/null
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
deleted file mode 100644
index cd96ae0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png
+++ /dev/null
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
deleted file mode 100644
index 43bfe3a..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png
+++ /dev/null
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
deleted file mode 100644
index 250653b..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
+++ /dev/null
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
deleted file mode 100644
index 497c69f..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
+++ /dev/null
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
deleted file mode 100644
index 45bc376..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.png
deleted file mode 100644
index c416fc3..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.png
+++ /dev/null
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
deleted file mode 100644
index d750726..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 804d1ac..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 1d863e9..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 62970fe..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 6c3fbdc..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index a5effe0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index b7071b9..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index bd145fa..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index be38df8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png
deleted file mode 100644
index da941c8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 0fd09d7..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index cfe43dd..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index 92a5b1c..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 9454cd8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 6cb18c7..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
deleted file mode 100644
index 45ed7ca..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
deleted file mode 100644
index 0060eba..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
deleted file mode 100644
index faf4153..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
deleted file mode 100644
index 6a25705..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
deleted file mode 100644
index c609847..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 6248cfd..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
deleted file mode 100644
index 8c3e896..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.png
deleted file mode 100644
index 49f9d8d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.png
deleted file mode 100644
index b6388e1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.png
deleted file mode 100644
index 969bff4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.png
deleted file mode 100644
index 610a018..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.png
deleted file mode 100644
index badebf5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.png
deleted file mode 100644
index ff96e40..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.png
deleted file mode 100644
index 52c9a74..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.png
deleted file mode 100644
index 312a384..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.png
deleted file mode 100644
index 1211e0d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index 49f9d8d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index ce85449..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index 3226db6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index 050dde5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 1498198..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index 99484b1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index 656f9ef..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index f4f0035..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index 935a743..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index 5510f6b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index c21352c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 9298dae..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index da4093e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.png
deleted file mode 100644
index b65abc6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.png
deleted file mode 100644
index 08e21d2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png
deleted file mode 100644
index 64c6723..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png
deleted file mode 100644
index 2338122..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 464ebbc..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index c532510..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index f87944f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png
deleted file mode 100644
index 29df6d7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.png
deleted file mode 100644
index 37da1f4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 3d82daf..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index dfbf1a4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 85721db..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 4a2421c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index acc98b7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index 64653eb..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index f440755..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index ffb58ca..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
deleted file mode 100644
index b477332..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index b477332..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 36cb7e5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index cc30aa1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 6f0b419..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 01d47c5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
deleted file mode 100644
index cd4056c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.png
deleted file mode 100644
index ad699e2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.png
deleted file mode 100644
index 7116084..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.png
deleted file mode 100644
index 8596aa6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.png
deleted file mode 100644
index 1b81c42..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.png
deleted file mode 100644
index 03591c2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.png
deleted file mode 100644
index ee72967..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.png
deleted file mode 100644
index 162315c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.png
deleted file mode 100644
index c472f2b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.png
deleted file mode 100644
index e4bf4e2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index ad699e2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index d45c0ad..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index e5e2c27..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index 55e7125..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index db913dd..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index e1760b4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index c098fd9..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index d084a6b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index 5c2e8e5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index f69c1f7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 066efdd..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index d3b51c1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index 4fcc7bc..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.png
deleted file mode 100644
index 98b0104..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.png
deleted file mode 100644
index fc19c7a..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png
deleted file mode 100644
index 3fba731..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png
deleted file mode 100644
index eb5fcd0..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 2250282..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 5ec4543..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index b8f137c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png
deleted file mode 100644
index a91c7c7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.png
deleted file mode 100644
index 8290e1b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 0d97960..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index f8e06e1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 35be266..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 64727d3..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index 3b14d98..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index c51c4b1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 867a014..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index c54ceba..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
deleted file mode 100644
index 6f457e0..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 6f457e0..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 45d733e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index 093387a..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 2f32c4c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 8e9ba9c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
deleted file mode 100644
index c18d103..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.png
deleted file mode 100644
index e50be70..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.png
deleted file mode 100644
index a5d68e1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.png
deleted file mode 100644
index 69d0461..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.png
deleted file mode 100644
index df0948b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.png
deleted file mode 100644
index 4409267..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.png
deleted file mode 100644
index de0181b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.png
deleted file mode 100644
index c3e4181..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.png
deleted file mode 100644
index 69a950d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.png
deleted file mode 100644
index 04948ae..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index e50be70..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index 53bf4de..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index 5733b5d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index 5a69da2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 52df2f7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index 503cc78..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index b5c176d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index 4c169ec..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index 5d09b042..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index 94f332e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 1d2594b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 22eec00..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index 99efc08..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.png
deleted file mode 100644
index a6b0393..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.png
deleted file mode 100644
index ede64f1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png
deleted file mode 100644
index 521de12..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png
deleted file mode 100644
index 4d015da..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.png
deleted file mode 100644
index e82ba13..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 7097b26..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index 43fbaeb..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png
deleted file mode 100644
index d8209e6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.png
deleted file mode 100644
index 83e7206..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 8a72b0a..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 4f1632d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index fd9eb8b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index aa0677e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index cf1f099..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index 441e9dd..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 2614d61..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index d8db235..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
deleted file mode 100644
index 60ede0a..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index a22fa28..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 26a0543..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index ec31162..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 26cd26f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 25ed626..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
deleted file mode 100644
index 37da333..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.png
deleted file mode 100644
index 5298d41..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.png
deleted file mode 100644
index 19809c2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.png
deleted file mode 100644
index cd34141..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.png
deleted file mode 100644
index 5691f96..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.png
deleted file mode 100644
index 56768dd..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.png
deleted file mode 100644
index 094d4ca..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.png
deleted file mode 100644
index 55ec5b8..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.png
deleted file mode 100644
index f92aac2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.png
deleted file mode 100644
index 4329b67..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index a9c0849..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index 41c1f89..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index dea2bf2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index 3a1678f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 2e84aa1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index 79c97fa..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index 742b5bb..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index 3b297af..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index c5a7b8c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index 077b754..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 7907b02..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 190d3f4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index 7c70da6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.png
deleted file mode 100644
index 3577fbb..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.png
deleted file mode 100644
index 0aae48b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png
deleted file mode 100644
index 3725b3f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png
deleted file mode 100644
index b72a274..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 2d2b106..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 330b96b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index 30fe798..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png
deleted file mode 100644
index aa2de43..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.png
deleted file mode 100644
index a2003fc..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index c4507c7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index bfef649..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index c39658d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 0f2e79c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index d37b2929..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index 96a1463..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 9b5dbfa..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index cc6155f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
deleted file mode 100644
index 5950ef8..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index a930649..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 9245462..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index b5b8884..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 11b5832..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index ff8246e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
deleted file mode 100644
index e0c5408..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
+++ /dev/null
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
deleted file mode 100644
index 3afbca4..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png
+++ /dev/null
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
deleted file mode 100644
index 2994632..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png
+++ /dev/null
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
deleted file mode 100644
index a89191f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png
+++ /dev/null
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
deleted file mode 100644
index b111939..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png
+++ /dev/null
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
deleted file mode 100644
index 98c8e25..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png
+++ /dev/null
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
deleted file mode 100644
index 8a8e323..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png
+++ /dev/null
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
deleted file mode 100644
index 625dbd9..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png
+++ /dev/null
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
deleted file mode 100644
index c1063a9..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png
+++ /dev/null
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
deleted file mode 100644
index f145410..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index ea4ab18..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.png
+++ /dev/null
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
deleted file mode 100644
index 1d063d7..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png
+++ /dev/null
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
deleted file mode 100644
index 2f76529..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png
+++ /dev/null
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
deleted file mode 100644
index b8551ac..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png
+++ /dev/null
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
deleted file mode 100644
index 25e5586..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png
+++ /dev/null
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
deleted file mode 100644
index 244280b..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png
+++ /dev/null
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
deleted file mode 100644
index f0bd70e..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index befe94d..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.png
+++ /dev/null
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
deleted file mode 100644
index 01a81ab..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png
+++ /dev/null
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
deleted file mode 100644
index abed290..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png
+++ /dev/null
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
deleted file mode 100644
index e4b1fad..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index da8ebce..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.png
+++ /dev/null
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
deleted file mode 100644
index 776210b..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png
+++ /dev/null
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
deleted file mode 100644
index a5de26f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png
+++ /dev/null
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
deleted file mode 100644
index b3d4524..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png
+++ /dev/null
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
deleted file mode 100644
index 4a2119f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
+++ /dev/null
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
deleted file mode 100644
index a53d764..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 0555eed..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index b27479a..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png
+++ /dev/null
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
deleted file mode 100644
index 5922161..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
+++ /dev/null
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
deleted file mode 100644
index 8b7251b..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
+++ /dev/null
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
deleted file mode 100644
index f1753d6..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png
+++ /dev/null
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
deleted file mode 100644
index b177999..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png
+++ /dev/null
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
deleted file mode 100644
index 60e38ad..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png
+++ /dev/null
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
deleted file mode 100644
index 8983380..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png
+++ /dev/null
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
deleted file mode 100644
index ff652df..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png
+++ /dev/null
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
deleted file mode 100644
index 8dd9c43..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png
+++ /dev/null
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
deleted file mode 100644
index b3318bc..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png
+++ /dev/null
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
deleted file mode 100644
index 18f5307..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png
+++ /dev/null
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
deleted file mode 100644
index 6d08001..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png
+++ /dev/null
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
deleted file mode 100644
index ef3023e..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png
+++ /dev/null
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
deleted file mode 100644
index 4a2119f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
+++ /dev/null
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
deleted file mode 100644
index a53d764..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
+++ /dev/null
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
deleted file mode 100644
index 535a4fdc..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.png
deleted file mode 100644
index b177999..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.png
+++ /dev/null
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
deleted file mode 100644
index 8b7251b..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 36713ae..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 1c9e313..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 7b1b16f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 02dc258..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index 27417d8..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index f3a805c..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 8a8c3d9..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index fb2a6b6..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
deleted file mode 100644
index ca02605..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 2dcbe28..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index fe71893..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index a6c61ff..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index ba4a9d9..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 79c2ec1..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
deleted file mode 100644
index 4548617..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
deleted file mode 100644
index 3cc96ee..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
deleted file mode 100644
index 34ae3bf..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
deleted file mode 100644
index cb3623a..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
deleted file mode 100644
index 4f9a8b0..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 441de0c..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
deleted file mode 100644
index 34abc98..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
+++ /dev/null
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
deleted file mode 100644
index e303016..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png
+++ /dev/null
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
deleted file mode 100644
index abc9358..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png
+++ /dev/null
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
deleted file mode 100644
index f88e3a4..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png
+++ /dev/null
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
deleted file mode 100644
index 0419144..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png
+++ /dev/null
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
deleted file mode 100644
index 515ffe7..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png
+++ /dev/null
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
deleted file mode 100644
index 9aff8aa..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png
+++ /dev/null
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
deleted file mode 100644
index 118de2d..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png
+++ /dev/null
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
deleted file mode 100644
index 2e00303..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png
+++ /dev/null
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
deleted file mode 100644
index 33ae551..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index 2ef694e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.png
+++ /dev/null
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
deleted file mode 100644
index d6af953..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png
+++ /dev/null
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
deleted file mode 100644
index 2866e4c..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png
+++ /dev/null
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
deleted file mode 100644
index a702239..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png
+++ /dev/null
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
deleted file mode 100644
index 33e0310..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png
+++ /dev/null
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
deleted file mode 100644
index 922f7ca..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png
+++ /dev/null
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
deleted file mode 100644
index a857c32..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index 82ced1e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.png
+++ /dev/null
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
deleted file mode 100644
index 7ae8f90..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png
+++ /dev/null
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
deleted file mode 100644
index 050cbcb..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png
+++ /dev/null
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
deleted file mode 100644
index 7440bc0..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 4212e49..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.png
+++ /dev/null
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
deleted file mode 100644
index 2176a88..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png
+++ /dev/null
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
deleted file mode 100644
index fb09a26..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png
+++ /dev/null
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
deleted file mode 100644
index b52aec7..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png
+++ /dev/null
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
deleted file mode 100644
index 1664688..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
+++ /dev/null
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
deleted file mode 100644
index b38e3ef..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 9942e7a..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index f7571db..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png
+++ /dev/null
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
deleted file mode 100644
index 48650c7..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
+++ /dev/null
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
deleted file mode 100644
index c645859..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
+++ /dev/null
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
deleted file mode 100644
index 1efdebf..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png
+++ /dev/null
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
deleted file mode 100644
index 2afe504..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png
+++ /dev/null
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
deleted file mode 100644
index 715e60a..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png
+++ /dev/null
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
deleted file mode 100644
index ed7f5b9..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png
+++ /dev/null
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
deleted file mode 100644
index 8f1464b..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png
+++ /dev/null
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
deleted file mode 100644
index b32c676..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png
+++ /dev/null
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
deleted file mode 100644
index 6df8484..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png
+++ /dev/null
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
deleted file mode 100644
index d7915c6..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png
+++ /dev/null
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
deleted file mode 100644
index c3773d2..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png
+++ /dev/null
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
deleted file mode 100644
index 263d697..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png
+++ /dev/null
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
deleted file mode 100644
index 1664688..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
+++ /dev/null
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
deleted file mode 100644
index b38e3ef..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
+++ /dev/null
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
deleted file mode 100644
index b86f140..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.png
deleted file mode 100644
index 2afe504..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.png
+++ /dev/null
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
deleted file mode 100644
index c645859..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 2204093..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 9f5e4af..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index a95b9e1..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 42ad245..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index fde5323..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index c6cca3e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 84f5cb1..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index 5228c29..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png
deleted file mode 100644
index 659275f..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 17c0d99..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 8a5a476..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index a6c12b2..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 3fdc60e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index b09247e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png
deleted file mode 100644
index 3b94b6b..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
deleted file mode 100644
index e402ff6..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
deleted file mode 100644
index 313ce4e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
deleted file mode 100644
index 546c7a8..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
deleted file mode 100644
index ec45d86..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 459a1a2..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
deleted file mode 100644
index d6f752a..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.png
deleted file mode 100644
index 76f39c0..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.png
deleted file mode 100644
index 746b9ea..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.png
deleted file mode 100644
index 6706ae2..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.png
deleted file mode 100644
index 55ba5ab..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.png
deleted file mode 100644
index 547f875..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.png
deleted file mode 100644
index 4d1dc75..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.png
deleted file mode 100644
index 1f65ad5..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.png
deleted file mode 100644
index aab9d27..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.png
deleted file mode 100644
index cd92c5f..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index eb4b855..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index d8556b2..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index ed1f7c5..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index b913f6e..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 7a1de13..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index a4f4461..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index 7b3d06d..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index 7cdcdf4..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index c9bed1a..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index b9aca9a..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 25edf97..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 0dc66b4..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index b60cda6..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.png
deleted file mode 100644
index b686376..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.png
deleted file mode 100644
index bfe2271..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png
deleted file mode 100644
index 3725b3f..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png
deleted file mode 100644
index b72a274..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.png
deleted file mode 100644
index b5def3e..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 78fe964..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index 9755011..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png
deleted file mode 100644
index aa2de43..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.png
deleted file mode 100644
index 60e2bd3..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.png
deleted file mode 100644
index 1951654..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.png
deleted file mode 100644
index 01274a6..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.png
deleted file mode 100644
index a02832d..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.png
deleted file mode 100644
index 7e55bbb..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.png
deleted file mode 100644
index eeb8989..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.png
deleted file mode 100644
index f60d8a5..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.png
deleted file mode 100644
index ac88239..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.png
deleted file mode 100644
index 4a3c770..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.png
deleted file mode 100644
index b7e7d6f..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png
deleted file mode 100644
index 5b80893..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png
deleted file mode 100644
index 21b2118..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png
deleted file mode 100644
index 9bbb359..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.png
deleted file mode 100644
index 89c8fc1..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png
deleted file mode 100644
index 3f0447d..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index ba64922..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 5b57c1e..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 64b8b26..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 02e7411..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index 0a5dc61..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index 96a747c..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 46584bc..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index 1f8549e..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png
deleted file mode 100644
index 3c9d3e6..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 065f1da..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index da2da18..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index 30c5abf..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index e49fd0a..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index c5114e7..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png
deleted file mode 100644
index b388b8f..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
deleted file mode 100644
index bc272ed..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
deleted file mode 100644
index d032db3..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
deleted file mode 100644
index 562101b..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
deleted file mode 100644
index ceb4163..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 494b005..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
deleted file mode 100644
index 3da56ad..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_0.xml b/packages/SystemUI/res/drawable/ic_qs_signal_0.xml
new file mode 100644
index 0000000..f63dfb1
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_0.xml
@@ -0,0 +1,31 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_1.xml b/packages/SystemUI/res/drawable/ic_qs_signal_1.xml
new file mode 100644
index 0000000..adbda4a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_1.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml b/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml
new file mode 100644
index 0000000..71c40df
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="16.0dp"
+ android:height="32dp"
+ android:viewportWidth="12.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.600000,5.500000l1.200000,-3.000000l1.900000,0.000000L9.700000,6.700000l2.200000,4.300000L9.900000,11.000000L8.700000,7.900000L7.400000,11.000000L5.500000,11.000000l2.100000,-4.300000L5.600000,2.500000l1.900000,0.000000L8.600000,5.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_2.xml b/packages/SystemUI/res/drawable/ic_qs_signal_2.xml
new file mode 100644
index 0000000..3358d65
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_2.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.900000,10.000000l-11.900000,12.000000 11.900000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_3.xml b/packages/SystemUI/res/drawable/ic_qs_signal_3.xml
new file mode 100644
index 0000000..63838a9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_3.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,19.900000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,9.900000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.700001,7.200000l-14.700001,14.700000 14.700001,0.000000z"/>
+ <path
+ android:pathData="M17.700001,7.900000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml
new file mode 100644
index 0000000..e9a57ea
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="17.333334dp"
+ android:height="32dp"
+ android:viewportWidth="13.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.700000,9.000000 6.700000,7.900000L6.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000s-0.500000,-0.300000 -0.900000,-0.300000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S8.400000,5.000000 8.400000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.799999,7.800000L9.600000,7.800000L9.600000,6.600000l2.900000,0.000000L12.500000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4.xml
new file mode 100644
index 0000000..76690cc
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_4.xml
@@ -0,0 +1,31 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,22.000000l15.700001,0.000000 0.000000,-14.000000 4.299999,0.000000 0.000000,-6.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml
new file mode 100644
index 0000000..42045d1
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="16.0dp"
+ android:height="32dp"
+ android:viewportWidth="12.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.900000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.100000,9.000000 6.100000,7.900000L6.100000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000S8.100000,2.400000 9.000000,2.400000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S9.500000,3.700000 9.000000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S7.700000,5.000000 7.700000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.099999,7.800000L9.000000,7.800000L9.000000,6.600000l2.900000,0.000000L11.900000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml
new file mode 100644
index 0000000..4f253e3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M21.799999,22.299999l-1.199999,-1.299999 0.000000,0.000000 -9.600000,-10.000000 0.000000,0.000000 -6.400000,-6.700000 -1.300000,1.300000 6.400000,6.700000 -8.700000,8.700000 16.900000,0.000000 2.600000,2.700001z"/>
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M21.000000,1.000000l-8.600000,8.600000 8.600000,9.100000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_e.xml b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
new file mode 100644
index 0000000..e49a409
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="6.6666665dp"
+ android:height="32dp"
+ android:viewportWidth="5.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml
new file mode 100644
index 0000000..326373d
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml
new file mode 100644
index 0000000..a71e33a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml
new file mode 100644
index 0000000..bf19a71
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml
new file mode 100644
index 0000000..01839e85
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml
new file mode 100644
index 0000000..48151ad
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
new file mode 100644
index 0000000..9d42a44
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.333333dp"
+ android:height="32dp"
+ android:viewportWidth="7.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_h.xml b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
new file mode 100644
index 0000000..f509d71
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="8.0dp"
+ android:height="32dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_in.xml b/packages/SystemUI/res/drawable/ic_qs_signal_in.xml
new file mode 100644
index 0000000..236fdac
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_in.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="6.0dp"
+ android:height="32dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.000000,15.700000l-3.000000,5.599999 -3.000000,-5.599999z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml b/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml
new file mode 100644
index 0000000..b7242e6
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="17.333334dp"
+ android:height="32dp"
+ android:viewportWidth="13.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.300000,3.800000L7.000000,3.800000L7.000000,11.000000L5.300000,11.000000L5.300000,3.800000L4.000000,3.800000L4.000000,2.500000l4.300000,0.000000L8.300000,3.800000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12.400000,7.300000l-1.700000,0.000000l0.000000,2.400000l2.100000,0.000000L12.799999,11.000000L9.000000,11.000000L9.000000,2.500000l3.700000,0.000000l0.000000,1.300000l-2.100000,0.000000l0.000000,2.100000l1.700000,0.000000L12.300000,7.300000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml b/packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml
new file mode 100644
index 0000000..f7fd97c
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000L22.000000,2.000000L2.000000,22.000000zM20.000000,20.000000L6.800000,20.000000L20.000000,6.800000L20.000000,20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_out.xml b/packages/SystemUI/res/drawable/ic_qs_signal_out.xml
new file mode 100644
index 0000000..c510972
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_out.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="6.0dp"
+ android:height="32dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M0.000000,13.700000l3.000000,-5.700000 3.000000,5.700000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_r.xml b/packages/SystemUI/res/drawable/ic_qs_signal_r.xml
new file mode 100644
index 0000000..66f64c9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_r.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="8.0dp"
+ android:height="32dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.800000,7.900000l-1.000000,0.000000L1.800000,11.000000L0.200000,11.000000L0.200000,2.500000l2.700000,0.000000c0.900000,0.000000 1.500000,0.200000 2.000000,0.700000s0.700000,1.100000 0.700000,1.900000c0.000000,0.600000 -0.100000,1.100000 -0.300000,1.500000S4.800000,7.200000 4.400000,7.400000l1.500000,3.500000L5.900000,11.000000L4.100000,11.000000L2.800000,7.900000zM1.800000,6.500000l1.100000,0.000000c0.400000,0.000000 0.600000,-0.100000 0.800000,-0.400000S4.000000,5.600000 4.000000,5.200000c0.000000,-0.400000 -0.100000,-0.800000 -0.300000,-1.000000S3.300000,3.800000 2.900000,3.800000L1.800000,3.800000L1.800000,6.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_0.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_0.xml
new file mode 100644
index 0000000..50c427e
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_0.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.200000,-1.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_1.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_1.xml
new file mode 100644
index 0000000..a2d11a0
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_1.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_2.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_2.xml
new file mode 100644
index 0000000..f2043fc
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_2.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,11.600000c-1.300000,-0.700000 -3.400000,-1.600000 -6.000000,-1.600000c-4.400000,0.000000 -7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,11.600000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_3.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_3.xml
new file mode 100644
index 0000000..b7a4f4c
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_3.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,8.600000c-1.600000,-0.700000 -3.600000,-1.300000 -6.000000,-1.300000c-5.300000,0.000000 -8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.600000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_4.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_4.xml
new file mode 100644
index 0000000..35a9138
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_4.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml
new file mode 100644
index 0000000..c505783
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M17.500000,16.500000L5.800000,3.400000c0.000000,0.000000 0.000000,0.000000 0.000000,0.000000l-2.700000,-3.000000L1.600000,1.800000l2.200000,2.500000c-2.000000,1.000000 -3.200000,2.000000 -3.400000,2.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l3.200000,-3.900000l2.400000,2.700000l1.500000,-1.400000L17.500000,16.500000L17.500000,16.500000z"/>
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000c-1.900000,0.000000 -3.600000,0.300000 -5.200000,0.700000L18.700001,15.000000L25.600000,6.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml
new file mode 100644
index 0000000..1bc7438
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml
new file mode 100644
index 0000000..5856115
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.100000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.500000,6.500000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.100000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml
new file mode 100644
index 0000000..4a5e1f8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l7.600000,-9.400000C20.299999,12.400000 17.400000,10.000000 13.000000,10.000000s-7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml
new file mode 100644
index 0000000..965442d
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l9.200000,-11.400000c-0.400000,-0.300000 -3.900000,-3.200000 -9.200000,-3.200000s-8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml
new file mode 100644
index 0000000..b29d3f9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml
new file mode 100644
index 0000000..3d58869
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,2.000000C7.700000,2.000000 3.700000,3.900000 0.400000,6.400000L13.000000,22.000000L25.600000,6.500000C22.299999,4.000000 18.299999,2.000000 13.000000,2.000000zM13.000000,18.600000L3.300000,7.000000l0.000000,0.000000l0.000000,0.000000C6.000000,5.300000 8.700000,4.000000 13.000000,4.000000s7.000000,1.400000 9.700000,3.000000l0.000000,0.000000l0.000000,0.000000L13.000000,18.600000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml
new file mode 100644
index 0000000..26d2632
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.0dp"
+ android:height="18dp"
+ android:viewportWidth="12.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.600000,5.500000l1.200000,-3.000000l1.900000,0.000000L9.700000,6.700000l2.200000,4.300000L9.900000,11.000000L8.700000,7.900000L7.400000,11.000000L5.500000,11.000000l2.100000,-4.300000L5.600000,2.500000l1.900000,0.000000L8.600000,5.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml
new file mode 100644
index 0000000..5aaf93b
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.75dp"
+ android:height="18dp"
+ android:viewportWidth="13.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.700000,9.000000 6.700000,7.900000L6.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000s-0.500000,-0.300000 -0.900000,-0.300000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S8.400000,5.000000 8.400000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.799999,7.800000L9.600000,7.800000L9.600000,6.600000l2.900000,0.000000L12.500000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml
new file mode 100644
index 0000000..b7d84f0
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.0dp"
+ android:height="18dp"
+ android:viewportWidth="12.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.900000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.100000,9.000000 6.100000,7.900000L6.100000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000S8.100000,2.400000 9.000000,2.400000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S9.500000,3.700000 9.000000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S7.700000,5.000000 7.700000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.099999,7.800000L9.000000,7.800000L9.000000,6.600000l2.900000,0.000000L11.900000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml
new file mode 100644
index 0000000..7111457
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="3.75dp"
+ android:height="18dp"
+ android:viewportWidth="5.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml
new file mode 100644
index 0000000..97962b2
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="5.25dp"
+ android:height="18dp"
+ android:viewportWidth="7.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml
new file mode 100644
index 0000000..4859c14
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="4.5dp"
+ android:height="18dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml
new file mode 100644
index 0000000..d6446db
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.75dp"
+ android:height="18dp"
+ android:viewportWidth="13.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.300000,3.800000L7.000000,3.800000L7.000000,11.000000L5.300000,11.000000L5.300000,3.800000L4.000000,3.800000L4.000000,2.500000l4.300000,0.000000L8.300000,3.800000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12.400000,7.300000l-1.700000,0.000000l0.000000,2.400000l2.100000,0.000000L12.799999,11.000000L9.000000,11.000000L9.000000,2.500000l3.700000,0.000000l0.000000,1.300000l-2.100000,0.000000l0.000000,2.100000l1.700000,0.000000L12.300000,7.300000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml
new file mode 100644
index 0000000..7f7d5fc
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="4.5dp"
+ android:height="18dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.800000,7.900000l-1.000000,0.000000L1.800000,11.000000L0.200000,11.000000L0.200000,2.500000l2.700000,0.000000c0.900000,0.000000 1.500000,0.200000 2.000000,0.700000s0.700000,1.100000 0.700000,1.900000c0.000000,0.600000 -0.100000,1.100000 -0.300000,1.500000S4.800000,7.200000 4.400000,7.400000l1.500000,3.500000L5.900000,11.000000L4.100000,11.000000L2.800000,7.900000zM1.800000,6.500000l1.100000,0.000000c0.400000,0.000000 0.600000,-0.100000 0.800000,-0.400000S4.000000,5.600000 4.000000,5.200000c0.000000,-0.400000 -0.100000,-0.800000 -0.300000,-1.000000S3.300000,3.800000 2.900000,3.800000L1.800000,3.800000L1.800000,6.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0.xml
new file mode 100644
index 0000000..67d9259
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_0.xml
@@ -0,0 +1,31 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml
new file mode 100644
index 0000000..3bbb800
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1.xml
new file mode 100644
index 0000000..55f764a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_1.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml
new file mode 100644
index 0000000..b82e428
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2.xml
new file mode 100644
index 0000000..ca0eeb3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_2.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.900000,10.000000l-11.900000,12.000000 11.900000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml
new file mode 100644
index 0000000..abc8dd1
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3.xml
new file mode 100644
index 0000000..2b3e571
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_3.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,19.900000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,9.900000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.700001,7.200000l-14.700001,14.700000 14.700001,0.000000z"/>
+ <path
+ android:pathData="M17.700001,7.900000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml
new file mode 100644
index 0000000..d47f167
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4.xml
new file mode 100644
index 0000000..7d4dd8a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_4.xml
@@ -0,0 +1,31 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,22.000000l15.700001,0.000000 0.000000,-14.000000 4.299999,0.000000 0.000000,-6.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml
new file mode 100644
index 0000000..5b1bac3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_null.xml b/packages/SystemUI/res/drawable/stat_sys_signal_null.xml
new file mode 100644
index 0000000..45d34a2
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_null.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000L22.000000,2.000000L2.000000,22.000000zM20.000000,20.000000L6.800000,20.000000L20.000000,6.800000L20.000000,20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml
new file mode 100644
index 0000000..4965674
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.200000,-1.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml
new file mode 100644
index 0000000..e9cad0e
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml
new file mode 100644
index 0000000..7d588a3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml
new file mode 100644
index 0000000..348f963
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.100000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.500000,6.500000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.100000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml
new file mode 100644
index 0000000..4fbdd69
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,11.600000c-1.300000,-0.700000 -3.400000,-1.600000 -6.000000,-1.600000c-4.400000,0.000000 -7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,11.600000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml
new file mode 100644
index 0000000..66588f0
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l7.600000,-9.400000C20.299999,12.400000 17.400000,10.000000 13.000000,10.000000s-7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml
new file mode 100644
index 0000000..1f3de74
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,8.600000c-1.600000,-0.700000 -3.600000,-1.300000 -6.000000,-1.300000c-5.300000,0.000000 -8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.600000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml
new file mode 100644
index 0000000..aa5d2ed
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l9.200000,-11.400000c-0.400000,-0.300000 -3.900000,-3.200000 -9.200000,-3.200000s-8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml
new file mode 100644
index 0000000..ca53b56
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml
new file mode 100644
index 0000000..1c7a539
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml
new file mode 100644
index 0000000..c68fb49
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,2.000000C7.700000,2.000000 3.700000,3.900000 0.400000,6.400000L13.000000,22.000000L25.600000,6.500000C22.299999,4.000000 18.299999,2.000000 13.000000,2.000000zM13.000000,18.600000L3.300000,7.000000l0.000000,0.000000l0.000000,0.000000C6.000000,5.300000 8.700000,4.000000 13.000000,4.000000s7.000000,1.400000 9.700000,3.000000l0.000000,0.000000l0.000000,0.000000L13.000000,18.600000z"/>
+</vector>
diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml
index 2b9cef91..ae54f8c 100644
--- a/packages/SystemUI/res/layout/signal_cluster_view.xml
+++ b/packages/SystemUI/res/layout/signal_cluster_view.xml
@@ -17,27 +17,23 @@
** limitations under the License.
*/
-->
-
+<!-- extends LinearLayout -->
<com.android.systemui.statusbar.SignalClusterView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="wrap_content"
- android:gravity="center"
+ android:gravity="center_vertical"
android:orientation="horizontal"
>
<FrameLayout
android:id="@+id/wifi_combo"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:layout_marginEnd="-6dp"
>
<ImageView
android:id="@+id/wifi_signal"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
- android:scaleType="center"
/>
</FrameLayout>
<View
@@ -46,22 +42,6 @@
android:visibility="gone"
android:id="@+id/spacer"
/>
- <!--<FrameLayout
- android:id="@+id/wimax_combo"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginEnd="-6dp"
- >
- <ImageView
- android:id="@+id/wimax_signal"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
- android:scaleType="center"
- />
- </FrameLayout>
- -->
<FrameLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 32474c9..32425ad 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -201,8 +201,8 @@
<!-- The min translation in the Z index for the last task. -->
<dimen name="recents_task_view_z_min">5dp</dimen>
- <!-- The translation in the Z index for each task above the last task. -->
- <dimen name="recents_task_view_z_increment">10dp</dimen>
+ <!-- The max translation in the Z index for the last task. -->
+ <dimen name="recents_task_view_z_max">65dp</dimen>
<!-- The amount to translate when animating the removal of a task. -->
<dimen name="recents_task_view_remove_anim_translation_x">100dp</dimen>
@@ -395,4 +395,8 @@
<!-- Margin on the left side of the battery % when on Keyguard. -->
<dimen name="header_battery_margin_keyguard">6dp</dimen>
+
+ <!-- Additional translation (downwards) for appearing notifications when going to the full shade
+ from Keyguard. -->
+ <dimen name="go_to_full_shade_appearing_translation">200dp</dimen>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
index aa32e9c..5f2c348 100644
--- a/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
+++ b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
@@ -6,6 +6,7 @@ option java_package com.android.systemui;
# PhoneStatusBar.java
# ---------------------------
36000 sysui_statusbar_touch (type|1),(x|1),(y|1),(enabled|1)
+36001 sysui_heads_up_status (key|3),(visible|1)
# ---------------------------
# PhoneStatusBarView.java
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 4901f40..d216069 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -95,7 +95,7 @@ public class QSPanel extends ViewGroup {
mDetailDoneButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- showDetail(false, mDetailRecord);
+ closeDetail();
}
});
}
@@ -134,7 +134,7 @@ public class QSPanel extends ViewGroup {
if (mExpanded == expanded) return;
mExpanded = expanded;
if (!mExpanded) {
- showDetail(false /*show*/, mDetailRecord);
+ closeDetail();
}
}
@@ -226,6 +226,14 @@ public class QSPanel extends ViewGroup {
addView(r.tileView);
}
+ public boolean isShowingDetail() {
+ return mDetailRecord != null;
+ }
+
+ public void closeDetail() {
+ showDetail(false, mDetailRecord);
+ }
+
private void handleShowDetail(Record r, boolean show) {
if (r instanceof TileRecord) {
handleShowDetailTile((TileRecord) r, show);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java
index d9447f7..1a555f1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java
@@ -18,8 +18,6 @@ package com.android.systemui.qs;
import android.animation.ValueAnimator;
import android.content.Context;
-import android.graphics.ColorFilter;
-import android.graphics.LightingColorFilter;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
@@ -31,7 +29,6 @@ import com.android.systemui.qs.QSTile.SignalState;
public final class SignalTileView extends QSTileView {
private static final long DEFAULT_DURATION = new ValueAnimator().getDuration();
private static final long SHORT_DURATION = DEFAULT_DURATION / 3;
- private static final ColorFilter FILTER = new LightingColorFilter(0xffffffff, 0xff283034);
private FrameLayout mIconFrame;
private ImageView mSignal;
@@ -49,7 +46,6 @@ public final class SignalTileView extends QSTileView {
private ImageView addTrafficView(int icon) {
final ImageView traffic = new ImageView(mContext);
traffic.setImageResource(icon);
- traffic.setColorFilter(FILTER);
traffic.setAlpha(0f);
addView(traffic);
return traffic;
@@ -61,7 +57,7 @@ public final class SignalTileView extends QSTileView {
mSignal = new ImageView(mContext);
mIconFrame.addView(mSignal);
mOverlay = new ImageView(mContext);
- mIconFrame.addView(mOverlay);
+ mIconFrame.addView(mOverlay, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
return mIconFrame;
}
@@ -95,12 +91,10 @@ public final class SignalTileView extends QSTileView {
final SignalState s = (SignalState) state;
mSignal.setImageDrawable(null); // force refresh
mSignal.setImageResource(s.iconId);
- mSignal.setColorFilter(s.filter ? FILTER : null);
if (s.overlayIconId > 0) {
mOverlay.setVisibility(VISIBLE);
mOverlay.setImageDrawable(null); // force refresh
mOverlay.setImageResource(s.overlayIconId);
- mOverlay.setColorFilter(s.filter ? FILTER : null);
} else {
mOverlay.setVisibility(GONE);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index 42da282..ce42d47 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -91,10 +91,9 @@ public class CellularTile extends QSTile<QSTile.SignalState> {
if (cb == null) return;
final Resources r = mContext.getResources();
- state.iconId = cb.noSim
- ? R.drawable.stat_sys_no_sim
- : cb.enabled && (cb.mobileSignalIconId > 0) && !cb.airplaneModeEnabled
- ? cb.mobileSignalIconId
+ state.iconId = cb.noSim ? R.drawable.stat_sys_no_sim
+ : !cb.enabled || cb.airplaneModeEnabled ? R.drawable.ic_qs_signal_disabled
+ : cb.mobileSignalIconId > 0 ? cb.mobileSignalIconId
: R.drawable.ic_qs_signal_no_signal;
state.overlayIconId = cb.enabled && (cb.dataTypeIconId > 0) && !cb.wifiConnected
? cb.dataTypeIconId
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 1707b32..5651d49 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -113,7 +113,11 @@ public class WifiTile extends QSTile<QSTile.SignalState> {
state.filter = true;
final String signalContentDescription;
final Resources r = mContext.getResources();
- if (wifiConnected) {
+ if (!state.enabled) {
+ state.iconId = R.drawable.ic_qs_wifi_disabled;
+ state.label = r.getString(R.string.quick_settings_wifi_label);
+ signalContentDescription = r.getString(R.string.accessibility_wifi_off);
+ } else if (wifiConnected) {
state.iconId = cb.wifiSignalIconId;
state.label = removeDoubleQuotes(cb.enabledDesc);
signalContentDescription = cb.wifiSignalContentDescription;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
index cbcacc4..0b08b93 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
@@ -105,7 +105,8 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta
}
public void onStart() {
- // Do nothing
+ // Initialize some static datastructures
+ TaskStackViewLayoutAlgorithm.initializeCurve();
}
public void onBootCompleted() {
@@ -322,7 +323,7 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta
Rect taskStackBounds = new Rect(mTaskStackBounds);
taskStackBounds.bottom -= mSystemInsets.bottom;
tsv.computeRects(mWindowRect.width(), mWindowRect.height(), taskStackBounds);
- tsv.setStackScrollToInitialState();
+ tsv.getScroller().setStackScrollToInitialState();
// Find the running task in the TaskStack
Task task = null;
@@ -344,7 +345,7 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta
}
// Get the transform for the running task
- mTmpTransform = algo.getStackTransform(task, tsv.getStackScroll(), mTmpTransform);
+ mTmpTransform = algo.getStackTransform(task, tsv.getScroller().getStackScroll(), mTmpTransform, null);
return new Rect(mTmpTransform.rect);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
index c49e244..3d4d6c4 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
@@ -25,8 +25,6 @@ public class Constants {
public static final boolean Verbose = false;
public static class App {
- // Enables the simulated task affiliations
- public static final boolean EnableSimulatedTaskGroups = false;
// Enables the screenshot app->Recents transition
public static final boolean EnableScreenshotAppTransition = false;
// Enables the filtering of tasks according to their grouping
@@ -43,11 +41,15 @@ public class Constants {
public static final boolean EnableShadows = true;
// This disables the bitmap and icon caches
public static final boolean DisableBackgroundCache = false;
- // For debugging, this enables us to create mock recents tasks
+ // Enables the simulated task affiliations
+ public static final boolean EnableSimulatedTaskGroups = false;
+ // Defines the number of mock task affiliations per group
+ public static final int TaskAffiliationsGroupCount = 12;
+ // Enables us to create mock recents tasks
public static final boolean EnableSystemServicesProxy = false;
- // For debugging, this defines the number of mock recents packages to create
+ // Defines the number of mock recents packages to create
public static final int SystemServicesProxyMockPackageCount = 3;
- // For debugging, this defines the number of mock recents tasks to create
+ // Defines the number of mock recents tasks to create
public static final int SystemServicesProxyMockTaskCount = 100;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index 4534897..75fbad8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -383,9 +383,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
registerReceiver(mSystemBroadcastReceiver, filter);
- // Register any broadcast receivers for the task loader
- RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
-
// Private API calls to make the shadows look better
try {
Utilities.setShadowProperty("ambientShadowStrength", String.valueOf(35f));
@@ -451,6 +448,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
filter.addAction(ACTION_TOGGLE_RECENTS_ACTIVITY);
filter.addAction(ACTION_START_ENTER_ANIMATION);
registerReceiver(mServiceBroadcastReceiver, filter);
+
+ // Register any broadcast receivers for the task loader
+ RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
}
@Override
@@ -481,9 +481,15 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
protected void onStop() {
super.onStop();
+ // Remove all the views
+ mRecentsView.removeAllTaskStacks();
+
// Unregister the RecentsService receiver
unregisterReceiver(mServiceBroadcastReceiver);
+ // Unregister any broadcast receivers for the task loader
+ RecentsTaskLoader.getInstance().unregisterReceivers();
+
// Stop listening for widget package changes if there was one bound
if (mAppWidgetHost.isListening()) {
mAppWidgetHost.stopListening();
@@ -496,7 +502,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
// Unregister the system broadcast receivers
unregisterReceiver(mSystemBroadcastReceiver);
- RecentsTaskLoader.getInstance().unregisterReceivers();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
index fbcbe2c..cf0a1dc 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
@@ -76,7 +76,7 @@ public class RecentsConfiguration {
public int taskViewRemoveAnimDuration;
public int taskViewRemoveAnimTranslationXPx;
public int taskViewTranslationZMinPx;
- public int taskViewTranslationZIncrementPx;
+ public int taskViewTranslationZMaxPx;
public int taskViewRoundedCornerRadiusPx;
public int taskViewHighlightPx;
public int taskViewAffiliateGroupEnterOffsetPx;
@@ -208,8 +208,7 @@ public class RecentsConfiguration {
res.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius);
taskViewHighlightPx = res.getDimensionPixelSize(R.dimen.recents_task_view_highlight);
taskViewTranslationZMinPx = res.getDimensionPixelSize(R.dimen.recents_task_view_z_min);
- taskViewTranslationZIncrementPx =
- res.getDimensionPixelSize(R.dimen.recents_task_view_z_increment);
+ taskViewTranslationZMaxPx = res.getDimensionPixelSize(R.dimen.recents_task_view_z_max);
taskViewAffiliateGroupEnterOffsetPx =
res.getDimensionPixelSize(R.dimen.recents_task_view_affiliate_group_enter_offset);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
index 04ee9dd..fd6303f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
@@ -337,7 +337,7 @@ public class TaskStack {
String prevPackage = "";
int prevAffiliation = -1;
Random r = new Random();
- int groupCountDown = 5;
+ int groupCountDown = Constants.DebugFlags.App.TaskAffiliationsGroupCount;
for (int i = 0; i < taskCount; i++) {
Task t = tasks.get(i);
String packageName = t.key.baseIntent.getComponent().getPackageName();
@@ -352,7 +352,7 @@ public class TaskStack {
addGroup(group);
prevAffiliation = affiliation;
prevPackage = packageName;
- groupCountDown = 5;
+ groupCountDown = Constants.DebugFlags.App.TaskAffiliationsGroupCount;
}
group.addTask(t);
taskMap.put(t.key, t);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java b/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java
index 4c3fbf0..452830d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java
@@ -26,6 +26,7 @@ import android.view.View;
import android.widget.FrameLayout;
import android.widget.SeekBar;
import com.android.systemui.R;
+import com.android.systemui.recents.RecentsConfiguration;
import java.util.ArrayList;
@@ -42,11 +43,14 @@ public class DebugOverlayView extends FrameLayout implements SeekBar.OnSeekBarCh
final static int sCornerRectSize = 50;
+ RecentsConfiguration mConfig;
DebugOverlayViewCallbacks mCb;
ArrayList<Pair<Rect, Integer>> mRects = new ArrayList<Pair<Rect, Integer>>();
+ String mText;
Paint mDebugOutline = new Paint();
Paint mTmpPaint = new Paint();
+ Rect mTmpRect = new Rect();
boolean mEnabled = true;
SeekBar mPrimarySeekBar;
@@ -66,6 +70,7 @@ public class DebugOverlayView extends FrameLayout implements SeekBar.OnSeekBarCh
public DebugOverlayView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
+ mConfig = RecentsConfiguration.getInstance();
mDebugOutline.setColor(0xFFff0000);
mDebugOutline.setStyle(Paint.Style.STROKE);
mDebugOutline.setStrokeWidth(8f);
@@ -124,6 +129,12 @@ public class DebugOverlayView extends FrameLayout implements SeekBar.OnSeekBarCh
invalidate();
}
+ /** Sets the debug text at the bottom of the screen. */
+ void setText(String message) {
+ mText = message;
+ invalidate();
+ }
+
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
@@ -145,6 +156,14 @@ public class DebugOverlayView extends FrameLayout implements SeekBar.OnSeekBarCh
mTmpPaint.setColor(r.second);
canvas.drawRect(r.first, mTmpPaint);
}
+
+ // Draw the text
+ if (mText != null && mText.length() > 0) {
+ mTmpPaint.setColor(0xFFff0000);
+ mTmpPaint.setTextSize(60);
+ mTmpPaint.getTextBounds(mText, 0, 1, mTmpRect);
+ canvas.drawText(mText, 10f, getMeasuredHeight() - mTmpRect.height() - mConfig.systemInsets.bottom, mTmpPaint);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 189578c..1a32b81 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -121,6 +121,17 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
}
}
+ /** Removes all the task stack views from this recents view. */
+ public void removeAllTaskStacks() {
+ int childCount = getChildCount();
+ for (int i = childCount - 1; i >= 0; i--) {
+ View child = getChildAt(i);
+ if (child != mSearchBar) {
+ removeViewAt(i);
+ }
+ }
+ }
+
/** Launches the focused task from the first stack if possible */
public boolean launchFocusedTask() {
// Get the first stack view
@@ -225,6 +236,8 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
public void setSearchBarVisibility(int visibility) {
if (mSearchBar != null) {
mSearchBar.setVisibility(visibility);
+ // Always bring the search bar to the top
+ mSearchBar.bringToFront();
}
}
@@ -364,17 +377,17 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
View sourceView = tv;
int offsetX = 0;
int offsetY = 0;
- int stackScroll = stackView.getStackScroll();
+ float stackScroll = stackView.getScroller().getStackScroll();
if (tv == null) {
// If there is no actual task view, then use the stack view as the source view
// and then offset to the expected transform rect, but bound this to just
// outside the display rect (to ensure we don't animate from too far away)
sourceView = stackView;
- transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform);
+ transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform, null);
offsetX = transform.rect.left;
offsetY = Math.min(transform.rect.top, mConfig.displayRect.height());
} else {
- transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform);
+ transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform, null);
}
// Compute the thumbnail to scale up from
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java
index 492e3aa..90bf12f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java
@@ -126,28 +126,6 @@ class TaskBarView extends FrameLayout {
mIsFullscreen = isFullscreen;
}
- /** Synchronizes this bar view's properties with the task's transform */
- void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration) {
- if (duration > 0 && (mDismissButton.getVisibility() == View.VISIBLE)) {
- ViewPropertyAnimator anim = mDismissButton.animate();
-
- // Animate to the final state
- if (toTransform.hasDismissAlphaChangedFrom(mDismissButton.getAlpha())) {
- anim.alpha(toTransform.dismissAlpha)
- .setStartDelay(0)
- .setDuration(duration)
- .setInterpolator(mConfig.fastOutSlowInInterpolator)
- .withLayer()
- .start();
- }
- } else {
- // Set the changed properties
- if (toTransform.hasDismissAlphaChangedFrom(mDismissButton.getAlpha())) {
- mDismissButton.setAlpha(toTransform.dismissAlpha);
- }
- }
- }
-
@Override
public boolean hasOverlappingRendering() {
return false;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index aa67c1e..986df91 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -16,25 +16,17 @@
package com.android.systemui.recents.views;
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
import android.content.ComponentName;
import android.content.Context;
-import android.graphics.Canvas;
import android.graphics.Rect;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
-import android.widget.OverScroller;
import com.android.systemui.R;
import com.android.systemui.recents.Constants;
import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.misc.DozeTrigger;
-import com.android.systemui.recents.misc.ReferenceCountedTrigger;
-import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.RecentsPackageMonitor;
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.recents.model.Task;
@@ -47,8 +39,8 @@ import java.util.HashSet;
/* The visual representation of a task stack view */
public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCallbacks,
- TaskView.TaskViewCallbacks, ViewPool.ViewPoolConsumer<TaskView, Task>,
- RecentsPackageMonitor.PackageCallbacks {
+ TaskView.TaskViewCallbacks, TaskStackViewScroller.TaskStackViewScrollerCallbacks,
+ ViewPool.ViewPoolConsumer<TaskView, Task>, RecentsPackageMonitor.PackageCallbacks {
/** The TaskView callbacks */
interface TaskStackViewCallbacks {
@@ -64,8 +56,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
RecentsConfiguration mConfig;
TaskStack mStack;
- TaskStackViewLayoutAlgorithm mStackAlgorithm;
+ TaskStackViewLayoutAlgorithm mLayoutAlgorithm;
TaskStackViewFilterAlgorithm mFilterAlgorithm;
+ TaskStackViewScroller mStackScroller;
TaskStackViewTouchHandler mTouchHandler;
TaskStackViewCallbacks mCb;
ViewPool<TaskView, Task> mViewPool;
@@ -73,18 +66,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
DozeTrigger mUIDozeTrigger;
DebugOverlayView mDebugOverlay;
Rect mTaskStackBounds = new Rect();
-
- // The virtual stack scroll that we use for the card layout
- int mStackScroll;
- int mMinScroll;
- int mMaxScroll;
- int mStashedScroll;
int mFocusedTaskIndex = -1;
- OverScroller mScroller;
- ObjectAnimator mScrollAnimator;
// Optimizations
- ReferenceCountedTrigger mHwLayersTrigger;
int mStackViewsAnimationDuration;
boolean mStackViewsDirty = true;
boolean mAwaitingFirstLayout = true;
@@ -114,12 +98,13 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
mConfig = RecentsConfiguration.getInstance();
mStack = stack;
mStack.setCallbacks(this);
- mScroller = new OverScroller(context);
- mTouchHandler = new TaskStackViewTouchHandler(context, this);
mViewPool = new ViewPool<TaskView, Task>(context, this);
mInflater = LayoutInflater.from(context);
- mStackAlgorithm = new TaskStackViewLayoutAlgorithm(mConfig);
+ mLayoutAlgorithm = new TaskStackViewLayoutAlgorithm(mConfig);
mFilterAlgorithm = new TaskStackViewFilterAlgorithm(mConfig, this, mViewPool);
+ mStackScroller = new TaskStackViewScroller(context, mConfig, mLayoutAlgorithm);
+ mStackScroller.setCallbacks(this);
+ mTouchHandler = new TaskStackViewTouchHandler(context, this, mStackScroller);
mUIDozeTrigger = new DozeTrigger(mConfig.taskBarDismissDozeDelaySeconds, new Runnable() {
@Override
public void run() {
@@ -149,7 +134,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
}
void requestSynchronizeStackViewsWithModel(int duration) {
if (!mStackViewsDirty) {
- invalidate(mStackAlgorithm.mStackRect);
+ invalidate();
mStackViewsDirty = true;
}
if (mAwaitingFirstLayout) {
@@ -174,7 +159,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
/** Returns the stack algorithm for this task stack. */
public TaskStackViewLayoutAlgorithm getStackAlgorithm() {
- return mStackAlgorithm;
+ return mLayoutAlgorithm;
}
/**
@@ -182,7 +167,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
*/
private boolean updateStackTransforms(ArrayList<TaskViewTransform> taskTransforms,
ArrayList<Task> tasks,
- int stackScroll,
+ float stackScroll,
int[] visibleRangeOut,
boolean boundTranslationsToRect) {
// XXX: We should be intelligent about where to look for the visible stack range using the
@@ -207,8 +192,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
}
// Update the stack transforms
+ TaskViewTransform prevTransform = null;
for (int i = taskCount - 1; i >= 0; i--) {
- TaskViewTransform transform = mStackAlgorithm.getStackTransform(tasks.get(i), stackScroll, taskTransforms.get(i));
+ TaskViewTransform transform = mLayoutAlgorithm.getStackTransform(tasks.get(i),
+ stackScroll, taskTransforms.get(i), prevTransform);
if (transform.visible) {
if (frontMostVisibleIndex < 0) {
frontMostVisibleIndex = i;
@@ -228,8 +215,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (boundTranslationsToRect) {
transform.translationY = Math.min(transform.translationY,
- mStackAlgorithm.mViewRect.bottom);
+ mLayoutAlgorithm.mViewRect.bottom);
}
+ prevTransform = transform;
}
if (visibleRangeOut != null) {
visibleRangeOut[0] = frontMostVisibleIndex;
@@ -243,7 +231,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
* call is less optimal than calling updateStackTransforms directly.
*/
private ArrayList<TaskViewTransform> getStackTransforms(ArrayList<Task> tasks,
- int stackScroll,
+ float stackScroll,
int[] visibleRangeOut,
boolean boundTranslationsToRect) {
ArrayList<TaskViewTransform> taskTransforms = new ArrayList<TaskViewTransform>();
@@ -257,9 +245,13 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (mStackViewsDirty) {
// Get all the task transforms
ArrayList<Task> tasks = mStack.getTasks();
- int stackScroll = getStackScroll();
+ float stackScroll = mStackScroller.getStackScroll();
int[] visibleRange = mTmpVisibleRange;
- boolean isValidVisibleRange = updateStackTransforms(mCurrentTaskTransforms, tasks, stackScroll, visibleRange, false);
+ boolean isValidVisibleRange = updateStackTransforms(mCurrentTaskTransforms, tasks,
+ stackScroll, visibleRange, false);
+ if (mDebugOverlay != null) {
+ mDebugOverlay.setText("vis[" + visibleRange[1] + "-" + visibleRange[0] + "]");
+ }
// Return all the invisible children to the pool
mTmpTaskViewMap.clear();
@@ -288,11 +280,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (mStackViewsAnimationDuration > 0) {
// For items in the list, put them in start animating them from the
// approriate ends of the list where they are expected to appear
- if (transform.t < 0) {
- mTmpTransform = mStackAlgorithm.getStackTransform(tasks.get(0), stackScroll, mTmpTransform);
+ if (Float.compare(transform.p, 0f) <= 0) {
+ mLayoutAlgorithm.getStackTransform(0f, 0f, mTmpTransform, null);
} else {
- int nextTaskStackScroll = mStackAlgorithm.getStackScrollForTaskIndex(task, 1);
- mStackAlgorithm.getStackTransform(nextTaskStackScroll, stackScroll, mTmpTransform);
+ mLayoutAlgorithm.getStackTransform(1f, 0f, mTmpTransform, null);
}
tv.updateViewPropertiesToTaskTransform(mTmpTransform, 0);
}
@@ -357,143 +348,22 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
mTaskStackBounds.set(r);
}
- /** Sets the current stack scroll */
- public void setStackScroll(int value) {
- mStackScroll = value;
- mUIDozeTrigger.poke();
- requestSynchronizeStackViewsWithModel();
- }
-
- /** Sets the current stack scroll without synchronizing the stack view with the model */
- public void setStackScrollRaw(int value) {
- mStackScroll = value;
- mUIDozeTrigger.poke();
- }
- /** Sets the current stack scroll to the initial state when you first enter recents */
- public void setStackScrollToInitialState() {
- setStackScroll(getInitialStackScroll());
- }
- /** Computes the initial stack scroll for the stack. */
- int getInitialStackScroll() {
- if (mStack.getTaskCount() > 2) {
- return Math.max(mMinScroll, mMaxScroll - (int) (mStackAlgorithm.mTaskRect.height() * (3f/4f)));
- }
- return mMaxScroll;
- }
-
- /** Gets the current stack scroll */
- public int getStackScroll() {
- return mStackScroll;
- }
-
- /** Animates the stack scroll into bounds */
- ObjectAnimator animateBoundScroll() {
- int curScroll = getStackScroll();
- int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, curScroll));
- if (newScroll != curScroll) {
- // Start a new scroll animation
- animateScroll(curScroll, newScroll, null);
- }
- return mScrollAnimator;
- }
-
- /** Animates the stack scroll */
- void animateScroll(int curScroll, int newScroll, final Runnable postRunnable) {
- // Abort any current animations
- abortScroller();
- abortBoundScrollAnimation();
-
- mScrollAnimator = ObjectAnimator.ofInt(this, "stackScroll", curScroll, newScroll);
- mScrollAnimator.setDuration(Utilities.calculateTranslationAnimationDuration(newScroll -
- curScroll, 250));
- mScrollAnimator.setInterpolator(mConfig.fastOutSlowInInterpolator);
- mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- setStackScroll((Integer) animation.getAnimatedValue());
- }
- });
- mScrollAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- if (postRunnable != null) {
- postRunnable.run();
- }
- mScrollAnimator.removeAllListeners();
- }
- });
- mScrollAnimator.start();
- }
-
- /** Aborts any current stack scrolls */
- void abortBoundScrollAnimation() {
- if (mScrollAnimator != null) {
- mScrollAnimator.cancel();
- }
- }
-
- /** Aborts the scroller and any current fling */
- void abortScroller() {
- if (!mScroller.isFinished()) {
- // Abort the scroller
- mScroller.abortAnimation();
- }
- }
-
- /** Bounds the current scroll if necessary */
- public boolean boundScroll() {
- int curScroll = getStackScroll();
- int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, curScroll));
- if (newScroll != curScroll) {
- setStackScroll(newScroll);
- return true;
- }
- return false;
- }
-
- /**
- * Bounds the current scroll if necessary, but does not synchronize the stack view with the
- * model.
- */
- public boolean boundScrollRaw() {
- int curScroll = getStackScroll();
- int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, curScroll));
- if (newScroll != curScroll) {
- setStackScrollRaw(newScroll);
- return true;
- }
- return false;
- }
-
-
- /** Returns the amount that the scroll is out of bounds */
- int getScrollAmountOutOfBounds(int scroll) {
- if (scroll < mMinScroll) {
- return mMinScroll - scroll;
- } else if (scroll > mMaxScroll) {
- return scroll - mMaxScroll;
- }
- return 0;
- }
-
- /** Returns whether the specified scroll is out of bounds */
- boolean isScrollOutOfBounds() {
- return getScrollAmountOutOfBounds(mStackScroll) != 0;
- }
-
/** Updates the min and max virtual scroll bounds */
void updateMinMaxScroll(boolean boundScrollToNewMinMax) {
// Compute the min and max scroll values
- mStackAlgorithm.computeMinMaxScroll(mStack.getTasks());
- mMinScroll = mStackAlgorithm.mMinScroll;
- mMaxScroll = mStackAlgorithm.mMaxScroll;
+ mLayoutAlgorithm.computeMinMaxScroll(mStack.getTasks());
// Debug logging
if (boundScrollToNewMinMax) {
- boundScroll();
+ mStackScroller.boundScroll();
}
}
+ /** Returns the scroller. */
+ public TaskStackViewScroller getScroller() {
+ return mStackScroller;
+ }
+
/** Focuses the task at the specified index in the stack */
void focusTask(int taskIndex, boolean scrollToNewPosition) {
if (0 <= taskIndex && taskIndex < mStack.getTaskCount()) {
@@ -520,10 +390,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (scrollToNewPosition) {
// Scroll the view into position
- int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll,
- mStackAlgorithm.getStackScrollForTaskIndex(t)));
-
- animateScroll(getStackScroll(), newScroll, postScrollRunnable);
+ // XXX: We probably want this to be centered in view instead of p = 0f
+ float newScroll = mStackScroller.getBoundedStackScroll(
+ mLayoutAlgorithm.getStackScrollForTaskIndex(t));
+ mStackScroller.animateScroll(mStackScroller.getStackScroll(), newScroll, postScrollRunnable);
} else {
if (postScrollRunnable != null) {
postScrollRunnable.run();
@@ -558,24 +428,17 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
@Override
public void computeScroll() {
- if (mScroller.computeScrollOffset()) {
- setStackScroll(mScroller.getCurrY());
- invalidate();
- }
- }
-
- @Override
- public void dispatchDraw(Canvas canvas) {
+ // Synchronize the views
if (synchronizeStackViewsWithModel()) {
clipTaskViews();
}
- super.dispatchDraw(canvas);
+ mStackScroller.computeScroll();
}
/** Computes the stack and task rects */
public void computeRects(int windowWidth, int windowHeight, Rect taskStackBounds) {
// Compute the rects in the stack algorithm
- mStackAlgorithm.computeRects(mStack.getTasks(), windowWidth, windowHeight, taskStackBounds);
+ mLayoutAlgorithm.computeRects(windowWidth, windowHeight, taskStackBounds);
// Update the scroll bounds
updateMinMaxScroll(false);
@@ -598,7 +461,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// If this is the first layout, then scroll to the front of the stack and synchronize the
// stack views immediately to load all the views
if (mAwaitingFirstLayout) {
- setStackScrollToInitialState();
+ mStackScroller.setStackScrollToInitialState();
requestSynchronizeStackViewsWithModel();
synchronizeStackViewsWithModel();
}
@@ -611,9 +474,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
tv.measure(widthMeasureSpec, heightMeasureSpec);
} else {
tv.measure(
- MeasureSpec.makeMeasureSpec(mStackAlgorithm.mTaskRect.width(),
+ MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.width(),
MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(mStackAlgorithm.mTaskRect.height() +
+ MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.height() +
tv.getMaxFooterHeight(), MeasureSpec.EXACTLY));
}
}
@@ -635,8 +498,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (tv.isFullScreenView()) {
tv.layout(left, top, left + tv.getMeasuredWidth(), top + tv.getMeasuredHeight());
} else {
- tv.layout(mStackAlgorithm.mTaskRect.left, mStackAlgorithm.mTaskRect.top,
- mStackAlgorithm.mTaskRect.right, mStackAlgorithm.mTaskRect.bottom +
+ tv.layout(mLayoutAlgorithm.mTaskRect.left, mLayoutAlgorithm.mTaskRect.top,
+ mLayoutAlgorithm.mTaskRect.right, mLayoutAlgorithm.mTaskRect.bottom +
tv.getMaxFooterHeight());
}
}
@@ -649,8 +512,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
/** Handler for the first layout. */
void onFirstLayout() {
- int offscreenY = mStackAlgorithm.mViewRect.bottom -
- (mStackAlgorithm.mTaskRect.top - mStackAlgorithm.mViewRect.top);
+ int offscreenY = mLayoutAlgorithm.mViewRect.bottom -
+ (mLayoutAlgorithm.mTaskRect.top - mLayoutAlgorithm.mViewRect.top);
// Find the launch target task
Task launchTargetTask = null;
@@ -717,10 +580,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
ctx.currentTaskTransform = new TaskViewTransform();
ctx.currentStackViewIndex = i;
ctx.currentStackViewCount = childCount;
- ctx.currentTaskRect = mStackAlgorithm.mTaskRect;
+ ctx.currentTaskRect = mLayoutAlgorithm.mTaskRect;
ctx.currentTaskOccludesLaunchTarget = (launchTargetTask != null) &&
launchTargetTask.group.isTaskAboveTask(task, launchTargetTask);
- mStackAlgorithm.getStackTransform(task, getStackScroll(), ctx.currentTaskTransform);
+ mLayoutAlgorithm.getStackTransform(task, mStackScroller.getStackScroll(), ctx.currentTaskTransform, null);
tv.startEnterRecentsAnimation(ctx);
}
@@ -737,9 +600,12 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
/** Requests this task stacks to start it's exit-recents animation. */
public void startExitToHomeAnimation(ViewAnimation.TaskViewExitContext ctx) {
- // Animate all the task views into view
- ctx.offscreenTranslationY = mStackAlgorithm.mViewRect.bottom -
- (mStackAlgorithm.mTaskRect.top - mStackAlgorithm.mViewRect.top);
+ // Stop any scrolling
+ mStackScroller.stopScroller();
+ mStackScroller.stopBoundScrollAnimation();
+ // Animate all the task views out of view
+ ctx.offscreenTranslationY = mLayoutAlgorithm.mViewRect.bottom -
+ (mLayoutAlgorithm.mTaskRect.top - mLayoutAlgorithm.mViewRect.top);
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
TaskView tv = (TaskView) getChildAt(i);
@@ -753,8 +619,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
/** Animates a task view in this stack as it launches. */
public void startLaunchTaskAnimation(TaskView tv, final Runnable r) {
Task launchTargetTask = tv.getTask();
- int offscreenTranslationY = mStackAlgorithm.mViewRect.bottom -
- (mStackAlgorithm.mTaskRect.top - mStackAlgorithm.mViewRect.top);
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
TaskView t = (TaskView) getChildAt(i);
@@ -788,17 +652,11 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
@Override
public void onStackTaskAdded(TaskStack stack, Task t) {
- // Update the task offsets
- mStackAlgorithm.updateTaskOffsets(mStack.getTasks());
-
requestSynchronizeStackViewsWithModel();
}
@Override
public void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask) {
- // Update the task offsets
- mStackAlgorithm.updateTaskOffsets(mStack.getTasks());
-
// Remove the view associated with this task, we can't rely on updateTransforms
// to work here because the task is no longer in the list
TaskView tv = getChildViewForTask(removedTask);
@@ -811,8 +669,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// Update the min/max scroll and animate other task views into their new positions
updateMinMaxScroll(true);
- int movement = (int) mStackAlgorithm.getTaskOverlapHeight();
- requestSynchronizeStackViewsWithModel(Utilities.calculateTranslationAnimationDuration(movement));
+ requestSynchronizeStackViewsWithModel(200);
// Update the new front most task
if (newFrontMostTask != null) {
@@ -839,6 +696,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
@Override
public void onStackFiltered(TaskStack newStack, final ArrayList<Task> curTasks,
Task filteredTask) {
+ /*
// Stash the scroll and filtered task for us to restore to when we unfilter
mStashedScroll = getStackScroll();
@@ -847,11 +705,11 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
getStackTransforms(curTasks, getStackScroll(), null, true);
// Update the task offsets
- mStackAlgorithm.updateTaskOffsets(mStack.getTasks());
+ mLayoutAlgorithm.updateTaskOffsets(mStack.getTasks());
// Scroll the item to the top of the stack (sans-peek) rect so that we can see it better
updateMinMaxScroll(false);
- float overlapHeight = mStackAlgorithm.getTaskOverlapHeight();
+ float overlapHeight = mLayoutAlgorithm.getTaskOverlapHeight();
setStackScrollRaw((int) (newStack.indexOfTask(filteredTask) * overlapHeight));
boundScrollRaw();
@@ -865,16 +723,18 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// Notify any callbacks
mCb.onTaskStackFilterTriggered();
+ */
}
@Override
public void onStackUnfiltered(TaskStack newStack, final ArrayList<Task> curTasks) {
+ /*
// Calculate the current task transforms
final ArrayList<TaskViewTransform> curTaskTransforms =
getStackTransforms(curTasks, getStackScroll(), null, true);
// Update the task offsets
- mStackAlgorithm.updateTaskOffsets(mStack.getTasks());
+ mLayoutAlgorithm.updateTaskOffsets(mStack.getTasks());
// Restore the stashed scroll
updateMinMaxScroll(false);
@@ -894,6 +754,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// Notify any callbacks
mCb.onTaskStackUnfilterTriggered();
+ */
}
/**** ViewPoolConsumer Implementation ****/
@@ -1014,7 +875,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
@Override
public void onTaskViewClipStateChanged(TaskView tv) {
- invalidate(mStackAlgorithm.mStackRect);
+ invalidate();
}
@Override
@@ -1022,6 +883,15 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
requestSynchronizeStackViewsWithModel();
}
+ /**** TaskStackViewScroller.TaskStackViewScrollerCallbacks ****/
+
+ @Override
+ public void onScrollChanged(float p) {
+ mUIDozeTrigger.poke();
+ requestSynchronizeStackViewsWithModel();
+ invalidate();
+ }
+
/**** RecentsPackageMonitor.PackageCallbacks Implementation ****/
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
index 0fd4e86..b1482bb 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
@@ -18,184 +18,276 @@ package com.android.systemui.recents.views;
import android.graphics.Rect;
import com.android.systemui.recents.RecentsConfiguration;
+import com.android.systemui.recents.misc.Console;
import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.Task;
import java.util.ArrayList;
import java.util.HashMap;
-/* The layout logic for a TaskStackView */
+/* The layout logic for a TaskStackView.
+ *
+ * We are using a curve that defines the curve of the tasks as that go back in the recents list.
+ * The curve is defined such that at curve progress p = 0 is the end of the curve (the top of the
+ * stack rect), and p = 1 at the start of the curve and the bottom of the stack rect.
+ */
public class TaskStackViewLayoutAlgorithm {
// These are all going to change
- static final float StackOverlapPct = 0.65f; // The overlap height relative to the task height
- static final float StackPeekHeightPct = 0.075f; // The height of the peek space relative to the stack height
- static final float StackPeekMinScale = 0.8f; // The min scale of the last card in the peek area
- static final int StackPeekNumCards = 3; // The number of cards we see in the peek space
+ static final float StackPeekMinScale = 0.825f; // The min scale of the last card in the peek area
RecentsConfiguration mConfig;
// The various rects that define the stack view
Rect mViewRect = new Rect();
+ Rect mStackVisibleRect = new Rect();
Rect mStackRect = new Rect();
- Rect mStackRectSansPeek = new Rect();
Rect mTaskRect = new Rect();
- // The min/max scroll
- int mMinScroll;
- int mMaxScroll;
+ // The min/max scroll progress
+ float mMinScrollP;
+ float mMaxScrollP;
+ float mInitialScrollP;
+ int mWithinAffiliationOffset;
+ int mBetweenAffiliationOffset;
+ HashMap<Task.TaskKey, Float> mTaskProgressMap = new HashMap<Task.TaskKey, Float>();
- HashMap<Task.TaskKey, Integer> mTaskOffsetMap = new HashMap<Task.TaskKey, Integer>();
+ // Log function
+ static final float XScale = 1.75f; // The large the XScale, the longer the flat area of the curve
+ static final float LogBase = 300;
+ static final int PrecisionSteps = 250;
+ static float[] xp;
+ static float[] px;
public TaskStackViewLayoutAlgorithm(RecentsConfiguration config) {
mConfig = config;
+ mWithinAffiliationOffset = mConfig.taskBarHeight;
+ mBetweenAffiliationOffset = 4 * mConfig.taskBarHeight;
+
+ // Precompute the path
+ initializeCurve();
}
/** Computes the stack and task rects */
- public void computeRects(ArrayList<Task> tasks, int windowWidth, int windowHeight,
- Rect taskStackBounds) {
- // Note: We let the stack view be the full height because we want the cards to go under the
- // navigation bar if possible. However, the stack rects which we use to calculate
- // max scroll, etc. need to take the nav bar into account
-
+ public void computeRects(int windowWidth, int windowHeight, Rect taskStackBounds) {
// Compute the stack rects
mViewRect.set(0, 0, windowWidth, windowHeight);
mStackRect.set(taskStackBounds);
+ mStackVisibleRect.set(taskStackBounds);
+ mStackVisibleRect.bottom = mViewRect.bottom;
int widthPadding = (int) (mConfig.taskStackWidthPaddingPct * mStackRect.width());
int heightPadding = mConfig.taskStackTopPaddingPx;
mStackRect.inset(widthPadding, heightPadding);
- mStackRectSansPeek.set(mStackRect);
- mStackRectSansPeek.top += StackPeekHeightPct * windowHeight;
// Compute the task rect
int size = mStackRect.width();
int left = mStackRect.left + (mStackRect.width() - size) / 2;
- mTaskRect.set(left, mStackRectSansPeek.top,
- left + size, mStackRectSansPeek.top + size);
-
- // Update the task offsets once the size changes
- updateTaskOffsets(tasks);
+ mTaskRect.set(left, mStackRect.top,
+ left + size, mStackRect.top + size);
}
+ /** Computes the minimum and maximum scroll progress values */
void computeMinMaxScroll(ArrayList<Task> tasks) {
- // Compute the min and max scroll values
- int numTasks = Math.max(1, tasks.size());
+ // Clear the progress map
+ mTaskProgressMap.clear();
+
+ // Return early if we have no tasks
+ if (tasks.isEmpty()) {
+ mMinScrollP = mMaxScrollP = 0;
+ return;
+ }
+
int taskHeight = mTaskRect.height();
- int stackHeight = mStackRectSansPeek.height();
-
- if (numTasks <= 1) {
- // If there is only one task, then center the task in the stack rect (sans peek)
- mMinScroll = mMaxScroll = -(stackHeight -
- (taskHeight + mConfig.taskViewLockToAppButtonHeight)) / 2;
- } else {
- int maxScrollHeight = getStackScrollForTaskIndex(tasks.get(tasks.size() - 1))
- + taskHeight + mConfig.taskViewLockToAppButtonHeight;
- mMinScroll = Math.min(stackHeight, maxScrollHeight) - stackHeight;
- mMaxScroll = maxScrollHeight - stackHeight;
+ float pAtBottomOfStackRect = screenYToCurveProgress(mStackVisibleRect.bottom);
+ float pWithinAffiliateOffset = pAtBottomOfStackRect -
+ screenYToCurveProgress(mStackVisibleRect.bottom - mWithinAffiliationOffset);
+ float pBetweenAffiliateOffset = pAtBottomOfStackRect -
+ screenYToCurveProgress(mStackVisibleRect.bottom - mBetweenAffiliationOffset);
+ float pTaskHeightOffset = pAtBottomOfStackRect -
+ screenYToCurveProgress(mStackVisibleRect.bottom - taskHeight);
+ float pNavBarOffset = pAtBottomOfStackRect -
+ screenYToCurveProgress(mStackVisibleRect.bottom - (mStackVisibleRect.bottom - mStackRect.bottom));
+
+ // Update the task offsets
+ float pAtBackMostCardTop = screenYToCurveProgress(mStackVisibleRect.top +
+ (mStackVisibleRect.height() - taskHeight) / 2);
+ float pAtFrontMostCardTop = pAtBackMostCardTop;
+ float pAtSecondFrontMostCardTop = pAtBackMostCardTop;
+ int taskCount = tasks.size();
+ for (int i = 0; i < taskCount; i++) {
+ Task task = tasks.get(i);
+ mTaskProgressMap.put(task.key, pAtFrontMostCardTop);
+
+ if (i < (taskCount - 1)) {
+ // Increment the peek height
+ float pPeek = task.group.isFrontMostTask(task) ? pBetweenAffiliateOffset :
+ pWithinAffiliateOffset;
+ pAtSecondFrontMostCardTop = pAtFrontMostCardTop;
+ pAtFrontMostCardTop += pPeek;
+ }
}
+
+ mMinScrollP = 0f;
+ mMaxScrollP = pAtFrontMostCardTop - ((1f - pTaskHeightOffset - pNavBarOffset));
+ mInitialScrollP = pAtSecondFrontMostCardTop - ((1f - pTaskHeightOffset - pNavBarOffset));
}
/** Update/get the transform */
- public TaskViewTransform getStackTransform(Task task, int stackScroll, TaskViewTransform transformOut) {
+ public TaskViewTransform getStackTransform(Task task, float stackScroll, TaskViewTransform transformOut,
+ TaskViewTransform prevTransform) {
// Return early if we have an invalid index
if (task == null) {
transformOut.reset();
return transformOut;
}
- return getStackTransform(getStackScrollForTaskIndex(task), stackScroll, transformOut);
+ return getStackTransform(mTaskProgressMap.get(task.key), stackScroll, transformOut, prevTransform);
}
/** Update/get the transform */
- public TaskViewTransform getStackTransform(int taskStackScroll, int stackScroll, TaskViewTransform transformOut) {
- // Map the items to an continuous position relative to the specified scroll
- int numPeekCards = StackPeekNumCards;
- float overlapHeight = StackOverlapPct * mTaskRect.height();
- float peekHeight = StackPeekHeightPct * mStackRect.height();
- float t = (taskStackScroll - stackScroll) / overlapHeight;
- float boundedT = Math.max(t, -(numPeekCards + 1));
-
- // Set the scale relative to its position
- int numFrontScaledCards = 3;
- float minScale = StackPeekMinScale;
- float scaleRange = 1f - minScale;
- float scaleInc = scaleRange / (numPeekCards + numFrontScaledCards);
- float scale = Math.max(minScale, Math.min(1f, minScale +
- ((boundedT + (numPeekCards + 1)) * scaleInc)));
- float scaleYOffset = ((1f - scale) * mTaskRect.height()) / 2;
- // Account for the bar offsets being scaled?
- float scaleBarYOffset = (1f - scale) * mConfig.taskBarHeight;
- transformOut.scale = scale;
-
- // Set the y translation
- if (boundedT < 0f) {
- transformOut.translationY = (int) ((Math.max(-numPeekCards, boundedT) /
- numPeekCards) * peekHeight - scaleYOffset);
- } else {
- transformOut.translationY = (int) (boundedT * overlapHeight - scaleYOffset);
+ public TaskViewTransform getStackTransform(float taskProgress, float stackScroll, TaskViewTransform transformOut, TaskViewTransform prevTransform) {
+ float pTaskRelative = taskProgress - stackScroll;
+ float pBounded = Math.max(0, Math.min(pTaskRelative, 1f));
+ // If the task top is outside of the bounds below the screen, then immediately reset it
+ if (pTaskRelative > 1f) {
+ transformOut.reset();
+ return transformOut;
}
-
- // Set the z translation
+ // The check for the top is trickier, since we want to show the next task if it is at all
+ // visible, even if p < 0.
+ if (pTaskRelative < 0f) {
+ if (prevTransform != null && Float.compare(prevTransform.p, 0f) <= 0) {
+ transformOut.reset();
+ return transformOut;
+ }
+ }
+ float scale = curveProgressToScale(pBounded);
+ int scaleYOffset = (int) (((1f - scale) * mTaskRect.height()) / 2);
int minZ = mConfig.taskViewTranslationZMinPx;
- int incZ = mConfig.taskViewTranslationZIncrementPx;
- transformOut.translationZ = (int) Math.max(minZ, minZ + ((boundedT + numPeekCards) * incZ));
-
- // Set the alphas
- // transformOut.dismissAlpha = Math.max(-1f, Math.min(0f, t + 1)) + 1f;
- transformOut.dismissAlpha = 1f;
-
- // Update the rect and visibility
+ int maxZ = mConfig.taskViewTranslationZMaxPx;
+ transformOut.scale = scale;
+ transformOut.translationY = curveProgressToScreenY(pBounded) - mStackVisibleRect.top -
+ scaleYOffset;
+ transformOut.translationZ = Math.max(minZ, minZ + (pBounded * (maxZ - minZ)));
transformOut.rect.set(mTaskRect);
- if (t < -(numPeekCards + 1)) {
- transformOut.visible = false;
- } else {
- transformOut.rect.offset(0, transformOut.translationY);
- Utilities.scaleRectAboutCenter(transformOut.rect, transformOut.scale);
- transformOut.visible = Rect.intersects(mViewRect, transformOut.rect);
- }
- transformOut.t = t;
+ transformOut.rect.offset(0, transformOut.translationY);
+ Utilities.scaleRectAboutCenter(transformOut.rect, transformOut.scale);
+ transformOut.visible = true;
+ transformOut.p = pTaskRelative;
return transformOut;
}
/**
- * Returns the overlap between one task and the next.
+ * Returns the scroll to such task top = 1f;
*/
- float getTaskOverlapHeight() {
- return StackOverlapPct * mTaskRect.height();
+ float getStackScrollForTaskIndex(Task t) {
+ return mTaskProgressMap.get(t.key);
}
- /**
- * Returns the scroll to such that the task transform at that index will have t=0. (If the scroll
- * is not bounded)
- */
- int getStackScrollForTaskIndex(Task t) {
- return mTaskOffsetMap.get(t.key);
+ /** Initializes the curve. */
+ public static void initializeCurve() {
+ if (xp != null && px != null) return;
+ xp = new float[PrecisionSteps + 1];
+ px = new float[PrecisionSteps + 1];
+
+ // Approximate f(x)
+ float[] fx = new float[PrecisionSteps + 1];
+ float step = 1f / PrecisionSteps;
+ float x = 0;
+ for (int xStep = 0; xStep <= PrecisionSteps; xStep++) {
+ fx[xStep] = logFunc(x);
+ x += step;
+ }
+ // Calculate the arc length for x:1->0
+ float pLength = 0;
+ float[] dx = new float[PrecisionSteps + 1];
+ dx[0] = 0;
+ for (int xStep = 1; xStep < PrecisionSteps; xStep++) {
+ dx[xStep] = (float) Math.sqrt(Math.pow(fx[xStep] - fx[xStep - 1], 2) + Math.pow(step, 2));
+ pLength += dx[xStep];
+ }
+ // Approximate p(x), a function of cumulative progress with x, normalized to 0..1
+ float p = 0;
+ px[0] = 0f;
+ px[PrecisionSteps] = 1f;
+ for (int xStep = 1; xStep <= PrecisionSteps; xStep++) {
+ p += Math.abs(dx[xStep] / pLength);
+ px[xStep] = p;
+ }
+ // Given p(x), calculate the inverse function x(p). This assumes that x(p) is also a valid
+ // function.
+ int xStep = 0;
+ p = 0;
+ xp[0] = 0f;
+ xp[PrecisionSteps] = 1f;
+ for (int pStep = 0; pStep < PrecisionSteps; pStep++) {
+ // Walk forward in px and find the x where px <= p && p < px+1
+ while (xStep < PrecisionSteps) {
+ if (px[xStep] > p) break;
+ xStep++;
+ }
+ // Now, px[xStep-1] <= p < px[xStep]
+ if (xStep == 0) {
+ xp[pStep] = 0;
+ } else {
+ // Find x such that proportionally, x is correct
+ float fraction = (p - px[xStep - 1]) / (px[xStep] - px[xStep - 1]);
+ x = (xStep - 1 + fraction) * step;
+ xp[pStep] = x;
+ }
+ p += step;
+ }
}
- /**
- * Returns the scroll to such that the task transform at that task + index will have t=0.
- * (If the scroll is not bounded)
- */
- int getStackScrollForTaskIndex(Task t, int relativeIndexOffset) {
- return mTaskOffsetMap.get(t.key) + (int) (relativeIndexOffset * getTaskOverlapHeight());
+ /** Reverses and scales out x. */
+ static float reverse(float x) {
+ return (-x * XScale) + 1;
+ }
+ /** The log function describing the curve. */
+ static float logFunc(float x) {
+ return 1f - (float) (Math.pow(LogBase, reverse(x))) / (LogBase);
+ }
+ /** The inverse of the log function describing the curve. */
+ float invLogFunc(float y) {
+ return (float) (Math.log((1f - reverse(y)) * (LogBase - 1) + 1) / Math.log(LogBase));
}
- /**
- * Updates the cache of tasks to offsets.
- */
- void updateTaskOffsets(ArrayList<Task> tasks) {
- mTaskOffsetMap.clear();
- int offset = 0;
- int taskCount = tasks.size();
- for (int i = 0; i < taskCount; i++) {
- Task t = tasks.get(i);
- mTaskOffsetMap.put(t.key, offset);
- if (t.group.isFrontMostTask(t)) {
- offset += getTaskOverlapHeight();
- } else {
- offset += mConfig.taskBarHeight;
- }
+ /** Converts from the progress along the curve to a screen coordinate. */
+ int curveProgressToScreenY(float p) {
+ if (p < 0 || p > 1) return mStackVisibleRect.top + (int) (p * mStackVisibleRect.height());
+ float pIndex = p * PrecisionSteps;
+ int pFloorIndex = (int) Math.floor(pIndex);
+ int pCeilIndex = (int) Math.ceil(pIndex);
+ float xFraction = 0;
+ if (pFloorIndex < PrecisionSteps && (pCeilIndex != pFloorIndex)) {
+ float pFraction = (pIndex - pFloorIndex) / (pCeilIndex - pFloorIndex);
+ xFraction = (xp[pCeilIndex] - xp[pFloorIndex]) * pFraction;
}
+ float x = xp[pFloorIndex] + xFraction;
+ return mStackVisibleRect.top + (int) (x * mStackVisibleRect.height());
+ }
+
+ /** Converts from the progress along the curve to a scale. */
+ float curveProgressToScale(float p) {
+ if (p < 0) return StackPeekMinScale;
+ if (p > 1) return 1f;
+ float scaleRange = (1f - StackPeekMinScale);
+ float scale = StackPeekMinScale + (p * scaleRange);
+ return scale;
}
+ /** Converts from a screen coordinate to the progress along the curve. */
+ float screenYToCurveProgress(int screenY) {
+ float x = (float) (screenY - mStackVisibleRect.top) / mStackVisibleRect.height();
+ if (x < 0 || x > 1) return x;
+ float xIndex = x * PrecisionSteps;
+ int xFloorIndex = (int) Math.floor(xIndex);
+ int xCeilIndex = (int) Math.ceil(xIndex);
+ float pFraction = 0;
+ if (xFloorIndex < PrecisionSteps && (xCeilIndex != xFloorIndex)) {
+ float xFraction = (xIndex - xFloorIndex) / (xCeilIndex - xFloorIndex);
+ pFraction = (px[xCeilIndex] - px[xFloorIndex]) * xFraction;
+ }
+ return px[xFloorIndex] + pFraction;
+ }
} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
new file mode 100644
index 0000000..0a12dab
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.recents.views;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.widget.OverScroller;
+import com.android.systemui.recents.RecentsConfiguration;
+
+/* The scrolling logic for a TaskStackView */
+public class TaskStackViewScroller {
+ public interface TaskStackViewScrollerCallbacks {
+ public void onScrollChanged(float p);
+ }
+
+ RecentsConfiguration mConfig;
+ TaskStackViewLayoutAlgorithm mLayoutAlgorithm;
+ TaskStackViewScrollerCallbacks mCb;
+
+ float mStackScrollP;
+
+ OverScroller mScroller;
+ ObjectAnimator mScrollAnimator;
+
+ public TaskStackViewScroller(Context context, RecentsConfiguration config, TaskStackViewLayoutAlgorithm layoutAlgorithm) {
+ mConfig = config;
+ mScroller = new OverScroller(context);
+ mLayoutAlgorithm = layoutAlgorithm;
+ setStackScroll(getStackScroll());
+ }
+
+ /** Sets the callbacks */
+ void setCallbacks(TaskStackViewScrollerCallbacks cb) {
+ mCb = cb;
+ }
+
+ /** Gets the current stack scroll */
+ public float getStackScroll() {
+ return mStackScrollP;
+ }
+
+ /** Sets the current stack scroll */
+ public void setStackScroll(float s) {
+ mStackScrollP = s;
+ if (mCb != null) {
+ mCb.onScrollChanged(mStackScrollP);
+ }
+ }
+
+ /** Sets the current stack scroll without calling the callback. */
+ void setStackScrollRaw(float s) {
+ mStackScrollP = s;
+ }
+
+ /** Sets the current stack scroll to the initial state when you first enter recents */
+ public void setStackScrollToInitialState() {
+ setStackScroll(getBoundedStackScroll(mLayoutAlgorithm.mInitialScrollP));
+ }
+
+ /** Bounds the current scroll if necessary */
+ public boolean boundScroll() {
+ float curScroll = getStackScroll();
+ float newScroll = getBoundedStackScroll(curScroll);
+ if (Float.compare(newScroll, curScroll) != 0) {
+ setStackScroll(newScroll);
+ return true;
+ }
+ return false;
+ }
+ /** Bounds the current scroll if necessary, but does not synchronize the stack view with the model. */
+ public boolean boundScrollRaw() {
+ float curScroll = getStackScroll();
+ float newScroll = getBoundedStackScroll(curScroll);
+ if (Float.compare(newScroll, curScroll) != 0) {
+ setStackScrollRaw(newScroll);
+ return true;
+ }
+ return false;
+ }
+
+ /** Returns the bounded stack scroll */
+ float getBoundedStackScroll(float scroll) {
+ return Math.max(mLayoutAlgorithm.mMinScrollP, Math.min(mLayoutAlgorithm.mMaxScrollP, scroll));
+ }
+
+ /** Returns the amount that the aboslute value of how much the scroll is out of bounds. */
+ float getScrollAmountOutOfBounds(float scroll) {
+ if (scroll < mLayoutAlgorithm.mMinScrollP) {
+ return Math.abs(scroll - mLayoutAlgorithm.mMinScrollP);
+ } else if (scroll > mLayoutAlgorithm.mMaxScrollP) {
+ return Math.abs(scroll - mLayoutAlgorithm.mMaxScrollP);
+ }
+ return 0f;
+ }
+
+ /** Returns whether the specified scroll is out of bounds */
+ boolean isScrollOutOfBounds() {
+ return Float.compare(getScrollAmountOutOfBounds(mStackScrollP), 0f) != 0;
+ }
+
+ /** Animates the stack scroll into bounds */
+ ObjectAnimator animateBoundScroll() {
+ float curScroll = getStackScroll();
+ float newScroll = getBoundedStackScroll(curScroll);
+ if (Float.compare(newScroll, curScroll) != 0) {
+ // Start a new scroll animation
+ animateScroll(curScroll, newScroll, null);
+ }
+ return mScrollAnimator;
+ }
+
+ /** Animates the stack scroll */
+ void animateScroll(float curScroll, float newScroll, final Runnable postRunnable) {
+ // Abort any current animations
+ stopScroller();
+ stopBoundScrollAnimation();
+
+ mScrollAnimator = ObjectAnimator.ofFloat(this, "stackScroll", curScroll, newScroll);
+ mScrollAnimator.setDuration(250);
+ // We would have to project the difference into the screen coords, and then use that as the
+ // duration
+// mScrollAnimator.setDuration(Utilities.calculateTranslationAnimationDuration(newScroll -
+// curScroll, 250));
+ mScrollAnimator.setInterpolator(mConfig.fastOutSlowInInterpolator);
+ mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ setStackScroll((Float) animation.getAnimatedValue());
+ }
+ });
+ mScrollAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (postRunnable != null) {
+ postRunnable.run();
+ }
+ mScrollAnimator.removeAllListeners();
+ }
+ });
+ mScrollAnimator.start();
+ }
+
+ /** Aborts any current stack scrolls */
+ void stopBoundScrollAnimation() {
+ if (mScrollAnimator != null) {
+ mScrollAnimator.removeAllListeners();
+ mScrollAnimator.cancel();
+ }
+ }
+
+ /**** OverScroller ****/
+
+ int progressToScrollRange(float p) {
+ return (int) (p * mLayoutAlgorithm.mStackVisibleRect.height());
+ }
+
+ float scrollRangeToProgress(int s) {
+ return (float) s / mLayoutAlgorithm.mStackVisibleRect.height();
+ }
+
+ /** Called from the view draw, computes the next scroll. */
+ boolean computeScroll() {
+ if (mScroller.computeScrollOffset()) {
+ float scroll = scrollRangeToProgress(mScroller.getCurrY());
+ setStackScrollRaw(scroll);
+ if (mCb != null) {
+ mCb.onScrollChanged(scroll);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /** Returns whether the overscroller is scrolling. */
+ boolean isScrolling() {
+ return !mScroller.isFinished();
+ }
+
+ /** Stops the scroller and any current fling. */
+ void stopScroller() {
+ if (!mScroller.isFinished()) {
+ mScroller.abortAnimation();
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
index b1c35f3..4cf6b82 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
@@ -29,16 +29,19 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
static int INACTIVE_POINTER_ID = -1;
TaskStackView mSv;
+ TaskStackViewScroller mScroller;
VelocityTracker mVelocityTracker;
boolean mIsScrolling;
+ float mInitialP;
+ float mLastP;
+ float mTotalPMotion;
int mInitialMotionX, mInitialMotionY;
int mLastMotionX, mLastMotionY;
int mActivePointerId = INACTIVE_POINTER_ID;
TaskView mActiveTaskView = null;
- int mTotalScrollMotion;
int mMinimumVelocity;
int mMaximumVelocity;
// The scroll touch slop is used to calculate when we start scrolling
@@ -49,14 +52,14 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
SwipeHelper mSwipeHelper;
boolean mInterceptedBySwipeHelper;
- public TaskStackViewTouchHandler(Context context, TaskStackView sv) {
+ public TaskStackViewTouchHandler(Context context, TaskStackView sv, TaskStackViewScroller scroller) {
ViewConfiguration configuration = ViewConfiguration.get(context);
mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
mScrollTouchSlop = configuration.getScaledTouchSlop();
mPagingTouchSlop = configuration.getScaledPagingTouchSlop();
mSv = sv;
-
+ mScroller = scroller;
float densityScale = context.getResources().getDisplayMetrics().density;
mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, mPagingTouchSlop);
@@ -97,6 +100,13 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
return null;
}
+ /** Constructs a simulated motion event for the current stack scroll. */
+ MotionEvent createMotionEventForStackScroll(MotionEvent ev) {
+ MotionEvent pev = MotionEvent.obtainNoHistory(ev);
+ pev.setLocation(0, mScroller.progressToScrollRange(mScroller.getStackScroll()));
+ return pev;
+ }
+
/** Touch preprocessing for handling below */
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Return early if we have no children
@@ -111,24 +121,25 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
return true;
}
- boolean wasScrolling = !mSv.mScroller.isFinished() ||
- (mSv.mScrollAnimator != null && mSv.mScrollAnimator.isRunning());
+ boolean wasScrolling = mScroller.isScrolling() ||
+ (mScroller.mScrollAnimator != null && mScroller.mScrollAnimator.isRunning());
int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
// Save the touch down info
mInitialMotionX = mLastMotionX = (int) ev.getX();
mInitialMotionY = mLastMotionY = (int) ev.getY();
+ mInitialP = mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
mActivePointerId = ev.getPointerId(0);
mActiveTaskView = findViewAtPoint(mLastMotionX, mLastMotionY);
// Stop the current scroll if it is still flinging
- mSv.abortScroller();
- mSv.abortBoundScrollAnimation();
+ mScroller.stopScroller();
+ mScroller.stopBoundScrollAnimation();
// Initialize the velocity tracker
initOrResetVelocityTracker();
- mVelocityTracker.addMovement(ev);
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
// Check if the scroller is finished yet
- mIsScrolling = !mSv.mScroller.isFinished();
+ mIsScrolling = mScroller.isScrolling();
break;
}
case MotionEvent.ACTION_MOVE: {
@@ -142,7 +153,7 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
mIsScrolling = true;
// Initialize the velocity tracker if necessary
initVelocityTrackerIfNotExists();
- mVelocityTracker.addMovement(ev);
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
// Disallow parents from intercepting touch events
final ViewParent parent = mSv.getParent();
if (parent != null) {
@@ -152,17 +163,18 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
mLastMotionX = x;
mLastMotionY = y;
+ mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: {
// Animate the scroll back if we've cancelled
- mSv.animateBoundScroll();
+ mScroller.animateBoundScroll();
// Reset the drag state and the velocity tracker
mIsScrolling = false;
mActivePointerId = INACTIVE_POINTER_ID;
mActiveTaskView = null;
- mTotalScrollMotion = 0;
+ mTotalPMotion = 0;
recycleVelocityTracker();
break;
}
@@ -186,7 +198,6 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
// Update the velocity tracker
initVelocityTrackerIfNotExists();
- mVelocityTracker.addMovement(ev);
int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
@@ -194,14 +205,15 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
// Save the touch down info
mInitialMotionX = mLastMotionX = (int) ev.getX();
mInitialMotionY = mLastMotionY = (int) ev.getY();
+ mInitialP = mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
mActivePointerId = ev.getPointerId(0);
mActiveTaskView = findViewAtPoint(mLastMotionX, mLastMotionY);
// Stop the current scroll if it is still flinging
- mSv.abortScroller();
- mSv.abortBoundScrollAnimation();
+ mScroller.stopScroller();
+ mScroller.stopBoundScrollAnimation();
// Initialize the velocity tracker
initOrResetVelocityTracker();
- mVelocityTracker.addMovement(ev);
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
// Disallow parents from intercepting touch events
final ViewParent parent = mSv.getParent();
if (parent != null) {
@@ -214,6 +226,7 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
mActivePointerId = ev.getPointerId(index);
mLastMotionX = (int) ev.getX(index);
mLastMotionY = (int) ev.getY(index);
+ mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
break;
}
case MotionEvent.ACTION_MOVE: {
@@ -223,13 +236,14 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
int x = (int) ev.getX(activePointerIndex);
int y = (int) ev.getY(activePointerIndex);
int yTotal = Math.abs(y - mInitialMotionY);
- int deltaY = mLastMotionY - y;
+ float curP = mSv.mLayoutAlgorithm.screenYToCurveProgress(y);
+ float deltaP = mLastP - curP;
if (!mIsScrolling) {
if (yTotal > mScrollTouchSlop) {
mIsScrolling = true;
// Initialize the velocity tracker
initOrResetVelocityTracker();
- mVelocityTracker.addMovement(ev);
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
// Disallow parents from intercepting touch events
final ViewParent parent = mSv.getParent();
if (parent != null) {
@@ -238,23 +252,26 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
}
}
if (mIsScrolling) {
- int curStackScroll = mSv.getStackScroll();
- int overScrollAmount = mSv.getScrollAmountOutOfBounds(curStackScroll + deltaY);
- if (overScrollAmount != 0) {
+ float curStackScroll = mScroller.getStackScroll();
+ float overScrollAmount = mScroller.getScrollAmountOutOfBounds(curStackScroll + deltaP);
+ if (Float.compare(overScrollAmount, 0f) != 0) {
// Bound the overscroll to a fixed amount, and inversely scale the y-movement
// relative to how close we are to the max overscroll
- float maxOverScroll = mSv.mStackAlgorithm.mTaskRect.height() / 3f;
- deltaY = Math.round(deltaY * (1f - (Math.min(maxOverScroll, overScrollAmount)
- / maxOverScroll)));
+ float maxOverScroll = 0.25f;
+ deltaP *= (1f - (Math.min(maxOverScroll, overScrollAmount)
+ / maxOverScroll));
}
- mSv.setStackScroll(curStackScroll + deltaY);
- if (mSv.isScrollOutOfBounds()) {
+ mScroller.setStackScroll(curStackScroll + deltaP);
+ if (mScroller.isScrollOutOfBounds()) {
mVelocityTracker.clear();
+ } else {
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
}
}
mLastMotionX = x;
mLastMotionY = y;
- mTotalScrollMotion += Math.abs(deltaY);
+ mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
+ mTotalPMotion += Math.abs(deltaP);
break;
}
case MotionEvent.ACTION_UP: {
@@ -263,25 +280,27 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
int velocity = (int) velocityTracker.getYVelocity(mActivePointerId);
if (mIsScrolling && (Math.abs(velocity) > mMinimumVelocity)) {
+ // XXX: Should this be calculated as a percentage of a curve?
int overscrollRange = (int) (Math.min(1f,
Math.abs((float) velocity / mMaximumVelocity)) *
Constants.Values.TaskStackView.TaskStackOverscrollRange);
// Fling scroll
- mSv.mScroller.fling(0, mSv.getStackScroll(),
- 0, -velocity,
+ mScroller.mScroller.fling(0, mScroller.progressToScrollRange(mScroller.getStackScroll()),
+ 0, velocity,
0, 0,
- mSv.mMinScroll, mSv.mMaxScroll,
+ mScroller.progressToScrollRange(mSv.mLayoutAlgorithm.mMinScrollP),
+ mScroller.progressToScrollRange(mSv.mLayoutAlgorithm.mMaxScrollP),
0, overscrollRange);
// Invalidate to kick off computeScroll
- mSv.invalidate(mSv.mStackAlgorithm.mStackRect);
- } else if (mSv.isScrollOutOfBounds()) {
+ mSv.invalidate();
+ } else if (mScroller.isScrollOutOfBounds()) {
// Animate the scroll back into bounds
- mSv.animateBoundScroll();
+ mScroller.animateBoundScroll();
}
mActivePointerId = INACTIVE_POINTER_ID;
mIsScrolling = false;
- mTotalScrollMotion = 0;
+ mTotalPMotion = 0;
recycleVelocityTracker();
break;
}
@@ -294,18 +313,19 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback {
mActivePointerId = ev.getPointerId(newPointerIndex);
mLastMotionX = (int) ev.getX(newPointerIndex);
mLastMotionY = (int) ev.getY(newPointerIndex);
+ mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
mVelocityTracker.clear();
}
break;
}
case MotionEvent.ACTION_CANCEL: {
- if (mSv.isScrollOutOfBounds()) {
+ if (mScroller.isScrollOutOfBounds()) {
// Animate the scroll back into bounds
- mSv.animateBoundScroll();
+ mScroller.animateBoundScroll();
}
mActivePointerId = INACTIVE_POINTER_ID;
mIsScrolling = false;
- mTotalScrollMotion = 0;
+ mTotalPMotion = 0;
recycleVelocityTracker();
break;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index 8a16d30..abf3c50 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -52,9 +52,11 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
RecentsConfiguration mConfig;
+ float mTaskProgress;
+ ObjectAnimator mTaskProgressAnimator;
+ float mMaxDimScale;
int mDim;
- int mMaxDim;
- AccelerateInterpolator mDimInterpolator = new AccelerateInterpolator();
+ AccelerateInterpolator mDimInterpolator = new AccelerateInterpolator(1.25f);
PorterDuffColorFilter mDimColorFilter = new PorterDuffColorFilter(0, PorterDuff.Mode.MULTIPLY);
Task mTask;
@@ -76,7 +78,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- updateDimOverlayFromScale();
+ setTaskProgress((Float) animation.getAnimatedValue());
}
};
@@ -96,10 +98,11 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
public TaskView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mConfig = RecentsConfiguration.getInstance();
- mMaxDim = mConfig.taskStackMaxDim;
+ mMaxDimScale = mConfig.taskStackMaxDim / 255f;
mClipViewInStack = true;
mViewBounds = new AnimateableViewBounds(this, mConfig.taskViewRoundedCornerRadiusPx);
setOutlineProvider(mViewBounds);
+ setTaskProgress(getTaskProgress());
setDim(getDim());
}
@@ -159,9 +162,6 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
/** Synchronizes this view's properties with the task's transform */
void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration) {
- // Update the bar view
- mBarView.updateViewPropertiesToTaskTransform(toTransform, duration);
-
// If we are a full screen view, then only update the Z to keep it in order
// XXX: Also update/animate the dim as well
if (mIsFullScreenView) {
@@ -173,8 +173,21 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
}
// Apply the transform
- toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false,
- mUpdateDimListener);
+ toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false);
+
+ // Update the task progress
+ if (mTaskProgressAnimator != null) {
+ mTaskProgressAnimator.removeAllListeners();
+ mTaskProgressAnimator.cancel();
+ }
+ if (duration <= 0) {
+ setTaskProgress(toTransform.p);
+ } else {
+ mTaskProgressAnimator = ObjectAnimator.ofFloat(this, "taskProgress", toTransform.p);
+ mTaskProgressAnimator.setDuration(duration);
+ mTaskProgressAnimator.addUpdateListener(mUpdateDimListener);
+ mTaskProgressAnimator.start();
+ }
}
/** Resets this view's properties */
@@ -325,7 +338,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
mThumbnailView.enableTaskBarClipAsRunnable(mBarView));
// Animate the dim into view as well
- ObjectAnimator anim = ObjectAnimator.ofInt(this, "dim", getDimOverlayFromScale());
+ ObjectAnimator anim = ObjectAnimator.ofInt(this, "dim", getDimFromTaskProgress());
anim.setStartDelay(mConfig.taskBarEnterAnimDelay);
anim.setDuration(mConfig.taskBarEnterAnimDuration);
anim.setInterpolator(mConfig.fastOutLinearInInterpolator);
@@ -556,6 +569,17 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
}
}
+ /** Sets the current task progress. */
+ public void setTaskProgress(float p) {
+ mTaskProgress = p;
+ updateDimFromTaskProgress();
+ }
+
+ /** Returns the current task progress. */
+ public float getTaskProgress() {
+ return mTaskProgress;
+ }
+
/** Returns the current dim. */
public void setDim(int dim) {
mDim = dim;
@@ -571,17 +595,14 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
}
/** Compute the dim as a function of the scale of this view. */
- int getDimOverlayFromScale() {
- float minScale = TaskStackViewLayoutAlgorithm.StackPeekMinScale;
- float scaleRange = 1f - minScale;
- float dim = (1f - getScaleX()) / scaleRange;
- dim = mDimInterpolator.getInterpolation(Math.min(dim, 1f));
- return Math.max(0, Math.min(mMaxDim, (int) (dim * 255)));
+ int getDimFromTaskProgress() {
+ float dim = mMaxDimScale * mDimInterpolator.getInterpolation(1f - mTaskProgress);
+ return (int) (dim * 255);
}
/** Update the dim as a function of the scale of this view. */
- void updateDimOverlayFromScale() {
- setDim(getDimOverlayFromScale());
+ void updateDimFromTaskProgress() {
+ setDim(getDimFromTaskProgress());
}
/**** View focus state ****/
@@ -650,9 +671,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
}
mBarView.rebindToTask(mTask);
// Rebind any listeners
- if (Constants.DebugFlags.App.EnableTaskFiltering) {
- mBarView.mApplicationIcon.setOnClickListener(this);
- }
+ mBarView.mApplicationIcon.setOnClickListener(this);
mBarView.mDismissButton.setOnClickListener(this);
if (mFooterView != null) {
mFooterView.setOnClickListener(this);
@@ -675,9 +694,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
mThumbnailView.unbindFromTask();
mBarView.unbindFromTask();
// Unbind any listeners
- if (Constants.DebugFlags.App.EnableTaskFiltering) {
- mBarView.mApplicationIcon.setOnClickListener(null);
- }
+ mBarView.mApplicationIcon.setOnClickListener(null);
mBarView.mDismissButton.setOnClickListener(null);
if (mFooterView != null) {
mFooterView.setOnClickListener(null);
@@ -717,7 +734,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
postDelayed(new Runnable() {
@Override
public void run() {
- if (v == mBarView.mApplicationIcon) {
+ if (Constants.DebugFlags.App.EnableTaskFiltering && v == mBarView.mApplicationIcon) {
mCb.onTaskViewAppIconClicked(tv);
} else if (v == mBarView.mDismissButton) {
// Animate out the view and call the callback
@@ -729,7 +746,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
});
// Hide the footer
tv.animateFooterVisibility(false, mConfig.taskViewRemoveAnimDuration);
- } else if (v == tv || (v == mFooterView || v == mActionButtonView)) {
+ } else {
mCb.onTaskViewClicked(tv, tv.getTask(),
(v == mFooterView || v == mActionButtonView));
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java
index aeb4fe4..ce2e80b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java
@@ -28,13 +28,12 @@ import com.android.systemui.recents.Constants;
public class TaskViewTransform {
public int startDelay = 0;
public int translationY = 0;
- public int translationZ = 0;
+ public float translationZ = 0;
public float scale = 1f;
public float alpha = 1f;
- public float dismissAlpha = 1f;
public boolean visible = false;
public Rect rect = new Rect();
- float t = 0f;
+ float p = 0f;
public TaskViewTransform() {
// Do nothing
@@ -46,10 +45,9 @@ public class TaskViewTransform {
translationZ = o.translationZ;
scale = o.scale;
alpha = o.alpha;
- dismissAlpha = o.dismissAlpha;
visible = o.visible;
rect.set(o.rect);
- t = o.t;
+ p = o.p;
}
/** Resets the current transform */
@@ -59,19 +57,15 @@ public class TaskViewTransform {
translationZ = 0;
scale = 1f;
alpha = 1f;
- dismissAlpha = 1f;
visible = false;
rect.setEmpty();
- t = 0f;
+ p = 0f;
}
/** Convenience functions to compare against current property values */
public boolean hasAlphaChangedFrom(float v) {
return (Float.compare(alpha, v) != 0);
}
- public boolean hasDismissAlphaChangedFrom(float v) {
- return (Float.compare(dismissAlpha, v) != 0);
- }
public boolean hasScaleChangedFrom(float v) {
return (Float.compare(scale, v) != 0);
}
@@ -83,8 +77,7 @@ public class TaskViewTransform {
}
/** Applies this transform to a view. */
- public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers,
- ValueAnimator.AnimatorUpdateListener scaleUpdateListener) {
+ public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers) {
// Check to see if any properties have changed, and update the task view
if (duration > 0) {
ViewPropertyAnimator anim = v.animate();
@@ -100,8 +93,7 @@ public class TaskViewTransform {
}
if (hasScaleChangedFrom(v.getScaleX())) {
anim.scaleX(scale)
- .scaleY(scale)
- .setUpdateListener(scaleUpdateListener);
+ .scaleY(scale);
requiresLayers = true;
}
if (hasAlphaChangedFrom(v.getAlpha())) {
@@ -128,7 +120,6 @@ public class TaskViewTransform {
if (hasScaleChangedFrom(v.getScaleX())) {
v.setScaleX(scale);
v.setScaleY(scale);
- scaleUpdateListener.onAnimationUpdate(null);
}
if (hasAlphaChangedFrom(v.getAlpha())) {
v.setAlpha(alpha);
@@ -152,6 +143,6 @@ public class TaskViewTransform {
public String toString() {
return "TaskViewTransform delay: " + startDelay + " y: " + translationY + " z: " + translationZ +
" scale: " + scale + " alpha: " + alpha + " visible: " + visible + " rect: " + rect +
- " dismissAlpha: " + dismissAlpha;
+ " p: " + p;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 5771299..c559253 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -74,6 +74,8 @@ class SaveImageInBackgroundData {
Runnable finisher;
int iconSize;
int result;
+ int previewWidth;
+ int previewheight;
void clearImage() {
image = null;
@@ -131,17 +133,19 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi
mImageWidth = data.image.getWidth();
mImageHeight = data.image.getHeight();
int iconSize = data.iconSize;
+ int previewWidth = data.previewWidth;
+ int previewHeight = data.previewheight;
final int shortSide = mImageWidth < mImageHeight ? mImageWidth : mImageHeight;
- Bitmap preview = Bitmap.createBitmap(shortSide, shortSide, data.image.getConfig());
+ Bitmap preview = Bitmap.createBitmap(previewWidth, previewHeight, data.image.getConfig());
Canvas c = new Canvas(preview);
Paint paint = new Paint();
ColorMatrix desat = new ColorMatrix();
desat.setSaturation(0.25f);
paint.setColorFilter(new ColorMatrixColorFilter(desat));
Matrix matrix = new Matrix();
- matrix.postTranslate((shortSide - mImageWidth) / 2,
- (shortSide - mImageHeight) / 2);
+ matrix.postTranslate((previewWidth - mImageWidth) / 2,
+ (previewHeight - mImageHeight) / 2);
c.drawBitmap(data.image, matrix, paint);
c.drawColor(0x40FFFFFF);
c.setBitmap(null);
@@ -343,6 +347,8 @@ class GlobalScreenshot {
private static final float SCREENSHOT_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.45f;
private static final float SCREENSHOT_FAST_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.6f;
private static final float SCREENSHOT_DROP_OUT_MIN_SCALE_OFFSET = 0f;
+ private final int mPreviewWidth;
+ private final int mPreviewHeight;
private Context mContext;
private WindowManager mWindowManager;
@@ -418,6 +424,16 @@ class GlobalScreenshot {
mBgPadding = (float) r.getDimensionPixelSize(R.dimen.global_screenshot_bg_padding);
mBgPaddingScale = mBgPadding / mDisplayMetrics.widthPixels;
+ // determine the optimal preview size
+ int panelWidth = 0;
+ try {
+ panelWidth = r.getDimensionPixelSize(R.dimen.notification_panel_width);
+ } catch (Resources.NotFoundException e) {
+ panelWidth = mDisplayMetrics.widthPixels;
+ }
+ mPreviewWidth = panelWidth;
+ mPreviewHeight = r.getDimensionPixelSize(R.dimen.notification_max_height);
+
// Setup the Camera shutter sound
mCameraSound = new MediaActionSound();
mCameraSound.load(MediaActionSound.SHUTTER_CLICK);
@@ -432,6 +448,8 @@ class GlobalScreenshot {
data.image = mScreenBitmap;
data.iconSize = mNotificationIconSize;
data.finisher = finisher;
+ data.previewWidth = mPreviewWidth;
+ data.previewheight = mPreviewHeight;
if (mSaveInBgTask != null) {
mSaveInBgTask.cancel(false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 4d7698a..1cd18a0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -43,7 +43,6 @@ import android.view.animation.LinearInterpolator;
import android.view.animation.PathInterpolator;
import com.android.systemui.R;
-import com.android.systemui.statusbar.stack.StackStateAnimator;
/**
* Base class for both {@link ExpandableNotificationRow} and {@link NotificationOverflowContainer}
@@ -449,19 +448,20 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
}
@Override
- public void performRemoveAnimation(float translationDirection, Runnable onFinishedRunnable) {
+ public void performRemoveAnimation(long duration, float translationDirection,
+ Runnable onFinishedRunnable) {
enableAppearDrawing(true);
if (mDrawingAppearAnimation) {
startAppearAnimation(false /* isAppearing */, translationDirection,
- 0, onFinishedRunnable);
+ 0, duration, onFinishedRunnable);
}
}
@Override
- public void performAddAnimation(long delay) {
+ public void performAddAnimation(long delay, long duration) {
enableAppearDrawing(true);
if (mDrawingAppearAnimation) {
- startAppearAnimation(true /* isAppearing */, -1.0f, delay, null);
+ startAppearAnimation(true /* isAppearing */, -1.0f, delay, duration, null);
}
}
@@ -470,8 +470,8 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
mScrimView.setAlpha(scrimAmount);
}
- private void startAppearAnimation(boolean isAppearing,
- float translationDirection, long delay, final Runnable onFinishedRunnable) {
+ private void startAppearAnimation(boolean isAppearing, float translationDirection, long delay,
+ long duration, final Runnable onFinishedRunnable) {
if (mAppearAnimator != null) {
mAppearAnimator.cancel();
}
@@ -501,8 +501,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
targetValue);
mAppearAnimator.setInterpolator(mLinearInterpolator);
mAppearAnimator.setDuration(
- (long) (StackStateAnimator.ANIMATION_DURATION_APPEAR_DISAPPEAR
- * Math.abs(mAppearAnimationFraction - targetValue)));
+ (long) (duration * Math.abs(mAppearAnimationFraction - targetValue)));
mAppearAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 4b037d2..03508ea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -1324,31 +1324,30 @@ public abstract class BaseStatusBar extends SystemUI implements
return entry.notification;
}
- protected NotificationData.Entry createNotificationViews(StatusBarNotification notification) {
+ protected NotificationData.Entry createNotificationViews(StatusBarNotification sbn) {
if (DEBUG) {
- Log.d(TAG, "createNotificationViews(notification=" + notification);
+ Log.d(TAG, "createNotificationViews(notification=" + sbn);
}
// Construct the icon.
+ Notification n = sbn.getNotification();
final StatusBarIconView iconView = new StatusBarIconView(mContext,
- notification.getPackageName() + "/0x" + Integer.toHexString(notification.getId()),
- notification.getNotification());
+ sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), n);
iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
- final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
- notification.getUser(),
- notification.getNotification().icon,
- notification.getNotification().iconLevel,
- notification.getNotification().number,
- notification.getNotification().tickerText);
+ final StatusBarIcon ic = new StatusBarIcon(sbn.getPackageName(),
+ sbn.getUser(),
+ n.icon,
+ n.iconLevel,
+ n.number,
+ n.tickerText);
if (!iconView.set(ic)) {
- handleNotificationError(notification, "Couldn't create icon: " + ic);
+ handleNotificationError(sbn, "Couldn't create icon: " + ic);
return null;
}
// Construct the expanded view.
- NotificationData.Entry entry = new NotificationData.Entry(notification, iconView);
+ NotificationData.Entry entry = new NotificationData.Entry(sbn, iconView);
if (!inflateViews(entry, mStackScroller)) {
- handleNotificationError(notification, "Couldn't expand RemoteViews for: "
- + notification);
+ handleNotificationError(sbn, "Couldn't expand RemoteViews for: " + sbn);
return null;
}
return entry;
@@ -1464,15 +1463,16 @@ public abstract class BaseStatusBar extends SystemUI implements
// XXX: modify when we do something more intelligent with the two content views
final RemoteViews oldContentView = oldNotification.getNotification().contentView;
- final RemoteViews contentView = notification.getNotification().contentView;
+ Notification n = notification.getNotification();
+ final RemoteViews contentView = n.contentView;
final RemoteViews oldBigContentView = oldNotification.getNotification().bigContentView;
- final RemoteViews bigContentView = notification.getNotification().bigContentView;
+ final RemoteViews bigContentView = n.bigContentView;
final RemoteViews oldHeadsUpContentView = oldNotification.getNotification().headsUpContentView;
- final RemoteViews headsUpContentView = notification.getNotification().headsUpContentView;
+ final RemoteViews headsUpContentView = n.headsUpContentView;
final Notification oldPublicNotification = oldNotification.getNotification().publicVersion;
final RemoteViews oldPublicContentView = oldPublicNotification != null
? oldPublicNotification.contentView : null;
- final Notification publicNotification = notification.getNotification().publicVersion;
+ final Notification publicNotification = n.publicVersion;
final RemoteViews publicContentView = publicNotification != null
? publicNotification.contentView : null;
@@ -1484,7 +1484,7 @@ public abstract class BaseStatusBar extends SystemUI implements
+ " bigContentView=" + oldBigContentView
+ " publicView=" + oldPublicContentView
+ " rowParent=" + oldEntry.row.getParent());
- Log.d(TAG, "new notification: when=" + notification.getNotification().when
+ Log.d(TAG, "new notification: when=" + n.when
+ " ongoing=" + oldNotification.isOngoing()
+ " contentView=" + contentView
+ " bigContentView=" + bigContentView
@@ -1521,8 +1521,8 @@ public abstract class BaseStatusBar extends SystemUI implements
&& oldPublicContentView.getPackage() != null
&& oldPublicContentView.getPackage().equals(publicContentView.getPackage())
&& oldPublicContentView.getLayoutId() == publicContentView.getLayoutId());
- boolean updateTicker = notification.getNotification().tickerText != null
- && !TextUtils.equals(notification.getNotification().tickerText,
+ boolean updateTicker = n.tickerText != null
+ && !TextUtils.equals(n.tickerText,
oldEntry.notification.getNotification().tickerText);
final boolean shouldInterrupt = shouldInterrupt(notification);
@@ -1537,10 +1537,11 @@ public abstract class BaseStatusBar extends SystemUI implements
// Update the icon
final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
notification.getUser(),
- notification.getNotification().icon,
- notification.getNotification().iconLevel,
- notification.getNotification().number,
- notification.getNotification().tickerText);
+ n.icon,
+ n.iconLevel,
+ n.number,
+ n.tickerText);
+ oldEntry.icon.setNotification(n);
if (!oldEntry.icon.set(ic)) {
handleNotificationError(notification, "Couldn't update icon: " + ic);
return;
@@ -1607,10 +1608,11 @@ public abstract class BaseStatusBar extends SystemUI implements
oldEntry.notification = notification;
final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
notification.getUser(),
- notification.getNotification().icon,
- notification.getNotification().iconLevel,
- notification.getNotification().number,
- notification.getNotification().tickerText);
+ n.icon,
+ n.iconLevel,
+ n.number,
+ n.tickerText);
+ oldEntry.icon.setNotification(n);
oldEntry.icon.set(ic);
inflateViews(oldEntry, mStackScroller, wasHeadsUp);
mNotificationData.updateRanking(ranking);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java b/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java
index d60c17f..9712ee2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java
@@ -116,12 +116,15 @@ public class DismissView extends ExpandableView {
}
@Override
- public void performRemoveAnimation(float translationDirection, Runnable onFinishedRunnable) {
+ public void performRemoveAnimation(long duration, float translationDirection,
+ Runnable onFinishedRunnable) {
+ // TODO: Use duration
performVisibilityAnimation(false);
}
@Override
- public void performAddAnimation(long delay) {
+ public void performAddAnimation(long delay, long duration) {
+ // TODO: use delay and duration
performVisibilityAnimation(true);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
index b71cd77..5cadd1e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
@@ -220,6 +220,7 @@ public abstract class ExpandableView extends FrameLayout {
/**
* Perform a remove animation on this view.
*
+ * @param duration The duration of the remove animation.
* @param translationDirection The direction value from [-1 ... 1] indicating in which the
* animation should be performed. A value of -1 means that The
* remove animation should be performed upwards,
@@ -227,10 +228,10 @@ public abstract class ExpandableView extends FrameLayout {
* Should mean the opposite.
* @param onFinishedRunnable A runnable which should be run when the animation is finished.
*/
- public abstract void performRemoveAnimation(float translationDirection,
+ public abstract void performRemoveAnimation(long duration, float translationDirection,
Runnable onFinishedRunnable);
- public abstract void performAddAnimation(long delay);
+ public abstract void performAddAnimation(long delay, long duration);
public abstract void setScrimAmount(float scrimAmount);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 8bae19a..fb13126 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -17,9 +17,6 @@
package com.android.systemui.statusbar;
import android.content.Context;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
@@ -36,16 +33,13 @@ public class SignalClusterView
extends LinearLayout
implements NetworkControllerImpl.SignalCluster {
- static final boolean DEBUG = false;
static final String TAG = "SignalClusterView";
- static final PorterDuffColorFilter PROBLEM_FILTER
- = new PorterDuffColorFilter(0xffab653b, PorterDuff.Mode.SRC_ATOP);
+ static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
NetworkControllerImpl mNC;
private boolean mWifiVisible = false;
private int mWifiStrengthId = 0;
- private boolean mInetProblem;
private boolean mMobileVisible = false;
private int mMobileStrengthId = 0, mMobileTypeId = 0;
private boolean mIsAirplaneMode = false;
@@ -102,22 +96,19 @@ public class SignalClusterView
}
@Override
- public void setWifiIndicators(boolean visible, int strengthIcon, boolean problem,
- String contentDescription) {
+ public void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription) {
mWifiVisible = visible;
mWifiStrengthId = strengthIcon;
- mInetProblem = problem;
mWifiDescription = contentDescription;
apply();
}
@Override
- public void setMobileDataIndicators(boolean visible, int strengthIcon, boolean problem,
- int typeIcon, String contentDescription, String typeContentDescription) {
+ public void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon,
+ String contentDescription, String typeContentDescription) {
mMobileVisible = visible;
mMobileStrengthId = strengthIcon;
- mInetProblem = problem;
mMobileTypeId = typeIcon;
mMobileDescription = contentDescription;
mMobileTypeDescription = typeContentDescription;
@@ -172,17 +163,12 @@ public class SignalClusterView
return false;
}
- private void applyInetProblem(ImageView iv) {
- iv.setColorFilter(Build.IS_DEBUGGABLE && mInetProblem ? PROBLEM_FILTER : null);
- }
-
// Run after each indicator change.
private void apply() {
if (mWifiGroup == null) return;
if (mWifiVisible) {
mWifi.setImageResource(mWifiStrengthId);
- applyInetProblem(mWifi);
mWifiGroup.setContentDescription(mWifiDescription);
mWifiGroup.setVisibility(View.VISIBLE);
} else {
@@ -197,7 +183,6 @@ public class SignalClusterView
if (mMobileVisible && !mIsAirplaneMode) {
mMobile.setImageResource(mMobileStrengthId);
mMobileType.setImageResource(mMobileTypeId);
- applyInetProblem(mMobile);
mMobileGroup.setContentDescription(mMobileTypeDescription + " " + mMobileDescription);
mMobileGroup.setVisibility(View.VISIBLE);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java
index dfeadc5..816612b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java
@@ -76,23 +76,25 @@ public class SpeedBumpView extends ExpandableView {
return true;
}
- public void performVisibilityAnimation(boolean nowVisible) {
- animateDivider(nowVisible, null /* onFinishedRunnable */);
+ public void performVisibilityAnimation(boolean nowVisible, long delay) {
+ animateDivider(nowVisible, delay, null /* onFinishedRunnable */);
}
/**
* Animate the divider to a new visibility.
*
* @param nowVisible should it now be visible
+ * @param delay the delay after the animation should start
* @param onFinishedRunnable A runnable which should be run when the animation is
* finished.
*/
- public void animateDivider(boolean nowVisible, Runnable onFinishedRunnable) {
+ public void animateDivider(boolean nowVisible, long delay, Runnable onFinishedRunnable) {
if (nowVisible != mIsVisible) {
// Animate dividers
float endValue = nowVisible ? 1.0f : 0.0f;
mLine.animate()
.alpha(endValue)
+ .setStartDelay(delay)
.scaleX(endValue)
.scaleY(endValue)
.setInterpolator(mFastOutSlowInInterpolator)
@@ -113,13 +115,16 @@ public class SpeedBumpView extends ExpandableView {
}
@Override
- public void performRemoveAnimation(float translationDirection, Runnable onFinishedRunnable) {
- performVisibilityAnimation(false);
+ public void performRemoveAnimation(long duration, float translationDirection,
+ Runnable onFinishedRunnable) {
+ // TODO: Use duration
+ performVisibilityAnimation(false, 0 /* delay */);
}
@Override
- public void performAddAnimation(long delay) {
- performVisibilityAnimation(true);
+ public void performAddAnimation(long delay, long duration) {
+ // TODO: Use duration
+ performVisibilityAnimation(true, delay);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 6f839bd..20dd3e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -57,8 +57,7 @@ public class StatusBarIconView extends AnimatedImageView {
mNumberPain.setTextAlign(Paint.Align.CENTER);
mNumberPain.setColor(res.getColor(R.drawable.notification_number_text_color));
mNumberPain.setAntiAlias(true);
- mNotification = notification;
- setContentDescription(notification);
+ setNotification(notification);
// We do not resize and scale system icons (on the right), only notification icons (on the
// left).
@@ -73,6 +72,11 @@ public class StatusBarIconView extends AnimatedImageView {
setScaleType(ImageView.ScaleType.CENTER);
}
+ public void setNotification(Notification notification) {
+ mNotification = notification;
+ setContentDescription(notification);
+ }
+
public StatusBarIconView(Context context, AttributeSet attrs) {
super(context, attrs);
final Resources res = context.getResources();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 602b914..4f9d4a3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -139,7 +139,7 @@ public class NotificationPanelView extends PanelView implements
private boolean mIsLaunchTransitionRunning;
private Runnable mLaunchAnimationEndRunnable;
private boolean mOnlyAffordanceInThisMotion;
- private boolean mKeyguardStatusBarAnimatingIn;
+ private boolean mKeyguardStatusViewAnimating;
public NotificationPanelView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -285,7 +285,9 @@ public class NotificationPanelView extends PanelView implements
}
private void updateClock(float alpha, float scale) {
- mKeyguardStatusView.setAlpha(alpha);
+ if (!mKeyguardStatusViewAnimating) {
+ mKeyguardStatusView.setAlpha(alpha);
+ }
mKeyguardStatusView.setScaleX(scale);
mKeyguardStatusView.setScaleY(scale);
}
@@ -671,7 +673,7 @@ public class NotificationPanelView extends PanelView implements
}
}
- public void setBarState(int statusBarState) {
+ public void setBarState(int statusBarState, boolean keyguardFadingAway) {
boolean keyguardShowing = statusBarState == StatusBarState.KEYGUARD
|| statusBarState == StatusBarState.SHADE_LOCKED;
mKeyguardStatusBar.setAlpha(1f);
@@ -680,11 +682,59 @@ public class NotificationPanelView extends PanelView implements
setQsTranslation(mQsExpansionHeight);
mHeader.setTranslationY(0f);
}
+ setKeyguardStatusViewVisibility(statusBarState, keyguardFadingAway);
mStatusBarState = statusBarState;
mKeyguardShowing = keyguardShowing;
updateQsState();
}
+ private final Runnable mAnimateKeyguardStatusViewInvisibleEndRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardStatusViewAnimating = false;
+ mKeyguardStatusView.setVisibility(View.GONE);
+ }
+ };
+
+ private final Runnable mAnimateKeyguardStatusViewVisibleEndRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardStatusViewAnimating = false;
+ }
+ };
+
+ private void setKeyguardStatusViewVisibility(int statusBarState, boolean keyguardFadingAway) {
+ if (!keyguardFadingAway && mStatusBarState == StatusBarState.KEYGUARD
+ && statusBarState != StatusBarState.KEYGUARD) {
+ mKeyguardStatusView.animate().cancel();
+ mKeyguardStatusViewAnimating = true;
+ mKeyguardStatusView.animate()
+ .alpha(0f)
+ .setDuration(160)
+ .setInterpolator(PhoneStatusBar.ALPHA_OUT)
+ .withEndAction(mAnimateKeyguardStatusViewInvisibleEndRunnable);
+ } else if (mStatusBarState == StatusBarState.SHADE_LOCKED
+ && statusBarState == StatusBarState.KEYGUARD) {
+ mKeyguardStatusView.animate().cancel();
+ mKeyguardStatusView.setVisibility(View.VISIBLE);
+ mKeyguardStatusViewAnimating = true;
+ mKeyguardStatusView.setAlpha(0f);
+ mKeyguardStatusView.animate()
+ .alpha(1f)
+ .setDuration(320)
+ .setInterpolator(PhoneStatusBar.ALPHA_IN)
+ .withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable);
+ } else if (statusBarState == StatusBarState.KEYGUARD) {
+ mKeyguardStatusView.animate().cancel();
+ mKeyguardStatusView.setVisibility(View.VISIBLE);
+ mKeyguardStatusView.setAlpha(1f);
+ } else {
+ mKeyguardStatusView.animate().cancel();
+ mKeyguardStatusView.setVisibility(View.GONE);
+ mKeyguardStatusView.setAlpha(1f);
+ }
+ }
+
private void updateQsState() {
boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling;
mHeader.setVisibility((mQsExpanded || !mKeyguardShowing) ? View.VISIBLE : View.INVISIBLE);
@@ -1076,7 +1126,7 @@ public class NotificationPanelView extends PanelView implements
}
alpha = Math.max(0, Math.min(alpha, 1));
alpha = (float) Math.pow(alpha, 0.75);
- if (!mQsExpanded && !mKeyguardStatusBarAnimatingIn) {
+ if (!mQsExpanded) {
mKeyguardStatusBar.setAlpha(alpha);
}
mKeyguardBottomArea.setAlpha(alpha);
@@ -1374,6 +1424,14 @@ public class NotificationPanelView extends PanelView implements
return mQsExpanded;
}
+ public boolean isQsDetailShowing() {
+ return mQsPanel.isShowingDetail();
+ }
+
+ public void closeQsDetail() {
+ mQsPanel.closeDetail();
+ }
+
@Override
public boolean shouldDelayChildPressedState() {
return true;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 0284036..06c7be2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -2969,6 +2969,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
private void setHeadsUpVisibility(boolean vis) {
if (!ENABLE_HEADS_UP) return;
if (DEBUG) Log.v(TAG, (vis ? "showing" : "hiding") + " heads up window");
+ EventLog.writeEvent(EventLogTags.SYSUI_HEADS_UP_STATUS,
+ vis ? mHeadsUpNotificationView.getKey() : "",
+ vis ? 1 : 0);
mHeadsUpNotificationView.setVisibility(vis ? View.VISIBLE : View.GONE);
}
@@ -3379,12 +3382,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
private void updateKeyguardState() {
if (mState == StatusBarState.KEYGUARD) {
- mKeyguardStatusView.setVisibility(View.VISIBLE);
mKeyguardIndicationController.setVisible(true);
mNotificationPanel.resetViews();
mKeyguardUserSwitcher.setKeyguard(true);
} else {
- mKeyguardStatusView.setVisibility(View.GONE);
mKeyguardIndicationController.setVisible(false);
mKeyguardUserSwitcher.setKeyguard(false);
}
@@ -3395,7 +3396,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mKeyguardBottomArea.setVisibility(View.GONE);
mScrimController.setKeyguardShowing(false);
}
- mNotificationPanel.setBarState(mState);
+ mNotificationPanel.setBarState(mState, mKeyguardFadingAway);
updateDozingState();
updateStackScrollerState();
updatePublicMode();
@@ -3457,7 +3458,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
return true;
}
if (mNotificationPanel.isQsExpanded()) {
- mNotificationPanel.animateCloseQs();
+ if (mNotificationPanel.isQsDetailShowing()) {
+ mNotificationPanel.closeQsDetail();
+ } else {
+ mNotificationPanel.animateCloseQs();
+ }
return true;
}
if (mState != StatusBarState.KEYGUARD && mState != StatusBarState.SHADE_LOCKED) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
index ac260db..c2fa68f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
@@ -338,6 +338,10 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.
mBar.scheduleHeadsUpEscalation();
}
+ public String getKey() {
+ return mHeadsUp == null ? null : mHeadsUp.notification.getKey();
+ }
+
private class EdgeSwipeHelper implements Gefingerpoken {
private static final boolean DEBUG_EDGE_SWIPE = false;
private final float mTouchSlop;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 4fc2e06..dbf0c32 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -163,10 +163,9 @@ public class NetworkControllerImpl extends BroadcastReceiver
boolean mDataAndWifiStacked = false;
public interface SignalCluster {
- void setWifiIndicators(boolean visible, int strengthIcon, boolean problem,
- String contentDescription);
- void setMobileDataIndicators(boolean visible, int strengthIcon, boolean problem,
- int typeIcon, String contentDescription, String typeContentDescription);
+ void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription);
+ void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon,
+ String contentDescription, String typeContentDescription);
void setIsAirplaneMode(boolean is, int airplaneIcon);
}
@@ -365,7 +364,6 @@ public class NetworkControllerImpl extends BroadcastReceiver
// only show wifi in the cluster if connected or if wifi-only
mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature),
mWifiIconId,
- mInetCondition == 0,
mContentDescriptionWifi);
if (mIsWimaxEnabled && mWimaxConnected) {
@@ -373,7 +371,6 @@ public class NetworkControllerImpl extends BroadcastReceiver
cluster.setMobileDataIndicators(
true,
mAlwaysShowCdmaRssi ? mPhoneSignalIconId : mWimaxIconId,
- mInetCondition == 0,
mDataTypeIconId,
mContentDescriptionWimax,
mContentDescriptionDataType);
@@ -382,7 +379,6 @@ public class NetworkControllerImpl extends BroadcastReceiver
cluster.setMobileDataIndicators(
mHasMobileDataFeature,
mShowPhoneRSSIForData ? mPhoneSignalIconId : mDataSignalIconId,
- mInetCondition == 0,
mDataTypeIconId,
mContentDescriptionPhoneSignal,
mContentDescriptionDataType);
@@ -1202,6 +1198,14 @@ public class NetworkControllerImpl extends BroadcastReceiver
}
}
+ if (mDemoMode) {
+ mQSWifiIconId = mDemoWifiLevel < 0 ? R.drawable.ic_qs_wifi_no_network
+ : WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mDemoInetCondition][mDemoWifiLevel];
+ mQSPhoneSignalIconId = mDemoMobileLevel < 0 ? R.drawable.ic_qs_signal_no_signal :
+ TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[mDemoInetCondition][mDemoMobileLevel];
+ mQSDataTypeIconId = mDemoQSDataTypeIconId;
+ }
+
if (DEBUG) {
Log.d(TAG, "refreshViews connected={"
+ (mWifiConnected?" wifi":"")
@@ -1473,6 +1477,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
private int mDemoInetCondition;
private int mDemoWifiLevel;
private int mDemoDataTypeIconId;
+ private int mDemoQSDataTypeIconId;
private int mDemoMobileLevel;
@Override
@@ -1482,12 +1487,14 @@ public class NetworkControllerImpl extends BroadcastReceiver
mDemoWifiLevel = mWifiLevel;
mDemoInetCondition = mInetCondition;
mDemoDataTypeIconId = mDataTypeIconId;
+ mDemoQSDataTypeIconId = mQSDataTypeIconId;
mDemoMobileLevel = mLastSignalLevel;
} else if (mDemoMode && command.equals(COMMAND_EXIT)) {
mDemoMode = false;
for (SignalCluster cluster : mSignalClusters) {
refreshSignalCluster(cluster);
}
+ refreshViews();
} else if (mDemoMode && command.equals(COMMAND_NETWORK)) {
String airplane = args.getString("airplane");
if (airplane != null) {
@@ -1514,9 +1521,9 @@ public class NetworkControllerImpl extends BroadcastReceiver
cluster.setWifiIndicators(
show,
iconId,
- mDemoInetCondition == 0,
"Demo");
}
+ refreshViews();
}
String mobile = args.getString("mobile");
if (mobile != null) {
@@ -1534,6 +1541,16 @@ public class NetworkControllerImpl extends BroadcastReceiver
datatype.equals("roam")
? R.drawable.stat_sys_data_fully_connected_roam :
0;
+ mDemoQSDataTypeIconId =
+ datatype.equals("1x") ? R.drawable.ic_qs_signal_1x :
+ datatype.equals("3g") ? R.drawable.ic_qs_signal_3g :
+ datatype.equals("4g") ? R.drawable.ic_qs_signal_4g :
+ datatype.equals("e") ? R.drawable.ic_qs_signal_e :
+ datatype.equals("g") ? R.drawable.ic_qs_signal_g :
+ datatype.equals("h") ? R.drawable.ic_qs_signal_h :
+ datatype.equals("lte") ? R.drawable.ic_qs_signal_lte :
+ datatype.equals("roam") ? R.drawable.ic_qs_signal_r :
+ 0;
}
int[][] icons = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH;
String level = args.getString("level");
@@ -1547,11 +1564,11 @@ public class NetworkControllerImpl extends BroadcastReceiver
cluster.setMobileDataIndicators(
show,
iconId,
- mDemoInetCondition == 0,
mDemoDataTypeIconId,
"Demo",
"Demo");
}
+ refreshViews();
}
}
}
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 67ba879..84c53ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -23,11 +23,11 @@ class TelephonyIcons {
//GSM/UMTS
static final int[][] TELEPHONY_SIGNAL_STRENGTH = {
- { R.drawable.stat_sys_signal_0_fully,
- R.drawable.stat_sys_signal_1_fully,
- R.drawable.stat_sys_signal_2_fully,
- R.drawable.stat_sys_signal_3_fully,
- R.drawable.stat_sys_signal_4_fully },
+ { R.drawable.stat_sys_signal_0,
+ R.drawable.stat_sys_signal_1,
+ R.drawable.stat_sys_signal_2,
+ R.drawable.stat_sys_signal_3,
+ R.drawable.stat_sys_signal_4 },
{ R.drawable.stat_sys_signal_0_fully,
R.drawable.stat_sys_signal_1_fully,
R.drawable.stat_sys_signal_2_fully,
@@ -49,11 +49,11 @@ class TelephonyIcons {
};
static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING = {
- { R.drawable.stat_sys_signal_0_fully,
- R.drawable.stat_sys_signal_1_fully,
- R.drawable.stat_sys_signal_2_fully,
- R.drawable.stat_sys_signal_3_fully,
- R.drawable.stat_sys_signal_4_fully },
+ { R.drawable.stat_sys_signal_0,
+ R.drawable.stat_sys_signal_1,
+ R.drawable.stat_sys_signal_2,
+ R.drawable.stat_sys_signal_3,
+ R.drawable.stat_sys_signal_4 },
{ R.drawable.stat_sys_signal_0_fully,
R.drawable.stat_sys_signal_1_fully,
R.drawable.stat_sys_signal_2_fully,
@@ -63,7 +63,7 @@ class TelephonyIcons {
static final int[] QS_DATA_R = {
R.drawable.ic_qs_signal_r,
- R.drawable.ic_qs_signal_full_r
+ R.drawable.ic_qs_signal_r
};
static final int[][] DATA_SIGNAL_STRENGTH = TELEPHONY_SIGNAL_STRENGTH;
@@ -84,7 +84,7 @@ class TelephonyIcons {
static final int[] QS_DATA_G = {
R.drawable.ic_qs_signal_g,
- R.drawable.ic_qs_signal_full_g
+ R.drawable.ic_qs_signal_g
};
static final int[][] DATA_3G = {
@@ -100,7 +100,7 @@ class TelephonyIcons {
static final int[] QS_DATA_3G = {
R.drawable.ic_qs_signal_3g,
- R.drawable.ic_qs_signal_full_3g
+ R.drawable.ic_qs_signal_3g
};
static final int[][] DATA_E = {
@@ -116,7 +116,7 @@ class TelephonyIcons {
static final int[] QS_DATA_E = {
R.drawable.ic_qs_signal_e,
- R.drawable.ic_qs_signal_full_e
+ R.drawable.ic_qs_signal_e
};
//3.5G
@@ -133,7 +133,7 @@ class TelephonyIcons {
static final int[] QS_DATA_H = {
R.drawable.ic_qs_signal_h,
- R.drawable.ic_qs_signal_full_h
+ R.drawable.ic_qs_signal_h
};
//CDMA
@@ -151,7 +151,7 @@ class TelephonyIcons {
static final int[] QS_DATA_1X = {
R.drawable.ic_qs_signal_1x,
- R.drawable.ic_qs_signal_full_1x
+ R.drawable.ic_qs_signal_1x
};
// LTE and eHRPD
@@ -168,7 +168,7 @@ class TelephonyIcons {
static final int[] QS_DATA_4G = {
R.drawable.ic_qs_signal_4g,
- R.drawable.ic_qs_signal_full_4g
+ R.drawable.ic_qs_signal_4g
};
// LTE branded "LTE"
@@ -185,7 +185,7 @@ class TelephonyIcons {
static final int[] QS_DATA_LTE = {
R.drawable.ic_qs_signal_lte,
- R.drawable.ic_qs_signal_full_lte
+ R.drawable.ic_qs_signal_lte
};
}
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 57ddf7a..49af979 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
@@ -21,11 +21,11 @@ import com.android.systemui.R;
class WifiIcons {
static final int[][] WIFI_SIGNAL_STRENGTH = {
{ R.drawable.stat_sys_wifi_signal_0,
- R.drawable.stat_sys_wifi_signal_1_fully,
- R.drawable.stat_sys_wifi_signal_2_fully,
- R.drawable.stat_sys_wifi_signal_3_fully,
- R.drawable.stat_sys_wifi_signal_4_fully },
- { R.drawable.stat_sys_wifi_signal_0,
+ R.drawable.stat_sys_wifi_signal_1,
+ R.drawable.stat_sys_wifi_signal_2,
+ R.drawable.stat_sys_wifi_signal_3,
+ R.drawable.stat_sys_wifi_signal_4 },
+ { R.drawable.stat_sys_wifi_signal_0_fully,
R.drawable.stat_sys_wifi_signal_1_fully,
R.drawable.stat_sys_wifi_signal_2_fully,
R.drawable.stat_sys_wifi_signal_3_fully,
@@ -38,7 +38,7 @@ class WifiIcons {
R.drawable.ic_qs_wifi_2,
R.drawable.ic_qs_wifi_3,
R.drawable.ic_qs_wifi_4 },
- { R.drawable.ic_qs_wifi_0,
+ { R.drawable.ic_qs_wifi_full_0,
R.drawable.ic_qs_wifi_full_1,
R.drawable.ic_qs_wifi_full_2,
R.drawable.ic_qs_wifi_full_3,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
index 99d3a01..2709384 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
@@ -31,6 +31,7 @@ public class AnimationFilter {
boolean animateDimmed;
boolean animateDark;
boolean hasDelays;
+ boolean hasGoToFullShadeEvent;
public AnimationFilter animateAlpha() {
animateAlpha = true;
@@ -87,6 +88,10 @@ public class AnimationFilter {
int size = events.size();
for (int i = 0; i < size; i++) {
combineFilter(events.get(i).filter);
+ if (events.get(i).animationType ==
+ NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_GO_TO_FULL_SHADE) {
+ hasGoToFullShadeEvent = true;
+ }
}
}
@@ -112,5 +117,6 @@ public class AnimationFilter {
animateDimmed = false;
animateDark = false;
hasDelays = false;
+ hasGoToFullShadeEvent = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index e0167e9..aa41b9c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -133,6 +133,7 @@ public class NotificationStackScrollLayout extends ViewGroup
private boolean mDimmedNeedsAnimation;
private boolean mDarkNeedsAnimation;
private boolean mActivateNeedsAnimation;
+ private boolean mGoToFullShadeNeedsAnimation;
private boolean mIsExpanded = true;
private boolean mChildrenUpdateRequested;
private SpeedBumpView mSpeedBumpView;
@@ -1214,6 +1215,9 @@ public class NotificationStackScrollLayout extends ViewGroup
count++;
}
}
+ if (mDismissView.willBeGone()) {
+ count--;
+ }
return count;
}
@@ -1573,6 +1577,7 @@ public class NotificationStackScrollLayout extends ViewGroup
generateActivateEvent();
generateDimmedEvent();
generateDarkEvent();
+ generateGoToFullShadeEvent();
mNeedsAnimation = false;
}
@@ -1656,6 +1661,14 @@ public class NotificationStackScrollLayout extends ViewGroup
mDarkNeedsAnimation = false;
}
+ private void generateGoToFullShadeEvent() {
+ if (mGoToFullShadeNeedsAnimation) {
+ mAnimationEvents.add(
+ new AnimationEvent(null, AnimationEvent.ANIMATION_TYPE_GO_TO_FULL_SHADE));
+ }
+ mGoToFullShadeNeedsAnimation = false;
+ }
+
private boolean onInterceptTouchEventScroll(MotionEvent ev) {
if (!isScrollingEnabled()) {
return false;
@@ -1919,11 +1932,8 @@ public class NotificationStackScrollLayout extends ViewGroup
if (visible) {
// Make invisible to ensure that the appear animation is played.
mSpeedBumpView.setInvisible();
- if (!mIsExpansionChanging) {
- generateAddAnimation(mSpeedBumpView);
- }
} else {
- mSpeedBumpView.performVisibilityAnimation(false);
+ // TODO: This doesn't really work, because the view is already set to GONE above.
generateRemoveAnimation(mSpeedBumpView);
}
}
@@ -1932,6 +1942,9 @@ public class NotificationStackScrollLayout extends ViewGroup
public void goToFullShade() {
updateSpeedBump(true /* visibility */);
mDismissView.setInvisible();
+ mGoToFullShadeNeedsAnimation = true;
+ mNeedsAnimation = true;
+ requestChildrenUpdate();
}
public void cancelExpandHelper() {
@@ -2128,6 +2141,16 @@ public class NotificationStackScrollLayout extends ViewGroup
// ANIMATION_TYPE_DARK
new AnimationFilter()
.animateDark(),
+
+ // ANIMATION_TYPE_GO_TO_FULL_SHADE
+ new AnimationFilter()
+ .animateAlpha()
+ .animateHeight()
+ .animateTopInset()
+ .animateY()
+ .animateDimmed()
+ .animateScale()
+ .animateZ(),
};
static int[] LENGTHS = new int[] {
@@ -2161,6 +2184,9 @@ public class NotificationStackScrollLayout extends ViewGroup
// ANIMATION_TYPE_DARK
StackStateAnimator.ANIMATION_DURATION_STANDARD,
+
+ // ANIMATION_TYPE_GO_TO_FULL_SHADE
+ StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE,
};
static final int ANIMATION_TYPE_ADD = 0;
@@ -2173,6 +2199,7 @@ public class NotificationStackScrollLayout extends ViewGroup
static final int ANIMATION_TYPE_DIMMED = 7;
static final int ANIMATION_TYPE_CHANGE_POSITION = 8;
static final int ANIMATION_TYPE_DARK = 9;
+ static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 10;
final long eventStartTime;
final View changingView;
@@ -2193,13 +2220,18 @@ public class NotificationStackScrollLayout extends ViewGroup
* Combines the length of several animation events into a single value.
*
* @param events The events of the lengths to combine.
- * @return The combined length. This is just the maximum of all length.
+ * @return The combined length. Depending on the event types, this might be the maximum of
+ * all events or the length of a specific event.
*/
static long combineLength(ArrayList<AnimationEvent> events) {
long length = 0;
int size = events.size();
for (int i = 0; i < size; i++) {
- length = Math.max(length, events.get(i).length);
+ AnimationEvent event = events.get(i);
+ length = Math.max(length, event.length);
+ if (event.animationType == ANIMATION_TYPE_GO_TO_FULL_SHADE) {
+ return event.length;
+ }
}
return length;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
index 7b90a351..d0064c8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
@@ -171,8 +171,7 @@ public class StackScrollState {
updateChildClip(child, newHeight, state.topOverLap);
if(child instanceof SpeedBumpView) {
- float lineEnd = newYTranslation + newHeight / 2;
- performSpeedBumpAnimation(i, (SpeedBumpView) child, lineEnd);
+ performSpeedBumpAnimation(i, (SpeedBumpView) child, state, 0);
} else if (child instanceof DismissView) {
DismissView dismissView = (DismissView) child;
boolean visible = state.topOverLap < mClearAllTopPadding;
@@ -197,12 +196,14 @@ public class StackScrollState {
child.setClipBounds(mClipRect);
}
- private void performSpeedBumpAnimation(int i, SpeedBumpView speedBump, float speedBumpEnd) {
+ public void performSpeedBumpAnimation(int i, SpeedBumpView speedBump, ViewState state,
+ long delay) {
View nextChild = getNextChildNotGone(i);
if (nextChild != null) {
+ float lineEnd = state.yTranslation + state.height / 2;
ViewState nextState = getViewStateForView(nextChild);
- boolean startIsAboveNext = nextState.yTranslation > speedBumpEnd;
- speedBump.animateDivider(startIsAboveNext, null /* onFinishedRunnable */);
+ boolean startIsAboveNext = nextState.yTranslation > lineEnd;
+ speedBump.animateDivider(startIsAboveNext, delay, null /* onFinishedRunnable */);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
index 71524ec..edc669e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
@@ -27,6 +27,7 @@ import android.view.animation.Interpolator;
import com.android.systemui.R;
import com.android.systemui.statusbar.ExpandableView;
+import com.android.systemui.statusbar.SpeedBumpView;
import java.util.ArrayList;
import java.util.HashSet;
@@ -39,10 +40,12 @@ import java.util.Stack;
public class StackStateAnimator {
public static final int ANIMATION_DURATION_STANDARD = 360;
+ public static final int ANIMATION_DURATION_GO_TO_FULL_SHADE = 448;
public static final int ANIMATION_DURATION_APPEAR_DISAPPEAR = 464;
public static final int ANIMATION_DURATION_DIMMED_ACTIVATED = 220;
public static final int ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING = 80;
public static final int ANIMATION_DELAY_PER_ELEMENT_MANUAL = 32;
+ public static final int ANIMATION_DELAY_PER_ELEMENT_GO_TO_FULL_SHADE = 48;
private static final int DELAY_EFFECT_MAX_INDEX_DIFFERENCE = 2;
private static final int TAG_ANIMATOR_TRANSLATION_Y = R.id.translation_y_animator_tag;
@@ -65,16 +68,19 @@ public class StackStateAnimator {
private static final int TAG_START_TOP_INSET = R.id.top_inset_animator_start_value_tag;
private final Interpolator mFastOutSlowInInterpolator;
+ private final int mGoToFullShadeAppearingTranslation;
public NotificationStackScrollLayout mHostLayout;
private ArrayList<NotificationStackScrollLayout.AnimationEvent> mNewEvents =
new ArrayList<>();
private ArrayList<View> mNewAddChildren = new ArrayList<>();
- private Set<Animator> mAnimatorSet = new HashSet<Animator>();
- private Stack<AnimatorListenerAdapter> mAnimationListenerPool
- = new Stack<AnimatorListenerAdapter>();
+ private Set<Animator> mAnimatorSet = new HashSet<>();
+ private Stack<AnimatorListenerAdapter> mAnimationListenerPool = new Stack<>();
private AnimationFilter mAnimationFilter = new AnimationFilter();
private long mCurrentLength;
+ /** The current index for the last child which was not added in this event set. */
+ private int mCurrentLastNotAddedIndex;
+
private ValueAnimator mTopOverScrollAnimator;
private ValueAnimator mBottomOverScrollAnimator;
@@ -82,6 +88,9 @@ public class StackStateAnimator {
mHostLayout = hostLayout;
mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(hostLayout.getContext(),
android.R.interpolator.fast_out_slow_in);
+ mGoToFullShadeAppearingTranslation =
+ hostLayout.getContext().getResources().getDimensionPixelSize(
+ R.dimen.go_to_full_shade_appearing_translation);
}
public boolean isRunning() {
@@ -97,6 +106,7 @@ public class StackStateAnimator {
int childCount = mHostLayout.getChildCount();
mAnimationFilter.applyCombination(mNewEvents);
mCurrentLength = NotificationStackScrollLayout.AnimationEvent.combineLength(mNewEvents);
+ mCurrentLastNotAddedIndex = findLastNotAddedIndex(finalState);
for (int i = 0; i < childCount; i++) {
final ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i);
@@ -106,7 +116,7 @@ public class StackStateAnimator {
}
child.setClipBounds(null);
- startAnimations(child, viewState, finalState);
+ startAnimations(child, viewState, finalState, i);
}
if (!isRunning()) {
// no child has preformed any animation, lets finish
@@ -116,11 +126,27 @@ public class StackStateAnimator {
mNewAddChildren.clear();
}
+ private int findLastNotAddedIndex(StackScrollState finalState) {
+ int childCount = mHostLayout.getChildCount();
+ for (int i = childCount - 1; i >= 0; i--) {
+ final ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i);
+
+ StackScrollState.ViewState viewState = finalState.getViewStateForView(child);
+ if (viewState == null || child.getVisibility() == View.GONE) {
+ continue;
+ }
+ if (!mNewAddChildren.contains(child)) {
+ return viewState.notGoneIndex;
+ }
+ }
+ return -1;
+ }
+
/**
* Start an animation to the given viewState
*/
private void startAnimations(final ExpandableView child, StackScrollState.ViewState viewState,
- StackScrollState finalState) {
+ StackScrollState finalState, int i) {
int childVisibility = child.getVisibility();
boolean wasVisible = childVisibility == View.VISIBLE;
final float alpha = viewState.alpha;
@@ -139,38 +165,48 @@ public class StackStateAnimator {
boolean isDelayRelevant = yTranslationChanging || zTranslationChanging || scaleChanging ||
alphaChanging || heightChanging || topInsetChanging;
long delay = 0;
+ long duration = mCurrentLength;
if (hasDelays && isDelayRelevant || wasAdded) {
delay = calculateChildAnimationDelay(viewState, finalState);
}
+ if (wasAdded && mAnimationFilter.hasGoToFullShadeEvent) {
+ child.setTranslationY(child.getTranslationY() + mGoToFullShadeAppearingTranslation);
+ yTranslationChanging = true;
+ float longerDurationFactor = viewState.notGoneIndex - mCurrentLastNotAddedIndex;
+ longerDurationFactor = (float) Math.pow(longerDurationFactor, 0.7f);
+ duration = ANIMATION_DURATION_APPEAR_DISAPPEAR + 50 +
+ (long) (100 * longerDurationFactor);
+ }
+
// start translationY animation
if (yTranslationChanging) {
- startYTranslationAnimation(child, viewState, delay);
+ startYTranslationAnimation(child, viewState, duration, delay);
}
// start translationZ animation
if (zTranslationChanging) {
- startZTranslationAnimation(child, viewState, delay);
+ startZTranslationAnimation(child, viewState, duration, delay);
}
// start scale animation
if (scaleChanging) {
- startScaleAnimation(child, viewState);
+ startScaleAnimation(child, viewState, duration);
}
// start alpha animation
if (alphaChanging && child.getTranslationX() == 0) {
- startAlphaAnimation(child, viewState, delay);
+ startAlphaAnimation(child, viewState, duration, delay);
}
// start height animation
if (heightChanging) {
- startHeightAnimation(child, viewState, delay);
+ startHeightAnimation(child, viewState, duration, delay);
}
// start top inset animation
if (topInsetChanging) {
- startInsetAnimation(child, viewState, delay);
+ startInsetAnimation(child, viewState, duration, delay);
}
// start dimmed animation
@@ -186,12 +222,19 @@ public class StackStateAnimator {
child.setScrimAmount(viewState.scrimAmount);
if (wasAdded) {
- child.performAddAnimation(delay);
+ child.performAddAnimation(delay, mCurrentLength);
+ }
+ if (child instanceof SpeedBumpView) {
+ finalState.performSpeedBumpAnimation(i, (SpeedBumpView) child, viewState,
+ delay + duration);
}
}
private long calculateChildAnimationDelay(StackScrollState.ViewState viewState,
StackScrollState finalState) {
+ if (mAnimationFilter.hasGoToFullShadeEvent) {
+ return calculateDelayGoToFullShade(viewState);
+ }
long minDelay = 0;
for (NotificationStackScrollLayout.AnimationEvent event : mNewEvents) {
long delayPerElement = ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING;
@@ -236,8 +279,14 @@ public class StackStateAnimator {
return minDelay;
}
+ private long calculateDelayGoToFullShade(StackScrollState.ViewState viewState) {
+ float index = viewState.notGoneIndex;
+ index = (float) Math.pow(index, 0.7f);
+ return (long) (index * ANIMATION_DELAY_PER_ELEMENT_GO_TO_FULL_SHADE);
+ }
+
private void startHeightAnimation(final ExpandableView child,
- StackScrollState.ViewState viewState, long delay) {
+ StackScrollState.ViewState viewState, long duration, long delay) {
Integer previousStartValue = getChildTag(child, TAG_START_HEIGHT);
Integer previousEndValue = getChildTag(child, TAG_END_HEIGHT);
int newEndValue = viewState.height;
@@ -274,7 +323,7 @@ public class StackStateAnimator {
}
});
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -296,7 +345,7 @@ public class StackStateAnimator {
}
private void startInsetAnimation(final ExpandableView child,
- StackScrollState.ViewState viewState, long delay) {
+ StackScrollState.ViewState viewState, long duration, long delay) {
Integer previousStartValue = getChildTag(child, TAG_START_TOP_INSET);
Integer previousEndValue = getChildTag(child, TAG_END_TOP_INSET);
int newEndValue = viewState.clipTopAmount;
@@ -332,7 +381,7 @@ public class StackStateAnimator {
}
});
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -354,7 +403,7 @@ public class StackStateAnimator {
}
private void startAlphaAnimation(final ExpandableView child,
- final StackScrollState.ViewState viewState, long delay) {
+ final StackScrollState.ViewState viewState, long duration, long delay) {
Float previousStartValue = getChildTag(child,TAG_START_ALPHA);
Float previousEndValue = getChildTag(child,TAG_END_ALPHA);
final float newEndValue = viewState.alpha;
@@ -413,7 +462,7 @@ public class StackStateAnimator {
mWasCancelled = false;
}
});
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -433,7 +482,7 @@ public class StackStateAnimator {
}
private void startZTranslationAnimation(final ExpandableView child,
- final StackScrollState.ViewState viewState, long delay) {
+ final StackScrollState.ViewState viewState, long duration, long delay) {
Float previousStartValue = getChildTag(child,TAG_START_TRANSLATION_Z);
Float previousEndValue = getChildTag(child,TAG_END_TRANSLATION_Z);
float newEndValue = viewState.zTranslation;
@@ -463,7 +512,7 @@ public class StackStateAnimator {
ObjectAnimator animator = ObjectAnimator.ofFloat(child, View.TRANSLATION_Z,
child.getTranslationZ(), newEndValue);
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -485,7 +534,7 @@ public class StackStateAnimator {
}
private void startYTranslationAnimation(final ExpandableView child,
- StackScrollState.ViewState viewState, long delay) {
+ StackScrollState.ViewState viewState, long duration, long delay) {
Float previousStartValue = getChildTag(child,TAG_START_TRANSLATION_Y);
Float previousEndValue = getChildTag(child,TAG_END_TRANSLATION_Y);
float newEndValue = viewState.yTranslation;
@@ -516,7 +565,7 @@ public class StackStateAnimator {
ObjectAnimator animator = ObjectAnimator.ofFloat(child, View.TRANSLATION_Y,
child.getTranslationY(), newEndValue);
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -538,7 +587,7 @@ public class StackStateAnimator {
}
private void startScaleAnimation(final ExpandableView child,
- StackScrollState.ViewState viewState) {
+ StackScrollState.ViewState viewState, long duration) {
Float previousStartValue = getChildTag(child, TAG_START_SCALE);
Float previousEndValue = getChildTag(child, TAG_END_SCALE);
float newEndValue = viewState.scale;
@@ -573,7 +622,7 @@ public class StackStateAnimator {
PropertyValuesHolder.ofFloat(View.SCALE_Y, child.getScaleY(), newEndValue);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(child, holderX, holderY);
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
animator.addListener(getGlobalAnimationFinishedListener());
// remove the tag when the animation is finished
@@ -637,11 +686,12 @@ public class StackStateAnimator {
/**
* Cancel the previous animator and get the duration of the new animation.
*
+ * @param duration the new duration
* @param previousAnimator the animator which was running before
* @return the new duration
*/
- private long cancelAnimatorAndGetNewDuration(ValueAnimator previousAnimator) {
- long newDuration = mCurrentLength;
+ private long cancelAnimatorAndGetNewDuration(long duration, ValueAnimator previousAnimator) {
+ long newDuration = duration;
if (previousAnimator != null) {
// We take either the desired length of the new animation or the remaining time of
// the previous animator, whichever is longer.
@@ -710,7 +760,8 @@ public class StackStateAnimator {
translationDirection = Math.max(Math.min(translationDirection, 1.0f),-1.0f);
}
- changingView.performRemoveAnimation(translationDirection, new Runnable() {
+ changingView.performRemoveAnimation(ANIMATION_DURATION_APPEAR_DISAPPEAR,
+ translationDirection, new Runnable() {
@Override
public void run() {
// remove the temporary overlay
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
index 149d09a..984a5f4 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
@@ -45,6 +45,7 @@ import android.provider.Settings.Global;
import android.util.Log;
import android.util.SparseArray;
import android.view.Gravity;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -249,6 +250,8 @@ public class VolumePanel extends Handler {
private final VolumePanel mVolumePanel;
private final AudioManager mAudioManager;
+ private boolean mNewVolumeUp;
+
SafetyWarning(Context context, VolumePanel volumePanel, AudioManager audioManager) {
super(context);
mContext = context;
@@ -267,6 +270,24 @@ public class VolumePanel extends Handler {
}
@Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getRepeatCount() == 0) {
+ mNewVolumeUp = true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mNewVolumeUp) {
+ if (LOGD) Log.d(TAG, "Confirmed warning via VOLUME_UP");
+ mAudioManager.disableSafeMediaVolume();
+ dismiss();
+ }
+ return super.onKeyUp(keyCode, event);
+ }
+
+ @Override
public void onClick(DialogInterface dialog, int which) {
mAudioManager.disableSafeMediaVolume();
}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index fdc91a4..ff3cd9d 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -50,7 +50,6 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.session.MediaController;
-import android.media.session.MediaSession;
import android.media.session.MediaSessionLegacyHelper;
import android.net.Uri;
import android.os.Bundle;
@@ -63,6 +62,7 @@ import android.transition.Scene;
import android.transition.Transition;
import android.transition.TransitionInflater;
import android.transition.TransitionManager;
+import android.transition.TransitionSet;
import android.util.AndroidRuntimeException;
import android.util.DisplayMetrics;
import android.util.EventLog;
@@ -126,6 +126,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
(1 << FEATURE_CONTENT_TRANSITIONS) |
(1 << FEATURE_ACTION_MODE_OVERLAY);
+ private static final Transition USE_DEFAULT_TRANSITION = new TransitionSet();
+
/**
* Simple callback used by the context menu and its submenus. The options
* menu submenus do not use this (their behavior is more complex).
@@ -254,10 +256,14 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
};
- private Transition mEnterTransition;
- private Transition mExitTransition;
- private Transition mSharedElementEnterTransition;
- private Transition mSharedElementExitTransition;
+ private Transition mEnterTransition = null;
+ private Transition mReturnTransition = USE_DEFAULT_TRANSITION;
+ private Transition mExitTransition = null;
+ private Transition mReenterTransition = USE_DEFAULT_TRANSITION;
+ private Transition mSharedElementEnterTransition = null;
+ private Transition mSharedElementReturnTransition = USE_DEFAULT_TRANSITION;
+ private Transition mSharedElementExitTransition = null;
+ private Transition mSharedElementReenterTransition = USE_DEFAULT_TRANSITION;
private Boolean mAllowExitTransitionOverlap;
private Boolean mAllowEnterTransitionOverlap;
private long mBackgroundFadeDurationMillis = -1;
@@ -3513,40 +3519,47 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
}
- mEnterTransition = getTransition(mEnterTransition,
+ mEnterTransition = getTransition(mEnterTransition, null,
R.styleable.Window_windowEnterTransition);
- mExitTransition = getTransition(mExitTransition,
+ mReturnTransition = getTransition(mReturnTransition, USE_DEFAULT_TRANSITION,
+ R.styleable.Window_windowReturnTransition);
+ mExitTransition = getTransition(mExitTransition, null,
R.styleable.Window_windowExitTransition);
- mSharedElementEnterTransition = getTransition(mSharedElementEnterTransition,
+ mReenterTransition = getTransition(mReenterTransition, USE_DEFAULT_TRANSITION,
+ R.styleable.Window_windowReenterTransition);
+ mSharedElementEnterTransition = getTransition(mSharedElementEnterTransition, null,
R.styleable.Window_windowSharedElementEnterTransition);
- mSharedElementExitTransition = getTransition(mSharedElementExitTransition,
+ mSharedElementReturnTransition = getTransition(mSharedElementReturnTransition,
+ USE_DEFAULT_TRANSITION,
+ R.styleable.Window_windowSharedElementReturnTransition);
+ mSharedElementExitTransition = getTransition(mSharedElementExitTransition, null,
R.styleable.Window_windowSharedElementExitTransition);
+ mSharedElementReenterTransition = getTransition(mSharedElementReenterTransition,
+ USE_DEFAULT_TRANSITION,
+ R.styleable.Window_windowSharedElementReenterTransition);
if (mAllowEnterTransitionOverlap == null) {
mAllowEnterTransitionOverlap = getWindowStyle().getBoolean(
- R.styleable.
- Window_windowAllowEnterTransitionOverlap, true);
+ R.styleable.Window_windowAllowEnterTransitionOverlap, true);
}
if (mAllowExitTransitionOverlap == null) {
mAllowExitTransitionOverlap = getWindowStyle().getBoolean(
- R.styleable.
- Window_windowAllowExitTransitionOverlap, true);
+ R.styleable.Window_windowAllowExitTransitionOverlap, true);
}
if (mBackgroundFadeDurationMillis < 0) {
mBackgroundFadeDurationMillis = getWindowStyle().getInteger(
- R.styleable.
- Window_windowTransitionBackgroundFadeDuration,
+ R.styleable.Window_windowTransitionBackgroundFadeDuration,
DEFAULT_BACKGROUND_FADE_DURATION_MS);
}
}
}
}
- private Transition getTransition(Transition currentValue, int id) {
- if (currentValue != null) {
+ private Transition getTransition(Transition currentValue, Transition defaultValue, int id) {
+ if (currentValue != defaultValue) {
return currentValue;
}
int transitionId = getWindowStyle().getResourceId(id, -1);
- Transition transition = null;
+ Transition transition = defaultValue;
if (transitionId != -1 && transitionId != R.transition.no_transition) {
TransitionInflater inflater = TransitionInflater.from(getContext());
transition = inflater.inflateTransition(transitionId);
@@ -3899,41 +3912,85 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
@Override
+ public void setReturnTransition(Transition transition) {
+ mReturnTransition = transition;
+ }
+
+ @Override
public void setExitTransition(Transition exitTransition) {
mExitTransition = exitTransition;
}
@Override
+ public void setReenterTransition(Transition transition) {
+ mReenterTransition = transition;
+ }
+
+ @Override
public void setSharedElementEnterTransition(Transition sharedElementEnterTransition) {
mSharedElementEnterTransition = sharedElementEnterTransition;
}
@Override
+ public void setSharedElementReturnTransition(Transition transition) {
+ mSharedElementReturnTransition = transition;
+ }
+
+ @Override
public void setSharedElementExitTransition(Transition sharedElementExitTransition) {
mSharedElementExitTransition = sharedElementExitTransition;
}
@Override
+ public void setSharedElementReenterTransition(Transition transition) {
+ mSharedElementReenterTransition = transition;
+ }
+
+ @Override
public Transition getEnterTransition() {
return mEnterTransition;
}
@Override
+ public Transition getReturnTransition() {
+ return mReturnTransition == USE_DEFAULT_TRANSITION ? getEnterTransition()
+ : mReturnTransition;
+ }
+
+ @Override
public Transition getExitTransition() {
return mExitTransition;
}
@Override
+ public Transition getReenterTransition() {
+ return mReenterTransition == USE_DEFAULT_TRANSITION ? getExitTransition()
+ : mReenterTransition;
+ }
+
+ @Override
public Transition getSharedElementEnterTransition() {
return mSharedElementEnterTransition;
}
@Override
+ public Transition getSharedElementReturnTransition() {
+ return mSharedElementReturnTransition == USE_DEFAULT_TRANSITION
+ ? getSharedElementEnterTransition() : mSharedElementReturnTransition;
+ }
+
+ @Override
public Transition getSharedElementExitTransition() {
return mSharedElementExitTransition;
}
@Override
+ public Transition getSharedElementReenterTransition() {
+ return mSharedElementReenterTransition == USE_DEFAULT_TRANSITION
+ ? getSharedElementExitTransition() : mSharedElementReenterTransition;
+ }
+
+ @Override
public void setAllowEnterTransitionOverlap(boolean allow) {
mAllowEnterTransitionOverlap = allow;
}
diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java
index 2fad73e..898b6f1 100644
--- a/services/core/java/com/android/server/MmsServiceBroker.java
+++ b/services/core/java/com/android/server/MmsServiceBroker.java
@@ -49,6 +49,11 @@ public class MmsServiceBroker extends SystemService {
private static final int MSG_TRY_CONNECTING = 1;
+ private static final Uri FAKE_SMS_SENT_URI = Uri.parse("content://sms/sent/0");
+ private static final Uri FAKE_MMS_SENT_URI = Uri.parse("content://mms/sent/0");
+ private static final Uri FAKE_SMS_DRAFT_URI = Uri.parse("content://sms/draft/0");
+ private static final Uri FAKE_MMS_DRAFT_URI = Uri.parse("content://mms/draft/0");
+
private Context mContext;
// The actual MMS service instance to invoke
private volatile IMms mService;
@@ -275,7 +280,9 @@ public class MmsServiceBroker extends SystemService {
mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Import SMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return null;
+ // Silently fail AppOps failure due to not being the default SMS app
+ // while writing the TelephonyProvider
+ return FAKE_SMS_SENT_URI;
}
return getServiceGuarded().importTextMessage(
callingPkg, address, type, text, timestampMillis, seen, read);
@@ -287,7 +294,9 @@ public class MmsServiceBroker extends SystemService {
mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Import MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return null;
+ // Silently fail AppOps failure due to not being the default SMS app
+ // while writing the TelephonyProvider
+ return FAKE_MMS_SENT_URI;
}
return getServiceGuarded().importMultimediaMessage(
callingPkg, pdu, messageId, timestampSecs, seen, read);
@@ -340,7 +349,9 @@ public class MmsServiceBroker extends SystemService {
mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Add SMS draft");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return null;
+ // Silently fail AppOps failure due to not being the default SMS app
+ // while writing the TelephonyProvider
+ return FAKE_SMS_DRAFT_URI;
}
return getServiceGuarded().addTextMessageDraft(callingPkg, address, text);
}
@@ -350,7 +361,9 @@ public class MmsServiceBroker extends SystemService {
mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Add MMS draft");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return null;
+ // Silently fail AppOps failure due to not being the default SMS app
+ // while writing the TelephonyProvider
+ return FAKE_MMS_DRAFT_URI;
}
return getServiceGuarded().addMultimediaMessageDraft(callingPkg, pdu);
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 9a58c56..0ad36fc 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1206,9 +1206,13 @@ public final class ActivityManagerService extends ActivityManagerNative
}
return;
}
- if (!showBackground && UserHandle.getAppId(proc.uid)
- >= Process.FIRST_APPLICATION_UID && proc.userId != mCurrentUserId
- && proc.pid != MY_PID) {
+ boolean isBackground = (UserHandle.getAppId(proc.uid)
+ >= Process.FIRST_APPLICATION_UID
+ && proc.pid != MY_PID);
+ for (int userId : mCurrentProfileIds) {
+ isBackground &= (proc.userId != userId);
+ }
+ if (isBackground && !showBackground) {
Slog.w(TAG, "Skipping crash dialog of " + proc + ": background");
if (res != null) {
res.set(0);
@@ -2030,7 +2034,7 @@ public final class ActivityManagerService extends ActivityManagerNative
mSystemThread.installSystemApplicationInfo(info);
synchronized (this) {
- ProcessRecord app = newProcessRecordLocked(info, info.processName, false);
+ ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
app.persistent = true;
app.pid = MY_PID;
app.maxAdj = ProcessList.SYSTEM_ADJ;
@@ -2830,10 +2834,45 @@ public final class ActivityManagerService extends ActivityManagerNative
|| transit == AppTransition.TRANSIT_TASK_TO_FRONT;
}
+ int startIsolatedProcess(String entryPoint, String[] entryPointArgs,
+ String processName, String abiOverride, int uid, Runnable crashHandler) {
+ synchronized(this) {
+ ApplicationInfo info = new ApplicationInfo();
+ // In general the ApplicationInfo.uid isn't neccesarily equal to ProcessRecord.uid.
+ // For isolated processes, the former contains the parent's uid and the latter the
+ // actual uid of the isolated process.
+ // In the special case introduced by this method (which is, starting an isolated
+ // process directly from the SystemServer without an actual parent app process) the
+ // closest thing to a parent's uid is SYSTEM_UID.
+ // The only important thing here is to keep AI.uid != PR.uid, in order to trigger
+ // the |isolated| logic in the ProcessRecord constructor.
+ info.uid = Process.SYSTEM_UID;
+ info.processName = processName;
+ info.className = entryPoint;
+ info.packageName = "android";
+ ProcessRecord proc = startProcessLocked(processName, info /* info */,
+ false /* knownToBeDead */, 0 /* intentFlags */, "" /* hostingType */,
+ null /* hostingName */, true /* allowWhileBooting */, true /* isolated */,
+ uid, true /* keepIfLarge */, abiOverride, entryPoint, entryPointArgs,
+ crashHandler);
+ return proc != null ? proc.pid : 0;
+ }
+ }
+
final ProcessRecord startProcessLocked(String processName,
ApplicationInfo info, boolean knownToBeDead, int intentFlags,
String hostingType, ComponentName hostingName, boolean allowWhileBooting,
boolean isolated, boolean keepIfLarge) {
+ return startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingType,
+ hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
+ null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
+ null /* crashHandler */);
+ }
+
+ final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
+ boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName,
+ boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge,
+ String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {
ProcessRecord app;
if (!isolated) {
app = getProcessRecordLocked(processName, info.uid, keepIfLarge);
@@ -2901,7 +2940,8 @@ public final class ActivityManagerService extends ActivityManagerNative
}
if (app == null) {
- app = newProcessRecordLocked(info, processName, isolated);
+ app = newProcessRecordLocked(info, processName, isolated, isolatedUid);
+ app.crashHandler = crashHandler;
if (app == null) {
Slog.w(TAG, "Failed making new process record for "
+ processName + "/" + info.uid + " isolated=" + isolated);
@@ -2928,7 +2968,8 @@ public final class ActivityManagerService extends ActivityManagerNative
return app;
}
- startProcessLocked(app, hostingType, hostingNameStr, null /* ABI override */);
+ startProcessLocked(
+ app, hostingType, hostingNameStr, abiOverride, entryPoint, entryPointArgs);
return (app.pid != 0) ? app : null;
}
@@ -2937,7 +2978,13 @@ public final class ActivityManagerService extends ActivityManagerNative
}
private final void startProcessLocked(ProcessRecord app,
- String hostingType, String hostingNameStr, String abiOverride) {
+ String hostingType, String hostingNameStr) {
+ startProcessLocked(app, hostingType, hostingNameStr, null /* abiOverride */,
+ null /* entryPoint */, null /* entryPointArgs */);
+ }
+
+ private final void startProcessLocked(ProcessRecord app, String hostingType,
+ String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
if (app.pid > 0 && app.pid != MY_PID) {
synchronized (mPidsSelfLocked) {
mPidsSelfLocked.remove(app.pid);
@@ -3030,9 +3077,11 @@ public final class ActivityManagerService extends ActivityManagerNative
// Start the process. It will either succeed and return a result containing
// the PID of the new process, or else throw a RuntimeException.
- Process.ProcessStartResult startResult = Process.start("android.app.ActivityThread",
+ boolean isActivityProcess = (entryPoint == null);
+ if (entryPoint == null) entryPoint = "android.app.ActivityThread";
+ Process.ProcessStartResult startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
- app.info.targetSdkVersion, app.info.seinfo, requiredAbi, null);
+ app.info.targetSdkVersion, app.info.seinfo, requiredAbi, entryPointArgs);
if (app.isolated) {
mBatteryStatsService.addIsolatedUid(app.uid, app.info.uid);
@@ -3052,6 +3101,11 @@ public final class ActivityManagerService extends ActivityManagerNative
buf.setLength(0);
buf.append("Start proc ");
buf.append(app.processName);
+ if (!isActivityProcess) {
+ buf.append(" [");
+ buf.append(entryPoint);
+ buf.append("]");
+ }
buf.append(" for ");
buf.append(hostingType);
if (hostingNameStr != null) {
@@ -3082,10 +3136,12 @@ public final class ActivityManagerService extends ActivityManagerNative
app.killedByAm = false;
synchronized (mPidsSelfLocked) {
this.mPidsSelfLocked.put(startResult.pid, app);
- Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
- msg.obj = app;
- mHandler.sendMessageDelayed(msg, startResult.usingWrapper
- ? PROC_START_TIMEOUT_WITH_WRAPPER : PROC_START_TIMEOUT);
+ if (isActivityProcess) {
+ Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
+ msg.obj = app;
+ mHandler.sendMessageDelayed(msg, startResult.usingWrapper
+ ? PROC_START_TIMEOUT_WITH_WRAPPER : PROC_START_TIMEOUT);
+ }
}
} catch (RuntimeException e) {
// XXX do better error recovery.
@@ -5355,7 +5411,7 @@ public final class ActivityManagerService extends ActivityManagerNative
app.deathRecipient = adr;
} catch (RemoteException e) {
app.resetPackageList(mProcessStats);
- startProcessLocked(app, "link fail", processName, null /* ABI override */);
+ startProcessLocked(app, "link fail", processName);
return false;
}
@@ -5448,7 +5504,7 @@ public final class ActivityManagerService extends ActivityManagerNative
app.resetPackageList(mProcessStats);
app.unlinkDeathRecipient();
- startProcessLocked(app, "bind fail", processName, null /* ABI override */);
+ startProcessLocked(app, "bind fail", processName);
return false;
}
@@ -5603,7 +5659,7 @@ public final class ActivityManagerService extends ActivityManagerNative
for (int ip=0; ip<NP; ip++) {
if (DEBUG_PROCESSES) Slog.v(TAG, "Starting process on hold: "
+ procs.get(ip));
- startProcessLocked(procs.get(ip), "on-hold", null, null /* ABI override */);
+ startProcessLocked(procs.get(ip), "on-hold", null);
}
}
@@ -8951,29 +9007,35 @@ public final class ActivityManagerService extends ActivityManagerNative
// =========================================================
final ProcessRecord newProcessRecordLocked(ApplicationInfo info, String customProcess,
- boolean isolated) {
+ boolean isolated, int isolatedUid) {
String proc = customProcess != null ? customProcess : info.processName;
BatteryStatsImpl.Uid.Proc ps = null;
BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();
int uid = info.uid;
if (isolated) {
- int userId = UserHandle.getUserId(uid);
- int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1;
- while (true) {
- if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID
- || mNextIsolatedProcessUid > Process.LAST_ISOLATED_UID) {
- mNextIsolatedProcessUid = Process.FIRST_ISOLATED_UID;
- }
- uid = UserHandle.getUid(userId, mNextIsolatedProcessUid);
- mNextIsolatedProcessUid++;
- if (mIsolatedProcesses.indexOfKey(uid) < 0) {
- // No process for this uid, use it.
- break;
- }
- stepsLeft--;
- if (stepsLeft <= 0) {
- return null;
+ if (isolatedUid == 0) {
+ int userId = UserHandle.getUserId(uid);
+ int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1;
+ while (true) {
+ if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID
+ || mNextIsolatedProcessUid > Process.LAST_ISOLATED_UID) {
+ mNextIsolatedProcessUid = Process.FIRST_ISOLATED_UID;
+ }
+ uid = UserHandle.getUid(userId, mNextIsolatedProcessUid);
+ mNextIsolatedProcessUid++;
+ if (mIsolatedProcesses.indexOfKey(uid) < 0) {
+ // No process for this uid, use it.
+ break;
+ }
+ stepsLeft--;
+ if (stepsLeft <= 0) {
+ return null;
+ }
}
+ } else {
+ // Special case for startIsolatedProcess (internal only), where
+ // the uid of the isolated process is specified by the caller.
+ uid = isolatedUid;
}
}
return new ProcessRecord(stats, info, proc, uid);
@@ -8989,7 +9051,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
if (app == null) {
- app = newProcessRecordLocked(info, null, isolated);
+ app = newProcessRecordLocked(info, null, isolated, 0);
mProcessNames.put(info.processName, app.uid, app);
if (isolated) {
mIsolatedProcesses.put(app.uid, app);
@@ -9015,8 +9077,8 @@ public final class ActivityManagerService extends ActivityManagerNative
}
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
mPersistentStartingProcesses.add(app);
- startProcessLocked(app, "added application", app.processName,
- abiOverride);
+ startProcessLocked(app, "added application", app.processName, abiOverride,
+ null /* entryPoint */, null /* entryPointArgs */);
}
return app;
@@ -10515,6 +10577,7 @@ public final class ActivityManagerService extends ActivityManagerNative
mProcessCrashTimes.put(app.info.processName, app.uid, now);
}
+ if (app.crashHandler != null) mHandler.post(app.crashHandler);
return true;
}
@@ -13513,7 +13576,7 @@ public final class ActivityManagerService extends ActivityManagerNative
// We have components that still need to be running in the
// process, so re-launch it.
mProcessNames.put(app.processName, app.uid, app);
- startProcessLocked(app, "restart", app.processName, null /* ABI override */);
+ startProcessLocked(app, "restart", app.processName);
} else if (app.pid > 0 && app.pid != MY_PID) {
// Goodbye!
boolean removed;
@@ -17845,6 +17908,13 @@ public final class ActivityManagerService extends ActivityManagerNative
public void wakingUp() {
ActivityManagerService.this.wakingUp();
}
+
+ @Override
+ public int startIsolatedProcess(String entryPoint, String[] entryPointArgs,
+ String processName, String abiOverride, int uid, Runnable crashHandler) {
+ return ActivityManagerService.this.startIsolatedProcess(entryPoint, entryPointArgs,
+ processName, abiOverride, uid, crashHandler);
+ }
}
/**
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index b33f7b7..f1bcb60 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -127,7 +127,8 @@ final class ProcessRecord {
Object adjSource; // Debugging: option dependent object.
int adjSourceProcState; // Debugging: proc state of adjSource's process.
Object adjTarget; // Debugging: target component impacting oom_adj.
-
+ Runnable crashHandler; // Optional local handler to be invoked in the process crash.
+
// contains HistoryRecord objects
final ArrayList<ActivityRecord> activities = new ArrayList<ActivityRecord>();
// all ServiceRecord running in this process
diff --git a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
index f3d570e..0b9094f 100644
--- a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
+++ b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
@@ -71,18 +71,16 @@ final class ActiveSourceHandler {
tv.startNewDeviceAction(newActive);
}
- ActiveSource current = tv.getActiveSource();
if (!tv.isProhibitMode()) {
tv.updateActiveSource(newActive);
- if (!current.equals(newActive)) {
- boolean notifyInputChange = (mCallback == null);
- tv.updateActiveInput(newActive.physicalAddress, notifyInputChange);
- }
+ boolean notifyInputChange = (mCallback == null);
+ tv.updateActiveInput(newActive.physicalAddress, notifyInputChange);
invokeCallback(HdmiControlManager.RESULT_SUCCESS);
} else {
// TV is in a mode that should keep its current source/input from
// being changed for its operation. Reclaim the active source
// or switch the port back to the one used for the current mode.
+ ActiveSource current = tv.getActiveSource();
if (current.logicalAddress == getSourceAddress()) {
HdmiCecMessage activeSourceCommand = HdmiCecMessageBuilder.buildActiveSource(
current.logicalAddress, current.physicalAddress);
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index 946d4ce..bfbaefe 100644
--- a/services/core/java/com/android/server/hdmi/Constants.java
+++ b/services/core/java/com/android/server/hdmi/Constants.java
@@ -178,8 +178,8 @@ final class Constants {
static final int ROUTING_PATH_TOP_MASK = 0xF000;
static final int ROUTING_PATH_TOP_SHIFT = 12;
- static final int INVALID_PORT_ID = -1;
- static final int INVALID_PHYSICAL_ADDRESS = 0xFFFF;
+ static final int INVALID_PORT_ID = HdmiCecDeviceInfo.PORT_INVALID;
+ static final int INVALID_PHYSICAL_ADDRESS = HdmiCecDeviceInfo.PATH_INVALID;
// Send result codes. It should be consistent with hdmi_cec.h's send_message error code.
static final int SEND_RESULT_SUCCESS = 0;
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 9038fbc..eda7b18 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -148,6 +148,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
handleSelectInternalSource();
// Switching to internal source is always successful even when CEC control is disabled.
setActiveSource(targetAddress, mService.getPhysicalAddress());
+ setActivePath(mService.getPhysicalAddress());
invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS);
return;
}
@@ -237,9 +238,9 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
if (path == getActivePath()) {
return;
}
+ setPrevPortId(getActivePortId());
int portId = mService.pathToPortId(path);
setActivePath(path);
- setPrevPortId(portId);
// TODO: Handle PAP/PIP case.
// Show OSD port change banner
if (notifyInputChange) {
@@ -439,9 +440,10 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
if (isTailOfActivePath(path, getActivePath())) {
removeAction(RoutingControlAction.class);
int newPath = mService.portIdToPath(getActivePortId());
+ setActivePath(newPath);
mService.sendCecCommand(HdmiCecMessageBuilder.buildRoutingChange(
mAddress, getActivePath(), newPath));
- addAndStartAction(new RoutingControlAction(this, getActivePortId(), false, null));
+ addAndStartAction(new RoutingControlAction(this, newPath, false, null));
}
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index bb9355e..87c90c6 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -54,6 +54,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.server.SystemService;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
import com.android.server.hdmi.HdmiCecController.AllocateAddressCallback;
+import com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource;
import com.android.server.hdmi.HdmiCecLocalDevice.PendingActionClearedCallback;
import libcore.util.EmptyArray;
@@ -720,6 +721,26 @@ public final class HdmiControlService extends SystemService {
}
@Override
+ public HdmiCecDeviceInfo getActiveSource() {
+ HdmiCecLocalDeviceTv tv = tv();
+ if (tv == null) {
+ Slog.w(TAG, "Local tv device not available");
+ return null;
+ }
+ ActiveSource activeSource = tv.getActiveSource();
+ if (activeSource.isValid()) {
+ return new HdmiCecDeviceInfo(activeSource.logicalAddress,
+ activeSource.physicalAddress, HdmiCecDeviceInfo.PORT_INVALID,
+ HdmiCecDeviceInfo.DEVICE_INACTIVE, 0, "");
+ }
+ int activePath = tv.getActivePath();
+ if (activePath != HdmiCecDeviceInfo.PATH_INVALID) {
+ return new HdmiCecDeviceInfo(activePath, tv.getActivePortId());
+ }
+ return null;
+ }
+
+ @Override
public void deviceSelect(final int logicalAddress, final IHdmiControlCallback callback) {
enforceAccessPermission();
runOnServiceThread(new Runnable() {
diff --git a/services/core/java/com/android/server/hdmi/RoutingControlAction.java b/services/core/java/com/android/server/hdmi/RoutingControlAction.java
index f05394f..f50ae9b 100644
--- a/services/core/java/com/android/server/hdmi/RoutingControlAction.java
+++ b/services/core/java/com/android/server/hdmi/RoutingControlAction.java
@@ -101,12 +101,12 @@ final class RoutingControlAction extends FeatureAction {
// If the routing path doesn't belong to the currently active one, we should
// ignore it since it might have come from other routing change sequence.
int routingPath = HdmiUtils.twoBytesToInt(params);
- if (HdmiUtils.isInActiveRoutingPath(mCurrentRoutingPath, routingPath)) {
+ if (!HdmiUtils.isInActiveRoutingPath(mCurrentRoutingPath, routingPath)) {
return true;
}
mCurrentRoutingPath = routingPath;
// Stop possible previous routing change sequence if in progress.
- removeAction(RoutingControlAction.class);
+ removeActionExcept(RoutingControlAction.class, this);
addTimer(mState, TIMEOUT_ROUTING_INFORMATION_MS);
return true;
} else if (mState == STATE_WAIT_FOR_REPORT_POWER_STATUS
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 6036bcf..1650768 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -19,7 +19,22 @@ package com.android.server.pm;
import static android.content.pm.PackageManager.INSTALL_ALL_USERS;
import static android.content.pm.PackageManager.INSTALL_FROM_ADB;
import static android.content.pm.PackageManager.INSTALL_REPLACE_EXISTING;
-
+import static com.android.internal.util.XmlUtils.readBitmapAttribute;
+import static com.android.internal.util.XmlUtils.readBooleanAttribute;
+import static com.android.internal.util.XmlUtils.readIntAttribute;
+import static com.android.internal.util.XmlUtils.readLongAttribute;
+import static com.android.internal.util.XmlUtils.readStringAttribute;
+import static com.android.internal.util.XmlUtils.readUriAttribute;
+import static com.android.internal.util.XmlUtils.writeBitmapAttribute;
+import static com.android.internal.util.XmlUtils.writeBooleanAttribute;
+import static com.android.internal.util.XmlUtils.writeIntAttribute;
+import static com.android.internal.util.XmlUtils.writeLongAttribute;
+import static com.android.internal.util.XmlUtils.writeStringAttribute;
+import static com.android.internal.util.XmlUtils.writeUriAttribute;
+import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
+import static org.xmlpull.v1.XmlPullParser.START_TAG;
+
+import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.IPackageDeleteObserver;
@@ -29,9 +44,14 @@ import android.content.pm.IPackageInstallerSession;
import android.content.pm.InstallSessionInfo;
import android.content.pm.InstallSessionParams;
import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
import android.os.Binder;
+import android.os.Environment;
import android.os.FileUtils;
+import android.os.Handler;
import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -40,30 +60,70 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.system.ErrnoException;
import android.system.Os;
+import android.text.format.DateUtils;
import android.util.ArraySet;
+import android.util.AtomicFile;
import android.util.ExceptionUtils;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.IoThread;
+import com.android.server.pm.PackageInstallerSession.Snapshot;
import com.google.android.collect.Sets;
+import libcore.io.IoUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
+import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.Random;
public class PackageInstallerService extends IPackageInstaller.Stub {
private static final String TAG = "PackageInstaller";
+ private static final boolean LOGD = true;
- // TODO: destroy sessions with old timestamps
// TODO: remove outstanding sessions when installer package goes away
// TODO: notify listeners in other users when package has been installed there
+ /** XML constants used in {@link #mSessionsFile} */
+ private static final String TAG_SESSIONS = "sessions";
+ private static final String TAG_SESSION = "session";
+ private static final String ATTR_SESSION_ID = "sessionId";
+ private static final String ATTR_USER_ID = "userId";
+ private static final String ATTR_INSTALLER_PACKAGE_NAME = "installerPackageName";
+ private static final String ATTR_CREATED_MILLIS = "createdMillis";
+ private static final String ATTR_SESSION_STAGE_DIR = "sessionStageDir";
+ private static final String ATTR_SEALED = "sealed";
+ private static final String ATTR_MODE = "mode";
+ private static final String ATTR_INSTALL_FLAGS = "installFlags";
+ private static final String ATTR_INSTALL_LOCATION = "installLocation";
+ private static final String ATTR_SIZE_BYTES = "sizeBytes";
+ private static final String ATTR_APP_PACKAGE_NAME = "appPackageName";
+ private static final String ATTR_APP_ICON = "appIcon";
+ private static final String ATTR_APP_LABEL = "appLabel";
+ private static final String ATTR_ORIGINATING_URI = "originatingUri";
+ private static final String ATTR_REFERRER_URI = "referrerUri";
+ private static final String ATTR_ABI_OVERRIDE = "abiOverride";
+
+ private static final long MAX_AGE_MILLIS = 3 * DateUtils.DAY_IN_MILLIS;
+ private static final long MAX_ACTIVE_SESSIONS = 1024;
+
private final Context mContext;
private final PackageManagerService mPm;
private final AppOpsManager mAppOps;
@@ -71,10 +131,21 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
private final File mStagingDir;
private final HandlerThread mInstallThread;
- private final Callback mCallback = new Callback();
+ private final Callbacks mCallbacks;
+
+ /**
+ * File storing persisted {@link #mSessions}.
+ */
+ private final AtomicFile mSessionsFile;
+
+ private final InternalCallback mInternalCallback = new InternalCallback();
+
+ /**
+ * Used for generating session IDs. Since this is created at boot time,
+ * normal random might be predictable.
+ */
+ private final Random mRandom = new SecureRandom();
- @GuardedBy("mSessions")
- private int mNextSessionId;
@GuardedBy("mSessions")
private final SparseArray<PackageInstallerSession> mSessions = new SparseArray<>();
@@ -82,8 +153,6 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
@GuardedBy("mSessions")
private final SparseArray<PackageInstallerSession> mHistoricalSessions = new SparseArray<>();
- private RemoteCallbackList<IPackageInstallerCallback> mCallbacks = new RemoteCallbackList<>();
-
private static final FilenameFilter sStageFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
@@ -101,6 +170,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
mInstallThread = new HandlerThread(TAG);
mInstallThread.start();
+ mCallbacks = new Callbacks(mInstallThread.getLooper());
+
+ mSessionsFile = new AtomicFile(
+ new File(Environment.getSystemSecureDirectory(), "install_sessions.xml"));
+
synchronized (mSessions) {
readSessionsLocked();
@@ -133,13 +207,140 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
}
private void readSessionsLocked() {
- // TODO: implement persisting
+ if (LOGD) Slog.v(TAG, "readSessionsLocked()");
+
mSessions.clear();
- mNextSessionId = 1;
+
+ FileInputStream fis = null;
+ try {
+ fis = mSessionsFile.openRead();
+ final XmlPullParser in = Xml.newPullParser();
+ in.setInput(fis, null);
+
+ int type;
+ while ((type = in.next()) != END_DOCUMENT) {
+ if (type == START_TAG) {
+ final String tag = in.getName();
+ if (TAG_SESSION.equals(tag)) {
+ final PackageInstallerSession session = readSessionLocked(in);
+ final long age = System.currentTimeMillis() - session.createdMillis;
+
+ final boolean valid;
+ if (age >= MAX_AGE_MILLIS) {
+ Slog.w(TAG, "Abandoning old session first created at "
+ + session.createdMillis);
+ valid = false;
+ } else if (!session.sessionStageDir.exists()) {
+ Slog.w(TAG, "Abandoning session with missing stage "
+ + session.sessionStageDir);
+ valid = false;
+ } else {
+ valid = true;
+ }
+
+ if (valid) {
+ mSessions.put(session.sessionId, session);
+ } else {
+ // Since this is early during boot we don't send
+ // any observer events about the session, but we
+ // keep details around for dumpsys.
+ mHistoricalSessions.put(session.sessionId, session);
+ }
+ }
+ }
+ }
+ } catch (FileNotFoundException e) {
+ // Missing sessions are okay, probably first boot
+ } catch (IOException e) {
+ Log.wtf(TAG, "Failed reading install sessions", e);
+ } catch (XmlPullParserException e) {
+ Log.wtf(TAG, "Failed reading install sessions", e);
+ } finally {
+ IoUtils.closeQuietly(fis);
+ }
+ }
+
+ private PackageInstallerSession readSessionLocked(XmlPullParser in) throws IOException {
+ final int sessionId = readIntAttribute(in, ATTR_SESSION_ID);
+ final int userId = readIntAttribute(in, ATTR_USER_ID);
+ final String installerPackageName = readStringAttribute(in, ATTR_INSTALLER_PACKAGE_NAME);
+ final long createdMillis = readLongAttribute(in, ATTR_CREATED_MILLIS);
+ final File sessionStageDir = new File(readStringAttribute(in, ATTR_SESSION_STAGE_DIR));
+ final boolean sealed = readBooleanAttribute(in, ATTR_SEALED);
+
+ final InstallSessionParams params = new InstallSessionParams(
+ InstallSessionParams.MODE_INVALID);
+ params.mode = readIntAttribute(in, ATTR_MODE);
+ params.installFlags = readIntAttribute(in, ATTR_INSTALL_FLAGS);
+ params.installLocation = readIntAttribute(in, ATTR_INSTALL_LOCATION);
+ params.sizeBytes = readLongAttribute(in, ATTR_SIZE_BYTES);
+ params.appPackageName = readStringAttribute(in, ATTR_APP_PACKAGE_NAME);
+ params.appIcon = readBitmapAttribute(in, ATTR_APP_ICON);
+ params.appLabel = readStringAttribute(in, ATTR_APP_LABEL);
+ params.originatingUri = readUriAttribute(in, ATTR_ORIGINATING_URI);
+ params.referrerUri = readUriAttribute(in, ATTR_REFERRER_URI);
+ params.abiOverride = readStringAttribute(in, ATTR_ABI_OVERRIDE);
+
+ return new PackageInstallerSession(mInternalCallback, mPm, mInstallThread.getLooper(),
+ sessionId, userId, installerPackageName, params, createdMillis, sessionStageDir,
+ sealed);
}
private void writeSessionsLocked() {
- // TODO: implement persisting
+ if (LOGD) Slog.v(TAG, "writeSessionsLocked()");
+
+ FileOutputStream fos = null;
+ try {
+ fos = mSessionsFile.startWrite();
+
+ XmlSerializer out = new FastXmlSerializer();
+ out.setOutput(fos, "utf-8");
+ out.startDocument(null, true);
+ out.startTag(null, TAG_SESSIONS);
+ final int size = mSessions.size();
+ for (int i = 0; i < size; i++) {
+ final PackageInstallerSession session = mSessions.valueAt(i);
+ writeSessionLocked(out, session);
+ }
+ out.endTag(null, TAG_SESSIONS);
+ out.endDocument();
+
+ mSessionsFile.finishWrite(fos);
+ } catch (IOException e) {
+ if (fos != null) {
+ mSessionsFile.failWrite(fos);
+ }
+ }
+ }
+
+ private void writeSessionLocked(XmlSerializer out, PackageInstallerSession session)
+ throws IOException {
+ final InstallSessionParams params = session.params;
+ final Snapshot snapshot = session.snapshot();
+
+ out.startTag(null, TAG_SESSION);
+
+ writeIntAttribute(out, ATTR_SESSION_ID, session.sessionId);
+ writeIntAttribute(out, ATTR_USER_ID, session.userId);
+ writeStringAttribute(out, ATTR_INSTALLER_PACKAGE_NAME,
+ session.installerPackageName);
+ writeLongAttribute(out, ATTR_CREATED_MILLIS, session.createdMillis);
+ writeStringAttribute(out, ATTR_SESSION_STAGE_DIR,
+ session.sessionStageDir.getAbsolutePath());
+ writeBooleanAttribute(out, ATTR_SEALED, snapshot.sealed);
+
+ writeIntAttribute(out, ATTR_MODE, params.mode);
+ writeIntAttribute(out, ATTR_INSTALL_FLAGS, params.installFlags);
+ writeIntAttribute(out, ATTR_INSTALL_LOCATION, params.installLocation);
+ writeLongAttribute(out, ATTR_SIZE_BYTES, params.sizeBytes);
+ writeStringAttribute(out, ATTR_APP_PACKAGE_NAME, params.appPackageName);
+ writeBitmapAttribute(out, ATTR_APP_ICON, params.appIcon);
+ writeStringAttribute(out, ATTR_APP_LABEL, params.appLabel);
+ writeUriAttribute(out, ATTR_ORIGINATING_URI, params.originatingUri);
+ writeUriAttribute(out, ATTR_REFERRER_URI, params.referrerUri);
+ writeStringAttribute(out, ATTR_ABI_OVERRIDE, params.abiOverride);
+
+ out.endTag(null, TAG_SESSION);
}
private void writeSessionsAsync() {
@@ -163,8 +364,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
throw new SecurityException("User restriction prevents installing");
}
- if ((callingUid == Process.SHELL_UID) || (callingUid == 0)) {
+ if ((callingUid == Process.SHELL_UID) || (callingUid == Process.ROOT_UID)) {
+ installerPackageName = "com.android.shell";
+
params.installFlags |= INSTALL_FROM_ADB;
+
} else {
mAppOps.checkPackage(callingUid, installerPackageName);
@@ -181,6 +385,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
throw new IllegalArgumentException("Params must have valid mode set");
}
+ // Defensively resize giant app icons
+ if (params.appIcon != null) {
+ final ActivityManager am = (ActivityManager) mContext.getSystemService(
+ Context.ACTIVITY_SERVICE);
+ final int iconSize = am.getLauncherLargeIconSize();
+ if ((params.appIcon.getWidth() > iconSize * 2)
+ || (params.appIcon.getHeight() > iconSize * 2)) {
+ params.appIcon = Bitmap.createScaledBitmap(params.appIcon, iconSize, iconSize,
+ true);
+ }
+ }
+
// Sanity check that install could fit
if (params.sizeBytes > 0) {
try {
@@ -193,18 +409,24 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
final int sessionId;
final PackageInstallerSession session;
synchronized (mSessions) {
+ // Sanity check that installer isn't going crazy
+ final int activeCount = getSessionCountLocked(callingUid);
+ if (activeCount >= MAX_ACTIVE_SESSIONS) {
+ throw new IllegalStateException("Too many active sessions for UID " + callingUid);
+ }
+
sessionId = allocateSessionIdLocked();
final long createdMillis = System.currentTimeMillis();
final File sessionStageDir = prepareSessionStageDir(sessionId);
- session = new PackageInstallerSession(mCallback, mPm, sessionId, userId,
- installerPackageName, callingUid, params, createdMillis, sessionStageDir,
- mInstallThread.getLooper());
+ session = new PackageInstallerSession(mInternalCallback, mPm,
+ mInstallThread.getLooper(), sessionId, userId, installerPackageName, params,
+ createdMillis, sessionStageDir, false);
mSessions.put(sessionId, session);
}
- notifySessionCreated(session.generateInfo());
+ mCallbacks.notifySessionCreated(session.sessionId, session.userId);
writeSessionsAsync();
return sessionId;
}
@@ -216,25 +438,34 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
if (session == null) {
throw new IllegalStateException("Missing session " + sessionId);
}
- if (Binder.getCallingUid() != session.installerUid) {
+ if (!isCallingUidOwner(session)) {
throw new SecurityException("Caller has no access to session " + sessionId);
}
+ if (session.openCount.getAndIncrement() == 0) {
+ mCallbacks.notifySessionOpened(sessionId, session.userId);
+ }
return session;
}
}
private int allocateSessionIdLocked() {
- if (mSessions.get(mNextSessionId) != null) {
- throw new IllegalStateException("Next session already allocated");
- }
- return mNextSessionId++;
+ int n = 0;
+ int sessionId;
+ do {
+ sessionId = mRandom.nextInt(Integer.MAX_VALUE);
+ if (mSessions.get(sessionId) == null) {
+ return sessionId;
+ }
+ } while (n++ < 32);
+
+ throw new IllegalStateException("Failed to allocate session ID");
}
private File prepareSessionStageDir(int sessionId) {
final File file = new File(mStagingDir, "vmdl" + sessionId + ".tmp");
if (file.exists()) {
- throw new IllegalStateException();
+ throw new IllegalStateException("Session dir already exists: " + file);
}
try {
@@ -246,7 +477,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
}
if (!SELinux.restorecon(file)) {
- throw new IllegalStateException("Failed to prepare session dir");
+ throw new IllegalStateException("Failed to restorecon session dir");
}
return file;
@@ -256,9 +487,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
public InstallSessionInfo getSessionInfo(int sessionId) {
synchronized (mSessions) {
final PackageInstallerSession session = mSessions.get(sessionId);
- final boolean isOwner = (session != null)
- && (session.installerUid == Binder.getCallingUid());
- if (!isOwner) {
+ if (!isCallingUidOwner(session)) {
enforceCallerCanReadSessions();
}
return session != null ? session.generateInfo() : null;
@@ -323,7 +552,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
mPm.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, "registerCallback");
enforceCallerCanReadSessions();
- mCallbacks.register(callback, new UserHandle(userId));
+ mCallbacks.register(callback, userId);
}
@Override
@@ -331,9 +560,24 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
mCallbacks.unregister(callback);
}
- private int getSessionUserId(int sessionId) {
- synchronized (mSessions) {
- return UserHandle.getUserId(mSessions.get(sessionId).installerUid);
+ private int getSessionCountLocked(int installerUid) {
+ int count = 0;
+ final int size = mSessions.size();
+ for (int i = 0; i < size; i++) {
+ final PackageInstallerSession session = mSessions.valueAt(i);
+ if (session.installerUid == installerUid) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ private boolean isCallingUidOwner(PackageInstallerSession session) {
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid == Process.ROOT_UID) {
+ return true;
+ } else {
+ return (session != null) && (callingUid == session.installerUid);
}
}
@@ -352,53 +596,87 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
}
}
- private void notifySessionCreated(InstallSessionInfo info) {
- final int userId = getSessionUserId(info.sessionId);
- final int n = mCallbacks.beginBroadcast();
- for (int i = 0; i < n; i++) {
- final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
- final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
- // TODO: dispatch notifications for slave profiles
- if (userId == user.getIdentifier()) {
- try {
- callback.onSessionCreated(info.sessionId);
- } catch (RemoteException ignored) {
- }
- }
+ private static class Callbacks extends Handler {
+ private static final int MSG_SESSION_CREATED = 1;
+ private static final int MSG_SESSION_OPENED = 2;
+ private static final int MSG_SESSION_PROGRESS_CHANGED = 3;
+ private static final int MSG_SESSION_CLOSED = 4;
+ private static final int MSG_SESSION_FINISHED = 5;
+
+ private final RemoteCallbackList<IPackageInstallerCallback>
+ mCallbacks = new RemoteCallbackList<>();
+
+ public Callbacks(Looper looper) {
+ super(looper);
}
- mCallbacks.finishBroadcast();
- }
- private void notifySessionProgressChanged(int sessionId, float progress) {
- final int userId = getSessionUserId(sessionId);
- final int n = mCallbacks.beginBroadcast();
- for (int i = 0; i < n; i++) {
- final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
- final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
- if (userId == user.getIdentifier()) {
- try {
- callback.onSessionProgressChanged(sessionId, progress);
- } catch (RemoteException ignored) {
+ public void register(IPackageInstallerCallback callback, int userId) {
+ mCallbacks.register(callback, new UserHandle(userId));
+ }
+
+ public void unregister(IPackageInstallerCallback callback) {
+ mCallbacks.unregister(callback);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ final int userId = msg.arg2;
+ final int n = mCallbacks.beginBroadcast();
+ for (int i = 0; i < n; i++) {
+ final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
+ final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
+ // TODO: dispatch notifications for slave profiles
+ if (userId == user.getIdentifier()) {
+ try {
+ invokeCallback(callback, msg);
+ } catch (RemoteException ignored) {
+ }
}
}
+ mCallbacks.finishBroadcast();
}
- mCallbacks.finishBroadcast();
- }
- private void notifySessionFinished(int sessionId, boolean success) {
- final int userId = getSessionUserId(sessionId);
- final int n = mCallbacks.beginBroadcast();
- for (int i = 0; i < n; i++) {
- final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
- final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
- if (userId == user.getIdentifier()) {
- try {
- callback.onSessionFinished(sessionId, success);
- } catch (RemoteException ignored) {
- }
+ private void invokeCallback(IPackageInstallerCallback callback, Message msg)
+ throws RemoteException {
+ final int sessionId = msg.arg1;
+ switch (msg.what) {
+ case MSG_SESSION_CREATED:
+ callback.onSessionCreated(sessionId);
+ break;
+ case MSG_SESSION_OPENED:
+ callback.onSessionOpened(sessionId);
+ break;
+ case MSG_SESSION_PROGRESS_CHANGED:
+ callback.onSessionProgressChanged(sessionId, (float) msg.obj);
+ break;
+ case MSG_SESSION_CLOSED:
+ callback.onSessionClosed(sessionId);
+ break;
+ case MSG_SESSION_FINISHED:
+ callback.onSessionFinished(sessionId, (boolean) msg.obj);
+ break;
}
}
- mCallbacks.finishBroadcast();
+
+ private void notifySessionCreated(int sessionId, int userId) {
+ obtainMessage(MSG_SESSION_CREATED, sessionId, userId).sendToTarget();
+ }
+
+ private void notifySessionOpened(int sessionId, int userId) {
+ obtainMessage(MSG_SESSION_OPENED, sessionId, userId).sendToTarget();
+ }
+
+ private void notifySessionProgressChanged(int sessionId, int userId, float progress) {
+ obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, userId, progress).sendToTarget();
+ }
+
+ private void notifySessionClosed(int sessionId, int userId) {
+ obtainMessage(MSG_SESSION_CLOSED, sessionId, userId).sendToTarget();
+ }
+
+ public void notifySessionFinished(int sessionId, int userId, boolean success) {
+ obtainMessage(MSG_SESSION_FINISHED, sessionId, userId, success).sendToTarget();
+ }
}
void dump(IndentingPrintWriter pw) {
@@ -427,13 +705,17 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
}
}
- class Callback {
+ class InternalCallback {
public void onSessionProgressChanged(PackageInstallerSession session, float progress) {
- notifySessionProgressChanged(session.sessionId, progress);
+ mCallbacks.notifySessionProgressChanged(session.sessionId, session.userId, progress);
+ }
+
+ public void onSessionClosed(PackageInstallerSession session) {
+ mCallbacks.notifySessionClosed(session.sessionId, session.userId);
}
public void onSessionFinished(PackageInstallerSession session, boolean success) {
- notifySessionFinished(session.sessionId, success);
+ mCallbacks.notifySessionFinished(session.sessionId, session.userId, success);
synchronized (mSessions) {
mSessions.remove(session.sessionId);
mHistoricalSessions.put(session.sessionId, session);
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 06e1d53..26019db 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -21,6 +21,7 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK;
import static android.content.pm.PackageManager.INSTALL_FAILED_PACKAGE_CHANGED;
import static android.system.OsConstants.O_CREAT;
+import static android.system.OsConstants.O_RDONLY;
import static android.system.OsConstants.O_WRONLY;
import android.content.pm.ApplicationInfo;
@@ -40,7 +41,6 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
-import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.system.ErrnoException;
@@ -52,6 +52,7 @@ import android.util.ExceptionUtils;
import android.util.MathUtils;
import android.util.Slog;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
@@ -62,33 +63,64 @@ import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private static final String TAG = "PackageInstaller";
private static final boolean LOGD = true;
+ private static final int MSG_COMMIT = 0;
+
// TODO: enforce INSTALL_ALLOW_TEST
// TODO: enforce INSTALL_ALLOW_DOWNGRADE
// TODO: handle INSTALL_EXTERNAL, INSTALL_INTERNAL
// TODO: treat INHERIT_EXISTING as installExistingPackage()
- private final PackageInstallerService.Callback mCallback;
+ private final PackageInstallerService.InternalCallback mCallback;
private final PackageManagerService mPm;
private final Handler mHandler;
- public final int sessionId;
- public final int userId;
- public final String installerPackageName;
- /** UID not persisted */
- public final int installerUid;
- public final InstallSessionParams params;
- public final long createdMillis;
- public final File sessionStageDir;
+ final int sessionId;
+ final int userId;
+ final String installerPackageName;
+ final InstallSessionParams params;
+ final long createdMillis;
+ final File sessionStageDir;
- private static final int MSG_COMMIT = 0;
+ /** Note that UID is not persisted; it's always derived at runtime. */
+ final int installerUid;
+
+ AtomicInteger openCount = new AtomicInteger();
+
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ private float mClientProgress = 0;
+ @GuardedBy("mLock")
+ private float mProgress = 0;
+ @GuardedBy("mLock")
+ private float mReportedProgress = -1;
+
+ @GuardedBy("mLock")
+ private boolean mSealed = false;
+ @GuardedBy("mLock")
+ private boolean mPermissionsConfirmed = false;
+ @GuardedBy("mLock")
+ private boolean mDestroyed = false;
+
+ @GuardedBy("mLock")
+ private ArrayList<FileBridge> mBridges = new ArrayList<>();
- private Handler.Callback mHandlerCallback = new Handler.Callback() {
+ @GuardedBy("mLock")
+ private IPackageInstallObserver2 mRemoteObserver;
+
+ /** Fields derived from commit parsing */
+ private String mPackageName;
+ private int mVersionCode;
+ private Signature[] mSignatures;
+
+ private final Handler.Callback mHandlerCallback = new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
synchronized (mLock) {
@@ -114,27 +146,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
};
- private final Object mLock = new Object();
-
- private float mClientProgress;
- private float mProgress = 0;
-
- private String mPackageName;
- private int mVersionCode;
- private Signature[] mSignatures;
-
- private boolean mMutationsAllowed;
- private boolean mPermissionsConfirmed;
- private boolean mInvalid;
-
- private ArrayList<FileBridge> mBridges = new ArrayList<>();
-
- private IPackageInstallObserver2 mRemoteObserver;
-
- public PackageInstallerSession(PackageInstallerService.Callback callback,
- PackageManagerService pm, int sessionId, int userId, String installerPackageName,
- int installerUid, InstallSessionParams params, long createdMillis, File sessionStageDir,
- Looper looper) {
+ public PackageInstallerSession(PackageInstallerService.InternalCallback callback,
+ PackageManagerService pm, Looper looper, int sessionId, int userId,
+ String installerPackageName, InstallSessionParams params, long createdMillis,
+ File sessionStageDir, boolean sealed) {
mCallback = callback;
mPm = pm;
mHandler = new Handler(looper, mHandlerCallback);
@@ -142,24 +157,23 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
this.sessionId = sessionId;
this.userId = userId;
this.installerPackageName = installerPackageName;
- this.installerUid = installerUid;
this.params = params;
this.createdMillis = createdMillis;
this.sessionStageDir = sessionStageDir;
- // Check against any explicitly provided signatures
- mSignatures = params.signatures;
+ mSealed = sealed;
- // TODO: splice in flag when restoring persisted session
- mMutationsAllowed = true;
+ // Always derived at runtime
+ installerUid = mPm.getPackageUid(installerPackageName, userId);
- if (pm.checkPermission(android.Manifest.permission.INSTALL_PACKAGES, installerPackageName)
- == PackageManager.PERMISSION_GRANTED) {
- mPermissionsConfirmed = true;
- }
- if (installerUid == Process.SHELL_UID || installerUid == 0) {
+ if (mPm.checkPermission(android.Manifest.permission.INSTALL_PACKAGES,
+ installerPackageName) == PackageManager.PERMISSION_GRANTED) {
mPermissionsConfirmed = true;
+ } else {
+ mPermissionsConfirmed = false;
}
+
+ computeProgressLocked();
}
public InstallSessionInfo generateInfo() {
@@ -168,6 +182,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
info.sessionId = sessionId;
info.installerPackageName = installerPackageName;
info.progress = mProgress;
+ info.open = openCount.get() > 0;
info.mode = params.mode;
info.sizeBytes = params.sizeBytes;
@@ -178,16 +193,48 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return info;
}
+ private void assertNotSealed(String cookie) {
+ synchronized (mLock) {
+ if (mSealed) {
+ throw new SecurityException(cookie + " not allowed after commit");
+ }
+ }
+ }
+
@Override
public void setClientProgress(float progress) {
- mClientProgress = progress;
- mProgress = MathUtils.constrain(mClientProgress * 0.8f, 0f, 0.8f);
- mCallback.onSessionProgressChanged(this, mProgress);
+ synchronized (mLock) {
+ mClientProgress = progress;
+ computeProgressLocked();
+ }
+ maybePublishProgress();
}
@Override
public void addClientProgress(float progress) {
- setClientProgress(mClientProgress + progress);
+ synchronized (mLock) {
+ mClientProgress += progress;
+ computeProgressLocked();
+ }
+ maybePublishProgress();
+ }
+
+ private void computeProgressLocked() {
+ mProgress = MathUtils.constrain(mClientProgress * 0.8f, 0f, 0.8f);
+ }
+
+ private void maybePublishProgress() {
+ // Only publish when meaningful change
+ if (Math.abs(mProgress - mReportedProgress) > 0.01) {
+ mReportedProgress = mProgress;
+ mCallback.onSessionProgressChanged(this, mProgress);
+ }
+ }
+
+ @Override
+ public String[] list() {
+ assertNotSealed("list");
+ return sessionStageDir.list();
}
@Override
@@ -208,9 +255,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
// will block any attempted install transitions.
final FileBridge bridge;
synchronized (mLock) {
- if (!mMutationsAllowed) {
- throw new IllegalStateException("Mutations not allowed");
- }
+ assertNotSealed("openWrite");
bridge = new FileBridge();
mBridges.add(bridge);
@@ -252,25 +297,51 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
@Override
+ public ParcelFileDescriptor openRead(String name) {
+ try {
+ return openReadInternal(name);
+ } catch (IOException e) {
+ throw ExceptionUtils.wrap(e);
+ }
+ }
+
+ private ParcelFileDescriptor openReadInternal(String name) throws IOException {
+ assertNotSealed("openRead");
+
+ try {
+ if (!FileUtils.isValidExtFilename(name)) {
+ throw new IllegalArgumentException("Invalid name: " + name);
+ }
+ final File target = new File(sessionStageDir, name);
+
+ final FileDescriptor targetFd = Libcore.os.open(target.getAbsolutePath(), O_RDONLY, 0);
+ return new ParcelFileDescriptor(targetFd);
+
+ } catch (ErrnoException e) {
+ throw e.rethrowAsIOException();
+ }
+ }
+
+ @Override
public void commit(IPackageInstallObserver2 observer) {
Preconditions.checkNotNull(observer);
mHandler.obtainMessage(MSG_COMMIT, observer).sendToTarget();
}
private void commitLocked() throws PackageManagerException {
- if (mInvalid) {
+ if (mDestroyed) {
throw new PackageManagerException(INSTALL_FAILED_ALREADY_EXISTS, "Invalid session");
}
// Verify that all writers are hands-off
- if (mMutationsAllowed) {
+ if (!mSealed) {
for (FileBridge bridge : mBridges) {
if (!bridge.isClosed()) {
throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED,
"Files still open");
}
}
- mMutationsAllowed = false;
+ mSealed = true;
// TODO: persist disabled mutations before going forward, since
// beyond this point we may have hardlinks to the valid install
@@ -331,6 +402,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private void validateInstallLocked() throws PackageManagerException {
mPackageName = null;
mVersionCode = -1;
+ mSignatures = null;
final File[] files = sessionStageDir.listFiles();
if (ArrayUtils.isEmpty(files)) {
@@ -461,7 +533,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
@Override
public void close() {
- // Currently ignored
+ if (openCount.decrementAndGet() == 0) {
+ mCallback.onSessionClosed(this);
+ }
}
@Override
@@ -475,7 +549,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private void destroyInternal() {
synchronized (mLock) {
- mInvalid = true;
+ mSealed = true;
+ mDestroyed = true;
}
FileUtils.deleteContents(sessionStageDir);
sessionStageDir.delete();
@@ -496,11 +571,26 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
pw.printPair("mClientProgress", mClientProgress);
pw.printPair("mProgress", mProgress);
- pw.printPair("mMutationsAllowed", mMutationsAllowed);
+ pw.printPair("mSealed", mSealed);
pw.printPair("mPermissionsConfirmed", mPermissionsConfirmed);
+ pw.printPair("mDestroyed", mDestroyed);
pw.printPair("mBridges", mBridges.size());
pw.println();
pw.decreaseIndent();
}
+
+ Snapshot snapshot() {
+ return new Snapshot(this);
+ }
+
+ static class Snapshot {
+ final float clientProgress;
+ final boolean sealed;
+
+ public Snapshot(PackageInstallerSession session) {
+ clientProgress = session.mClientProgress;
+ sealed = session.mSealed;
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index ee6d4d0..2b55bf5 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -8257,11 +8257,11 @@ public class PackageManagerService extends IPackageManager.Stub {
// A restore should be performed at this point if (a) the install
// succeeded, (b) the operation is not an update, and (c) the new
- // package has a backupAgent defined.
+ // package has not opted out of backup participation.
final boolean update = res.removedInfo.removedPackage != null;
- boolean doRestore = (!update
- && res.pkg != null
- && res.pkg.applicationInfo.backupAgentName != null);
+ final int flags = (res.pkg == null) ? 0 : res.pkg.applicationInfo.flags;
+ boolean doRestore = !update
+ && ((flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0);
// Set up the post-install work request bookkeeping. This will be used
// and cleaned up by the post-install event handling regardless of whether
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index 16597c0..e11b6a7 100644
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -35,6 +35,7 @@ import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Rect;
import android.hardware.hdmi.HdmiCecDeviceInfo;
@@ -51,6 +52,7 @@ import android.media.tv.TvContentRating;
import android.media.tv.TvContract;
import android.media.tv.TvInputHardwareInfo;
import android.media.tv.TvInputInfo;
+import android.media.tv.TvInputManager;
import android.media.tv.TvInputService;
import android.media.tv.TvStreamConfig;
import android.media.tv.TvTrackInfo;
@@ -281,6 +283,18 @@ public final class TvInputManagerService extends SystemService {
userState.inputMap.clear();
userState.inputMap = inputMap;
+
+ Resources r = Resources.getSystem();
+ userState.ratingSystemXmlUriSet.clear();
+ userState.ratingSystemXmlUriSet.add(TvContentRating.SYSTEM_CONTENT_RATING_SYSTEM_XML);
+ for (TvInputState state : userState.inputMap.values()) {
+ Uri ratingSystemXmlUri = state.mInfo.getRatingSystemXmlUri();
+ if (ratingSystemXmlUri != null) {
+ // TODO: need to check the validation of xml format and the duplication of rating
+ // systems.
+ userState.ratingSystemXmlUriSet.add(state.mInfo.getRatingSystemXmlUri());
+ }
+ }
}
private void switchUser(int userId) {
@@ -814,6 +828,23 @@ public final class TvInputManagerService extends SystemService {
}
@Override
+ public List<Uri> getTvContentRatingSystemXmls(int userId) {
+ final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(),
+ Binder.getCallingUid(), userId, "getTvContentRatingSystemXmls");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ UserState userState = getUserStateLocked(resolvedUserId);
+ List<Uri> ratingSystemXmlUriList = new ArrayList<Uri>();
+ ratingSystemXmlUriList.addAll(userState.ratingSystemXmlUriSet);
+ return ratingSystemXmlUriList;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public void registerCallback(final ITvInputManagerCallback callback, int userId) {
final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(),
Binder.getCallingUid(), userId, "registerCallback");
@@ -1135,7 +1166,7 @@ public final class TvInputManagerService extends SystemService {
}
@Override
- public void tune(IBinder sessionToken, final Uri channelUri, int userId) {
+ public void tune(IBinder sessionToken, final Uri channelUri, Bundle params, int userId) {
final int callingUid = Binder.getCallingUid();
final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
userId, "tune");
@@ -1143,7 +1174,8 @@ public final class TvInputManagerService extends SystemService {
try {
synchronized (mLock) {
try {
- getSessionLocked(sessionToken, callingUid, resolvedUserId).tune(channelUri);
+ getSessionLocked(sessionToken, callingUid, resolvedUserId).tune(
+ channelUri, params);
if (TvContract.isChannelUriForPassthroughTvInput(channelUri)) {
// Do not log the watch history for passthrough inputs.
return;
@@ -1170,6 +1202,10 @@ public final class TvInputManagerService extends SystemService {
currentTime);
values.put(TvContract.WatchedPrograms.COLUMN_WATCH_END_TIME_UTC_MILLIS, 0);
values.put(TvContract.WatchedPrograms.COLUMN_CHANNEL_ID, channelId);
+ if (params != null) {
+ values.put(TvContract.WatchedPrograms.COLUMN_TUNE_PARAMS,
+ encodeTuneParams(params));
+ }
sessionState.mLogUri = mContentResolver.insert(
TvContract.WatchedPrograms.CONTENT_URI, values);
@@ -1582,6 +1618,39 @@ public final class TvInputManagerService extends SystemService {
}
}
}
+
+ private String encodeTuneParams(Bundle tuneParams) {
+ StringBuilder builder = new StringBuilder();
+ Set<String> keySet = tuneParams.keySet();
+ Iterator<String> it = keySet.iterator();
+ while (it.hasNext()) {
+ String key = it.next();
+ Object value = tuneParams.get(key);
+ if (value == null) {
+ continue;
+ }
+ builder.append(replaceEscapeCharacters(key));
+ builder.append("=");
+ builder.append(replaceEscapeCharacters(value.toString()));
+ if (it.hasNext()) {
+ builder.append(", ");
+ }
+ }
+ return builder.toString();
+ }
+
+ private String replaceEscapeCharacters(String src) {
+ final char ESCAPE_CHARACTER = '%';
+ final String ENCODING_TARGET_CHARACTERS = "%=,";
+ StringBuilder builder = new StringBuilder();
+ for (char ch : src.toCharArray()) {
+ if (ENCODING_TARGET_CHARACTERS.indexOf(ch) >= 0) {
+ builder.append(ESCAPE_CHARACTER);
+ }
+ builder.append(ch);
+ }
+ return builder.toString();
+ }
}
private static final class TvInputState {
@@ -1604,6 +1673,9 @@ public final class TvInputManagerService extends SystemService {
// A set of all TV input packages.
private final Set<String> packageSet = new HashSet<String>();
+ // A set of all TV content rating system xml uris.
+ private final Set<Uri> ratingSystemXmlUriSet = new HashSet<Uri>();
+
// A mapping from the token of a client to its state.
private final Map<IBinder, ClientState> clientStateMap =
new HashMap<IBinder, ClientState>();
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
index 60724e7..d4c5f87 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
@@ -22,17 +22,20 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.os.Binder;
import android.os.Process;
-import android.util.Log;
+import android.util.Slog;
import android.webkit.IWebViewUpdateService;
import android.webkit.WebViewFactory;
+import com.android.server.SystemService;
+
/**
* Private service to wait for the updatable WebView to be ready for use.
* @hide
*/
-public class WebViewUpdateService extends IWebViewUpdateService.Stub {
+public class WebViewUpdateService extends SystemService {
private static final String TAG = "WebViewUpdateService";
+ private static final int WAIT_TIMEOUT_MS = 5000; // Same as KEY_DISPATCHING_TIMEOUT.
private boolean mRelroReady32Bit = false;
private boolean mRelroReady64Bit = false;
@@ -40,6 +43,11 @@ public class WebViewUpdateService extends IWebViewUpdateService.Stub {
private BroadcastReceiver mWebViewUpdatedReceiver;
public WebViewUpdateService(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onStart() {
mWebViewUpdatedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -52,57 +60,76 @@ public class WebViewUpdateService extends IWebViewUpdateService.Stub {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
filter.addDataScheme("package");
- context.registerReceiver(mWebViewUpdatedReceiver, filter);
+ getContext().registerReceiver(mWebViewUpdatedReceiver, filter);
+
+ publishBinderService("webviewupdate", new BinderService());
}
- /**
- * The shared relro process calls this to notify us that it's done trying to create a relro
- * file.
- */
- public void notifyRelroCreationCompleted(boolean is64Bit, boolean success) {
- // Verify that the caller is the shared relro process.
- if (Binder.getCallingUid() != Process.SHARED_RELRO_UID) {
- return;
- }
+ private void onWebViewUpdateInstalled() {
+ Slog.d(TAG, "WebView Package updated!");
synchronized (this) {
- if (is64Bit) {
- mRelroReady64Bit = true;
- } else {
- mRelroReady32Bit = true;
- }
- this.notifyAll();
+ mRelroReady32Bit = false;
+ mRelroReady64Bit = false;
}
+ WebViewFactory.onWebViewUpdateInstalled();
}
- /**
- * WebViewFactory calls this to block WebView loading until the relro file is created.
- */
- public void waitForRelroCreationCompleted(boolean is64Bit) {
- synchronized (this) {
- if (is64Bit) {
- while (!mRelroReady64Bit) {
- try {
- this.wait();
- } catch (InterruptedException e) {}
+ private class BinderService extends IWebViewUpdateService.Stub {
+
+ /**
+ * The shared relro process calls this to notify us that it's done trying to create a relro
+ * file. This method gets called even if the relro creation has failed or the process
+ * crashed.
+ */
+ @Override // Binder call
+ public void notifyRelroCreationCompleted(boolean is64Bit, boolean success) {
+ // Verify that the caller is either the shared relro process (nominal case) or the
+ // system server (only in the case the relro process crashes and we get here via the
+ // crashHandler).
+ if (Binder.getCallingUid() != Process.SHARED_RELRO_UID &&
+ Binder.getCallingUid() != Process.SYSTEM_UID) {
+ return;
+ }
+
+ synchronized (WebViewUpdateService.this) {
+ if (is64Bit) {
+ mRelroReady64Bit = true;
+ } else {
+ mRelroReady32Bit = true;
}
- } else {
- while (!mRelroReady32Bit) {
+ WebViewUpdateService.this.notifyAll();
+ }
+ }
+
+ /**
+ * WebViewFactory calls this to block WebView loading until the relro file is created.
+ */
+ @Override // Binder call
+ public void waitForRelroCreationCompleted(boolean is64Bit) {
+ // The WebViewUpdateService depends on the prepareWebViewInSystemServer call, which
+ // happens later (during the PHASE_ACTIVITY_MANAGER_READY) in SystemServer.java. If
+ // another service there tries to bring up a WebView in the between, the wait below
+ // would deadlock without the check below.
+ if (Binder.getCallingPid() == Process.myPid()) {
+ throw new IllegalStateException("Cannot create a WebView from the SystemServer");
+ }
+
+ final long NS_PER_MS = 1000000;
+ final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS;
+ boolean relroReady = (is64Bit ? mRelroReady64Bit : mRelroReady32Bit);
+ synchronized (WebViewUpdateService.this) {
+ while (!relroReady) {
+ final long timeNowMs = System.nanoTime() / NS_PER_MS;
+ if (timeNowMs >= timeoutTimeMs) break;
try {
- this.wait();
+ WebViewUpdateService.this.wait(timeoutTimeMs - timeNowMs);
} catch (InterruptedException e) {}
+ relroReady = (is64Bit ? mRelroReady64Bit : mRelroReady32Bit);
}
}
+ if (!relroReady) Slog.w(TAG, "creating relro file timed out");
}
}
- private void onWebViewUpdateInstalled() {
- Log.d(TAG, "WebView Package updated!");
-
- synchronized (this) {
- mRelroReady32Bit = false;
- mRelroReady64Bit = false;
- }
- WebViewFactory.prepareWebViewInSystemServer();
- }
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index d955354..e8d6773 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -376,6 +376,9 @@ public final class SystemServer {
mSystemServiceManager.startService(UsageStatsService.class);
mActivityManagerService.setUsageStatsManager(
LocalServices.getService(UsageStatsManagerInternal.class));
+
+ // Tracks whether the updatable WebView is in a ready state and watches for update installs.
+ mSystemServiceManager.startService(WebViewUpdateService.class);
}
/**
@@ -422,12 +425,6 @@ public final class SystemServer {
Slog.i(TAG, "Reading configuration...");
SystemConfig.getInstance();
- Slog.i(TAG, "WebView Update Service");
- ServiceManager.addService("webviewupdate", new WebViewUpdateService(context));
-
- Slog.i(TAG, "WebViewFactory preparation");
- WebViewFactory.prepareWebViewInSystemServer();
-
Slog.i(TAG, "Scheduling Policy");
ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());
@@ -1080,6 +1077,10 @@ public final class SystemServer {
} catch (Throwable e) {
reportWtf("observing native crashes", e);
}
+
+ Slog.i(TAG, "WebViewFactory preparation");
+ WebViewFactory.prepareWebViewInSystemServer();
+
try {
startSystemUi(context);
} catch (Throwable e) {
diff --git a/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java
index bb5e277..e9db030 100644
--- a/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java
+++ b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java
@@ -93,7 +93,7 @@ public class IccOpenLogicalChannelResponse implements Parcelable {
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mChannel);
out.writeInt(mStatus);
- if (mSelectResponse != null & mSelectResponse.length > 0) {
+ if (mSelectResponse != null && mSelectResponse.length > 0) {
out.writeInt(mSelectResponse.length);
out.writeByteArray(mSelectResponse);
} else {
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
index 49c3d0a..b43ad6f 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
@@ -81,11 +81,6 @@ public class MainInteractionService extends VoiceInteractionService {
private void hotwordAvailabilityChangeHelper(int availability) {
Log.i(TAG, "Hotword availability = " + availability);
switch (availability) {
- case AlwaysOnHotwordDetector.STATE_INVALID:
- Log.i(TAG, "STATE_INVALID");
- mHotwordDetector =
- createAlwaysOnHotwordDetector("Hello There", "en-US", mHotwordCallback);
- break;
case AlwaysOnHotwordDetector.STATE_HARDWARE_UNAVAILABLE:
Log.i(TAG, "STATE_HARDWARE_UNAVAILABLE");
break;
diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp
index 28de933..cf3dd0a 100644
--- a/tools/aapt/Images.cpp
+++ b/tools/aapt/Images.cpp
@@ -83,7 +83,7 @@ struct image_info
int32_t outlineInsetsRight;
int32_t outlineInsetsBottom;
float outlineRadius;
- bool outlineFilled;
+ uint8_t outlineAlpha;
png_uint_32 allocHeight;
png_bytepp allocRows;
@@ -410,12 +410,12 @@ static void find_max_opacity(png_byte** rows,
int* out_inset)
{
bool opaque_within_inset = true;
- unsigned char max_opacity = 0;
+ uint8_t max_opacity = 0;
int inset = 0;
*out_inset = 0;
for (int x = startX, y = startY; x != endX && y != endY; x += dX, y += dY, inset++) {
png_byte* color = rows[y] + x * 4;
- unsigned char opacity = color[3];
+ uint8_t opacity = color[3];
if (opacity > max_opacity) {
max_opacity = opacity;
*out_inset = inset;
@@ -424,22 +424,24 @@ static void find_max_opacity(png_byte** rows,
}
}
-static bool is_opaque_over_row(png_byte* row, int startX, int endX)
+static uint8_t max_alpha_over_row(png_byte* row, int startX, int endX)
{
+ uint8_t max_alpha = 0;
for (int x = startX; x < endX; x++) {
- png_byte* color = row + x * 4;
- if (color[3] != 0xff) return false;
+ uint8_t alpha = (row + x * 4)[3];
+ if (alpha > max_alpha) max_alpha = alpha;
}
- return true;
+ return max_alpha;
}
-static bool is_opaque_over_col(png_byte** rows, int offsetX, int startY, int endY)
+static uint8_t max_alpha_over_col(png_byte** rows, int offsetX, int startY, int endY)
{
+ uint8_t max_alpha = 0;
for (int y = startY; y < endY; y++) {
- png_byte* color = rows[y] + offsetX * 4;
- if (color[3] != 0xff) return false;
+ uint8_t alpha = (rows[y] + offsetX * 4)[3];
+ if (alpha > max_alpha) max_alpha = alpha;
}
- return true;
+ return max_alpha;
}
static void get_outline(image_info* image)
@@ -476,8 +478,8 @@ static void get_outline(image_info* image)
// assuming the image is a round rect, compute the radius by marching
// diagonally from the top left corner towards the center
- image->outlineFilled = is_opaque_over_row(image->rows[innerMidY], innerStartX, innerEndX)
- && is_opaque_over_col(image->rows, innerMidX, innerStartY, innerStartY);
+ image->outlineAlpha = max(max_alpha_over_row(image->rows[innerMidY], innerStartX, innerEndX),
+ max_alpha_over_col(image->rows, innerMidX, innerStartY, innerStartY));
int diagonalInset = 0;
find_max_opacity(image->rows, innerStartX, innerStartY, innerMidX, innerMidY, 1, 1,
@@ -487,14 +489,13 @@ static void get_outline(image_info* image)
// radius = 1 / (sqrt(2) - 1) * inset
image->outlineRadius = 2.4142f * diagonalInset;
- NOISY(printf("outline insets %d %d %d %d, rad %f, filled %d\n",
- image->outlineFilled,
+ NOISY(printf("outline insets %d %d %d %d, rad %f, alpha %x\n",
image->outlineInsetsLeft,
image->outlineInsetsTop,
image->outlineInsetsRight,
image->outlineInsetsBottom,
image->outlineRadius,
- image->outlineFilled));
+ image->outlineAlpha));
}
@@ -691,8 +692,8 @@ static status_t do_9patch(const char* imageName, image_info* image)
}
NOISY(printf("Size ticks for %s: x0=%d, x1=%d, y0=%d, y1=%d\n", imageName,
- image->info9Patch.xDivs[0], image->info9Patch.xDivs[1],
- image->info9Patch.yDivs[0], image->info9Patch.yDivs[1]));
+ xDivs[0], xDivs[1],
+ yDivs[0], yDivs[1]));
NOISY(printf("padding ticks for %s: l=%d, r=%d, t=%d, b=%d\n", imageName,
image->info9Patch.paddingLeft, image->info9Patch.paddingRight,
image->info9Patch.paddingTop, image->info9Patch.paddingBottom));
@@ -1167,7 +1168,7 @@ static void write_png(const char* imageName,
png_byte outputData[chunk_size];
memcpy(&outputData, &imageInfo.outlineInsetsLeft, 4 * sizeof(png_uint_32));
((float*) outputData)[4] = imageInfo.outlineRadius;
- ((png_uint_32*) outputData)[5] = imageInfo.outlineFilled ? 1 : 0;
+ ((png_uint_32*) outputData)[5] = imageInfo.outlineAlpha;
memcpy(unknowns[o_index].data, &outputData, chunk_size);
unknowns[o_index].size = chunk_size;
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index 67ff868..f0a7f38 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -185,6 +185,14 @@ public class ScanResult implements Parcelable {
public static class InformationElement {
public int id;
public byte[] bytes;
+
+ public InformationElement() {
+ }
+
+ public InformationElement(InformationElement rhs) {
+ this.id = rhs.id;
+ this.bytes = rhs.bytes.clone();
+ }
}
/** information elements found in the beacon
diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java
index 4cdbc44..c5c44b5 100644
--- a/wifi/java/android/net/wifi/WifiScanner.java
+++ b/wifi/java/android/net/wifi/WifiScanner.java
@@ -145,6 +145,8 @@ public class WifiScanner {
public int periodInMs;
/** must have a valid REPORT_EVENT value */
public int reportEvents;
+ /** defines number of bssids to cache from each scan */
+ public int numBssidsPerScan;
/** Implement the Parcelable interface {@hide} */
public int describeContents() {
@@ -267,13 +269,6 @@ public class WifiScanner {
public void onFullResult(ScanResult fullScanResult);
}
- /** @hide */
- public void scan(ScanSettings settings, ScanListener listener) {
- validateChannel();
- settings.periodInMs = 0;
- sAsyncChannel.sendMessage(CMD_SCAN, 0, putListener(listener), settings);
- }
-
/** start wifi scan in background
* @param settings specifies various parameters for the scan; for more information look at
* {@link ScanSettings}
@@ -305,7 +300,7 @@ public class WifiScanner {
}
/** specifies information about an access point of interest */
- public static class HotspotInfo {
+ public static class BssidInfo {
/** bssid of the access point; in XX:XX:XX:XX:XX:XX format */
public String bssid;
/** low signal strength threshold; more information at {@link ScanResult#level} */
@@ -324,7 +319,7 @@ public class WifiScanner {
public int unchangedSampleSize; /* samples to confirm no change */
public int minApsBreachingThreshold; /* change threshold to trigger event */
public int periodInMs; /* scan period in millisecond */
- public HotspotInfo[] hotspotInfos;
+ public BssidInfo[] bssidInfos;
/** Implement the Parcelable interface {@hide} */
public int describeContents() {
@@ -338,10 +333,10 @@ public class WifiScanner {
dest.writeInt(unchangedSampleSize);
dest.writeInt(minApsBreachingThreshold);
dest.writeInt(periodInMs);
- if (hotspotInfos != null) {
- dest.writeInt(hotspotInfos.length);
- for (int i = 0; i < hotspotInfos.length; i++) {
- HotspotInfo info = hotspotInfos[i];
+ if (bssidInfos != null) {
+ dest.writeInt(bssidInfos.length);
+ for (int i = 0; i < bssidInfos.length; i++) {
+ BssidInfo info = bssidInfos[i];
dest.writeString(info.bssid);
dest.writeInt(info.low);
dest.writeInt(info.high);
@@ -363,14 +358,14 @@ public class WifiScanner {
settings.minApsBreachingThreshold = in.readInt();
settings.periodInMs = in.readInt();
int len = in.readInt();
- settings.hotspotInfos = new HotspotInfo[len];
+ settings.bssidInfos = new BssidInfo[len];
for (int i = 0; i < len; i++) {
- HotspotInfo info = new HotspotInfo();
+ BssidInfo info = new BssidInfo();
info.bssid = in.readString();
info.low = in.readInt();
info.high = in.readInt();
info.frequencyHint = in.readInt();
- settings.hotspotInfos[i] = info;
+ settings.bssidInfos[i] = info;
}
return settings;
}
@@ -389,7 +384,7 @@ public class WifiScanner {
* @param minApsBreachingThreshold minimum number of access points that need to be
* out of range to detect WifiChange
* @param periodInMs indicates period of scan to find changes
- * @param hotspotInfos access points to watch
+ * @param bssidInfos access points to watch
*/
public void configureWifiChange(
int rssiSampleSize, /* sample size for RSSI averaging */
@@ -397,7 +392,7 @@ public class WifiScanner {
int unchangedSampleSize, /* samples to confirm no change */
int minApsBreachingThreshold, /* change threshold to trigger event */
int periodInMs, /* period of scan */
- HotspotInfo[] hotspotInfos /* signal thresholds to crosss */
+ BssidInfo[] bssidInfos /* signal thresholds to crosss */
)
{
validateChannel();
@@ -408,7 +403,7 @@ public class WifiScanner {
settings.unchangedSampleSize = unchangedSampleSize;
settings.minApsBreachingThreshold = minApsBreachingThreshold;
settings.periodInMs = periodInMs;
- settings.hotspotInfos = hotspotInfos;
+ settings.bssidInfos = bssidInfos;
configureWifiChange(settings);
}
@@ -455,7 +450,7 @@ public class WifiScanner {
}
/** interface to receive hotlist events on; use this on {@link #setHotlist} */
- public static interface HotspotListener extends ActionListener {
+ public static interface BssidListener extends ActionListener {
/** indicates that access points were found by on going scans
* @param results list of scan results, one for each access point visible currently
*/
@@ -465,7 +460,7 @@ public class WifiScanner {
/** @hide */
@SystemApi
public static class HotlistSettings implements Parcelable {
- public HotspotInfo[] hotspotInfos;
+ public BssidInfo[] bssidInfos;
public int apLostThreshold;
/** Implement the Parcelable interface {@hide} */
@@ -477,10 +472,10 @@ public class WifiScanner {
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(apLostThreshold);
- if (hotspotInfos != null) {
- dest.writeInt(hotspotInfos.length);
- for (int i = 0; i < hotspotInfos.length; i++) {
- HotspotInfo info = hotspotInfos[i];
+ if (bssidInfos != null) {
+ dest.writeInt(bssidInfos.length);
+ for (int i = 0; i < bssidInfos.length; i++) {
+ BssidInfo info = bssidInfos[i];
dest.writeString(info.bssid);
dest.writeInt(info.low);
dest.writeInt(info.high);
@@ -498,14 +493,14 @@ public class WifiScanner {
HotlistSettings settings = new HotlistSettings();
settings.apLostThreshold = in.readInt();
int n = in.readInt();
- settings.hotspotInfos = new HotspotInfo[n];
+ settings.bssidInfos = new BssidInfo[n];
for (int i = 0; i < n; i++) {
- HotspotInfo info = new HotspotInfo();
+ BssidInfo info = new BssidInfo();
info.bssid = in.readString();
info.low = in.readInt();
info.high = in.readInt();
info.frequencyHint = in.readInt();
- settings.hotspotInfos[i] = info;
+ settings.bssidInfos[i] = info;
}
return settings;
}
@@ -518,24 +513,24 @@ public class WifiScanner {
/**
* set interesting access points to find
- * @param hotspots access points of interest
+ * @param bssidInfos access points of interest
* @param apLostThreshold number of scans needed to indicate that AP is lost
* @param listener object provided to report events on; this object must be unique and must
- * also be provided on {@link #stopTrackingHotspots}
+ * also be provided on {@link #stopTrackingBssids}
*/
- public void startTrackingHotspots(HotspotInfo[] hotspots,
- int apLostThreshold, HotspotListener listener) {
+ public void startTrackingBssids(BssidInfo[] bssidInfos,
+ int apLostThreshold, BssidListener listener) {
validateChannel();
HotlistSettings settings = new HotlistSettings();
- settings.hotspotInfos = hotspots;
+ settings.bssidInfos = bssidInfos;
sAsyncChannel.sendMessage(CMD_SET_HOTLIST, 0, putListener(listener), settings);
}
/**
* remove tracking of interesting access points
- * @param listener same object provided in {@link #startTrackingHotspots}
+ * @param listener same object provided in {@link #startTrackingBssids}
*/
- public void stopTrackingHotspots(HotspotListener listener) {
+ public void stopTrackingBssids(BssidListener listener) {
validateChannel();
sAsyncChannel.sendMessage(CMD_RESET_HOTLIST, 0, removeListener(listener));
}
@@ -802,7 +797,7 @@ public class WifiScanner {
((ScanListener) listener).onPeriodChanged(msg.arg1);
return;
case CMD_AP_FOUND:
- ((HotspotListener) listener).onFound(
+ ((BssidListener) listener).onFound(
((ParcelableScanResults) msg.obj).getResults());
return;
case CMD_WIFI_CHANGE_DETECTED: