diff options
Diffstat (limited to 'packages')
175 files changed, 1780 insertions, 214 deletions
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index d876264..ddbcd78 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -336,12 +336,24 @@ public class CaptivePortalLoginActivity extends Activity { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { - Log.w(TAG, "SSL error; displaying SSL warning."); + Log.w(TAG, "SSL error (error: " + error.getPrimaryError() + " host: " + + // Only show host to avoid leaking private info. + Uri.parse(error.getUrl()).getHost() + " certificate: " + + error.getCertificate() + "); displaying SSL warning."); final String html = String.format(SSL_ERROR_HTML, getString(R.string.ssl_error_warning), getString(R.string.ssl_error_example), mBrowserBailOutToken, getString(R.string.ssl_error_continue)); view.loadDataWithBaseURL(INTERNAL_ASSETS, html, "text/HTML", "UTF-8", null); } + + @Override + public boolean shouldOverrideUrlLoading (WebView view, String url) { + if (url.startsWith("tel:")) { + startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url))); + return true; + } + return false; + } } private class MyWebChromeClient extends WebChromeClient { diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differindex 95b2b6d..67f890c 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept_alpha.png Binary files differdeleted file mode 100644 index ddf9a80..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel_alpha.png Binary files differindex 7168197..1a9cd75 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item_alpha.png Binary files differdeleted file mode 100644 index 1c6ec6a..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_alpha.png Binary files differindex 11546a7..4c3d9a4 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_alpha.png Binary files differindex de5c113..da56077 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_album_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_album_alpha.png Binary files differindex 769144a..2b21c12 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_album_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_album_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk_alpha.png Binary files differindex 22f95b9..ed3ee45 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_alpha.png Binary files differindex c5152f4..1a3ebc4 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_folder_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_folder_alpha.png Binary files differdeleted file mode 100644 index eb71f81..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy_alpha.png Binary files differindex 4997173..9a9e570 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect_am_alpha.png Binary files differdeleted file mode 100644 index 59eef4d..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am_alpha.png Binary files differindex cd8987a..1d25a2d 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_overflow_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_overflow_alpha.png Binary files differdeleted file mode 100644 index 95716b3..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_overflow_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename_am_alpha.png Binary files differdeleted file mode 100644 index 76394c4..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_alpha.png Binary files differindex 941b93c..c593e7a 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings_alpha.png Binary files differdeleted file mode 100644 index 4f5bcea..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am_alpha.png Binary files differindex fad19c1..5e66488 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo_am_alpha.png Binary files differdeleted file mode 100644 index df94033..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid_alpha.png Binary files differindex 87154ad..7e15a8c 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list_alpha.png Binary files differindex 9b40dae..c15537a 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_open_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_open_am_alpha.png Binary files differdeleted file mode 100644 index 6b0d909..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_open_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_popout_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_popout_am_alpha.png Binary files differdeleted file mode 100644 index e1c39f8..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_popout_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_alpha.png Binary files differindex 092556a..d9aacea 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_am_alpha.png Binary files differdeleted file mode 100644 index 223e619..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_alpha.png Binary files differindex 37fbdf7..9e003f0 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_alpha.png Binary files differindex 0929f93..65e42aa 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_alpha.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_alpha.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb_light_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb_light_alpha.png Binary files differdeleted file mode 100644 index 738ef84..0000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb_light_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differindex 897f7a9..9a048f1 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept_alpha.png Binary files differdeleted file mode 100644 index c9224a6..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel_alpha.png Binary files differindex 3bb74f9..40a1a84 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item_alpha.png Binary files differdeleted file mode 100644 index 2d47376..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_alpha.png Binary files differindex 3868210..e768d11 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_alpha.png Binary files differindex a74854d..5ef3dc0 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_album_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_album_alpha.png Binary files differindex f5e45a7..ac27eea 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_album_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_album_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk_alpha.png Binary files differindex 67e33ce..a4add51 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_alpha.png Binary files differindex 34093d0..a9a7f20 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_folder_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_folder_alpha.png Binary files differdeleted file mode 100644 index 5ecddc5..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy_alpha.png Binary files differindex f8a5262..c94cc28 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect_am_alpha.png Binary files differdeleted file mode 100644 index d8ebf49..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am_alpha.png Binary files differindex 62c47d5..6e6b870 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_overflow_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_overflow_alpha.png Binary files differdeleted file mode 100644 index 0825647..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_overflow_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename_am_alpha.png Binary files differdeleted file mode 100644 index 9d9e3d7..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_alpha.png Binary files differindex 9fc1df6..6b16343 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings_alpha.png Binary files differdeleted file mode 100644 index c95381b..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am_alpha.png Binary files differindex f95d30d..04a12a4 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo_am_alpha.png Binary files differdeleted file mode 100644 index 47c00dd..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid_alpha.png Binary files differindex fe2c78c..5f968d5 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list_alpha.png Binary files differindex 8b3a303..7a8eae9 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_open_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_open_am_alpha.png Binary files differdeleted file mode 100644 index 5923c08..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_open_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_popout_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_popout_am_alpha.png Binary files differdeleted file mode 100644 index 0e45037..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_popout_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_alpha.png Binary files differindex a55f4ca..c2c845e 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_am_alpha.png Binary files differdeleted file mode 100644 index 993e060..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_alpha.png Binary files differindex f359c4b..f500d58 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_alpha.png Binary files differindex dd76d07..1de8292 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_alpha.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_alpha.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb_light_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb_light_alpha.png Binary files differdeleted file mode 100644 index fccd45e..0000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb_light_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differindex 5d0805e..073583e 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept_alpha.png Binary files differdeleted file mode 100644 index 1a3d7c4..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel_alpha.png Binary files differindex 14b9aef..6bc4372 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item_alpha.png Binary files differdeleted file mode 100644 index 953ab62..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_alpha.png Binary files differindex 5198b84..2ea6164 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_alpha.png Binary files differindex cdf8c95..46ed12a 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_album_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_album_alpha.png Binary files differindex aecd4cf..4203d35 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_album_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_album_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk_alpha.png Binary files differindex 24ad2dd..41558f2 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_alpha.png Binary files differindex bf9dbde..e190c4d 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_folder_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_folder_alpha.png Binary files differdeleted file mode 100644 index cd24dfe..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy_alpha.png Binary files differindex 9afd1a1..1cf76a9 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect_am_alpha.png Binary files differdeleted file mode 100644 index 95b0bb8..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am_alpha.png Binary files differindex 14e96e2..49272b0 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_overflow_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_overflow_alpha.png Binary files differdeleted file mode 100644 index 311e4dc..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_overflow_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename_am_alpha.png Binary files differdeleted file mode 100644 index e2e3925..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_alpha.png Binary files differindex 6b2ddad..6381902 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings_alpha.png Binary files differdeleted file mode 100644 index 304435a..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am_alpha.png Binary files differindex 27e6acf..9e4fd61 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo_am_alpha.png Binary files differdeleted file mode 100644 index 146b196..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid_alpha.png Binary files differindex cc4d40c..630188c 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list_alpha.png Binary files differindex 6c897c4..73372f4 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_open_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_open_am_alpha.png Binary files differdeleted file mode 100644 index be6fb5d..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_open_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_popout_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_popout_am_alpha.png Binary files differdeleted file mode 100644 index 7ba284f..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_popout_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_alpha.png Binary files differindex 9bda62c..f5afb24 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_am_alpha.png Binary files differdeleted file mode 100644 index 24dce60..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_alpha.png Binary files differindex 5ef3288..fe71c25 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_alpha.png Binary files differindex 99b8054..00b8a8b 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_alpha.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb_light_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb_light_alpha.png Binary files differdeleted file mode 100644 index 80717e4..0000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb_light_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differindex 02a988b..b96cfd1 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept_alpha.png Binary files differdeleted file mode 100644 index a23a9ae..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel_alpha.png Binary files differindex b10db3e..51b4401 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item_alpha.png Binary files differdeleted file mode 100644 index 3606fb3..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_alpha.png Binary files differindex 0a54598..ed36f70 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_alpha.png Binary files differindex 6d3260c..a81eeb9 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_album_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_album_alpha.png Binary files differindex 31dc7a4..60f59f5 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_album_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_album_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk_alpha.png Binary files differindex 5d0f0db..6006b12 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_alpha.png Binary files differindex 8116b62..7926188 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_folder_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_folder_alpha.png Binary files differdeleted file mode 100644 index 02249d2..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy_alpha.png Binary files differindex 90d1a09..074ea88 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect_am_alpha.png Binary files differdeleted file mode 100644 index 7a993b9..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am_alpha.png Binary files differindex 12d279b..5c4360a 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_overflow_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_overflow_alpha.png Binary files differdeleted file mode 100644 index 325c48a..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_overflow_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename_am_alpha.png Binary files differdeleted file mode 100644 index ee2465db..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_alpha.png Binary files differindex 538fbe5..3ae490e 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings_alpha.png Binary files differdeleted file mode 100644 index d99206c..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am_alpha.png Binary files differindex 4f1355c..cb9d196 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo_am_alpha.png Binary files differdeleted file mode 100644 index d5cc56f..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid_alpha.png Binary files differindex de96c3f..7560f62 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list_alpha.png Binary files differindex 7805834..b9483c3 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_open_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_open_am_alpha.png Binary files differdeleted file mode 100644 index 7ed919c..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_open_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_popout_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_popout_am_alpha.png Binary files differdeleted file mode 100644 index 756b684..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_popout_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_alpha.png Binary files differindex ffb9841..ce97c85 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_am_alpha.png Binary files differdeleted file mode 100644 index 305a6b8..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_alpha.png Binary files differindex dc1425d..1dad2a8 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_alpha.png Binary files differindex cea8ac0..5236774 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb_light_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb_light_alpha.png Binary files differdeleted file mode 100644 index e0a1d23..0000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb_light_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differindex 84573f6..6f2dc5b 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_breadcrumb_arrow_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_breadcrumb_arrow_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_accept_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_accept_alpha.png Binary files differdeleted file mode 100644 index 986d3fb..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_accept_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_cancel_alpha.png Binary files differindex ce443f9..df42fee 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_cancel_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_cancel_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_select_item_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_select_item_alpha.png Binary files differdeleted file mode 100644 index a54e0ea..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_select_item_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_alert_alpha.png Binary files differindex 6e65716..3f4d539 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_alert_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_alert_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_info_alpha.png Binary files differindex 35bd56e..c8f86b9 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_info_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_info_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_album_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_album_alpha.png Binary files differindex 64aa50b..d2dd494 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_album_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_album_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_apk_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_apk_alpha.png Binary files differindex 7cbcb8b..4f935bf 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_apk_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_apk_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_audio_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_audio_alpha.png Binary files differindex d6d79ec..7499cbc 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_audio_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_doc_audio_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_folder_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_folder_alpha.png Binary files differdeleted file mode 100644 index c0c27a2..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_copy_alpha.png Binary files differindex 2dcf03e..1f6af72 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_copy_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_copy_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_disconnect_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_disconnect_am_alpha.png Binary files differdeleted file mode 100644 index d7eb04f..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_disconnect_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_new_folder_am_alpha.png Binary files differindex 879bf45..073d8533 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_new_folder_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_new_folder_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_overflow_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_overflow_alpha.png Binary files differdeleted file mode 100644 index 2cd4137..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_overflow_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_rename_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_rename_am_alpha.png Binary files differdeleted file mode 100644 index 268049e..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_rename_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_search_alpha.png Binary files differindex 78fc61d..21be572 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_search_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_search_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_settings_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_settings_alpha.png Binary files differdeleted file mode 100644 index 36e8e68..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_settings_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_sortby_am_alpha.png Binary files differindex 827a92c..631663a 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_sortby_am_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_sortby_am_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_undo_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_undo_am_alpha.png Binary files differdeleted file mode 100644 index 0f12b7d..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_undo_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_grid_alpha.png Binary files differindex df1bac1..5d1e8d9 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_grid_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_grid_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_list_alpha.png Binary files differindex 9420374..7c1506b 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_list_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_list_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_open_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_open_am_alpha.png Binary files differdeleted file mode 100644 index 0394c5c..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_open_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_popout_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_popout_am_alpha.png Binary files differdeleted file mode 100644 index 325d374..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_popout_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_download_alpha.png Binary files differindex 87a5210..8c83bff 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_download_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_download_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_folder_am_alpha.png Binary files differdeleted file mode 100644 index bb41a91..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_recent_alpha.png Binary files differindex baa723d..68df974 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_recent_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_recent_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_sdcard_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_sdcard_alpha.png Binary files differindex 39c737f..c7daa2a 100644 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_sdcard_alpha.png +++ b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_sdcard_alpha.png diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_usb_light_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_usb_light_alpha.png Binary files differdeleted file mode 100644 index 88973e0..0000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_usb_light_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable/ic_cab_accept.xml b/packages/DocumentsUI/res/drawable/ic_cab_accept.xml deleted file mode 100644 index cda2845..0000000 --- a/packages/DocumentsUI/res/drawable/ic_cab_accept.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_cab_accept_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_cab_select_item.xml b/packages/DocumentsUI/res/drawable/ic_cab_select_item.xml deleted file mode 100644 index e440ee9..0000000 --- a/packages/DocumentsUI/res/drawable/ic_cab_select_item.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_cab_select_item_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_folder.xml b/packages/DocumentsUI/res/drawable/ic_folder.xml deleted file mode 100644 index 8adaf3b..0000000 --- a/packages/DocumentsUI/res/drawable/ic_folder.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_folder_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_disconnect.xml b/packages/DocumentsUI/res/drawable/ic_menu_disconnect.xml deleted file mode 100644 index 15c5c39..0000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_disconnect.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_disconnect_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_overflow.xml b/packages/DocumentsUI/res/drawable/ic_menu_overflow.xml deleted file mode 100644 index a579b60..0000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_overflow.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_overflow_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_rename.xml b/packages/DocumentsUI/res/drawable/ic_menu_rename.xml deleted file mode 100644 index b5ba30c..0000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_rename.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_rename_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_settings.xml b/packages/DocumentsUI/res/drawable/ic_menu_settings.xml deleted file mode 100644 index 7606e75..0000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_settings.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_settings_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_undo.xml b/packages/DocumentsUI/res/drawable/ic_menu_undo.xml deleted file mode 100644 index d66ba6d..0000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_undo.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_undo_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/ic_open.xml b/packages/DocumentsUI/res/drawable/ic_open.xml deleted file mode 100644 index e3f1faf..0000000 --- a/packages/DocumentsUI/res/drawable/ic_open.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_open_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/ic_popout.xml b/packages/DocumentsUI/res/drawable/ic_popout.xml deleted file mode 100644 index e7d0f75..0000000 --- a/packages/DocumentsUI/res/drawable/ic_popout.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_popout_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/ic_root_folder.xml b/packages/DocumentsUI/res/drawable/ic_root_folder.xml deleted file mode 100644 index 01df07b..0000000 --- a/packages/DocumentsUI/res/drawable/ic_root_folder.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_root_folder_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/ic_root_usb_light.xml b/packages/DocumentsUI/res/drawable/ic_root_usb_light.xml deleted file mode 100644 index 5f80dd9..0000000 --- a/packages/DocumentsUI/res/drawable/ic_root_usb_light.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_root_usb_light_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/layout-sw720dp/activity.xml b/packages/DocumentsUI/res/layout-sw720dp/activity.xml index 7b40a0f..a9f1b3c 100644 --- a/packages/DocumentsUI/res/layout-sw720dp/activity.xml +++ b/packages/DocumentsUI/res/layout-sw720dp/activity.xml @@ -41,7 +41,9 @@ android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal" - android:baselineAligned="false"> + android:baselineAligned="false" + android:divider="?android:attr/dividerVertical" + android:showDividers="middle"> <FrameLayout android:id="@+id/container_roots" diff --git a/packages/SettingsLib/AndroidManifest.xml b/packages/SettingsLib/AndroidManifest.xml index eacafd5..3873593 100644 --- a/packages/SettingsLib/AndroidManifest.xml +++ b/packages/SettingsLib/AndroidManifest.xml @@ -16,5 +16,9 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.settingslib"> + package="com.android.settingslib"> + + <uses-sdk + android:minSdkVersion="21" /> + </manifest> diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java new file mode 100644 index 0000000..b5e53c0 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -0,0 +1,1347 @@ +/* + * Copyright (C) 2015 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.settingslib.applications; + +import android.app.ActivityManager; +import android.app.AppGlobals; +import android.app.Application; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageManager; +import android.content.pm.IPackageStatsObserver; +import android.content.pm.PackageManager; +import android.content.pm.PackageStats; +import android.content.pm.ParceledListSlice; +import android.content.pm.ResolveInfo; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.os.Process; +import android.os.RemoteException; +import android.os.SystemClock; +import android.os.UserHandle; +import android.os.UserManager; +import android.text.format.Formatter; +import android.util.Log; +import android.util.SparseArray; + +import java.io.File; +import java.text.Collator; +import java.text.Normalizer; +import java.text.Normalizer.Form; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; +import java.util.regex.Pattern; + +/** + * Keeps track of information about all installed applications, lazy-loading + * as needed. + */ +public class ApplicationsState { + static final String TAG = "ApplicationsState"; + static final boolean DEBUG = false; + static final boolean DEBUG_LOCKING = false; + + public static final int SIZE_UNKNOWN = -1; + public static final int SIZE_INVALID = -2; + + static final Pattern REMOVE_DIACRITICALS_PATTERN + = Pattern.compile("\\p{InCombiningDiacriticalMarks}+"); + + static final Object sLock = new Object(); + static ApplicationsState sInstance; + + public static ApplicationsState getInstance(Application app) { + synchronized (sLock) { + if (sInstance == null) { + sInstance = new ApplicationsState(app); + } + return sInstance; + } + } + + final Context mContext; + final PackageManager mPm; + final IPackageManager mIpm; + final UserManager mUm; + final int mOwnerRetrieveFlags; + final int mRetrieveFlags; + PackageIntentReceiver mPackageIntentReceiver; + + boolean mResumed; + boolean mHaveDisabledApps; + + // Information about all applications. Synchronize on mEntriesMap + // to protect access to these. + final ArrayList<Session> mSessions = new ArrayList<Session>(); + final ArrayList<Session> mRebuildingSessions = new ArrayList<Session>(); + final InterestingConfigChanges mInterestingConfigChanges = new InterestingConfigChanges(); + // Map: userid => (Map: package name => AppEntry) + final SparseArray<HashMap<String, AppEntry>> mEntriesMap = + new SparseArray<HashMap<String, AppEntry>>(); + final ArrayList<AppEntry> mAppEntries = new ArrayList<AppEntry>(); + List<ApplicationInfo> mApplications = new ArrayList<ApplicationInfo>(); + long mCurId = 1; + String mCurComputingSizePkg; + int mCurComputingSizeUserId; + boolean mSessionsChanged; + + // Temporary for dispatching session callbacks. Only touched by main thread. + final ArrayList<Session> mActiveSessions = new ArrayList<Session>(); + + final HandlerThread mThread; + final BackgroundHandler mBackgroundHandler; + final MainHandler mMainHandler = new MainHandler(); + + private ApplicationsState(Application app) { + mContext = app; + mPm = mContext.getPackageManager(); + mIpm = AppGlobals.getPackageManager(); + mUm = (UserManager) app.getSystemService(Context.USER_SERVICE); + for (UserHandle user : mUm.getUserProfiles()) { + mEntriesMap.put(user.getIdentifier(), new HashMap<String, AppEntry>()); + } + mThread = new HandlerThread("ApplicationsState.Loader", + Process.THREAD_PRIORITY_BACKGROUND); + mThread.start(); + mBackgroundHandler = new BackgroundHandler(mThread.getLooper()); + + // Only the owner can see all apps. + mOwnerRetrieveFlags = PackageManager.GET_UNINSTALLED_PACKAGES | + PackageManager.GET_DISABLED_COMPONENTS | + PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS; + mRetrieveFlags = PackageManager.GET_DISABLED_COMPONENTS | + PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS; + + /** + * This is a trick to prevent the foreground thread from being delayed. + * The problem is that Dalvik monitors are initially spin locks, to keep + * them lightweight. This leads to unfair contention -- Even though the + * background thread only holds the lock for a short amount of time, if + * it keeps running and locking again it can prevent the main thread from + * acquiring its lock for a long time... sometimes even > 5 seconds + * (leading to an ANR). + * + * Dalvik will promote a monitor to a "real" lock if it detects enough + * contention on it. It doesn't figure this out fast enough for us + * here, though, so this little trick will force it to turn into a real + * lock immediately. + */ + synchronized (mEntriesMap) { + try { + mEntriesMap.wait(1); + } catch (InterruptedException e) { + } + } + } + + public Looper getBackgroundLooper() { + return mThread.getLooper(); + } + + public Session newSession(Callbacks callbacks) { + Session s = new Session(callbacks); + synchronized (mEntriesMap) { + mSessions.add(s); + } + return s; + } + + void doResumeIfNeededLocked() { + if (mResumed) { + return; + } + mResumed = true; + if (mPackageIntentReceiver == null) { + mPackageIntentReceiver = new PackageIntentReceiver(); + mPackageIntentReceiver.registerReceiver(); + } + mApplications = new ArrayList<ApplicationInfo>(); + for (UserHandle user : mUm.getUserProfiles()) { + try { + // If this user is new, it needs a map created. + if (mEntriesMap.indexOfKey(user.getIdentifier()) < 0) { + mEntriesMap.put(user.getIdentifier(), new HashMap<String, AppEntry>()); + } + @SuppressWarnings("unchecked") + ParceledListSlice<ApplicationInfo> list = + mIpm.getInstalledApplications( + user.isOwner() ? mOwnerRetrieveFlags : mRetrieveFlags, + user.getIdentifier()); + mApplications.addAll(list.getList()); + } catch (RemoteException e) { + } + } + + if (mInterestingConfigChanges.applyNewConfig(mContext.getResources())) { + // If an interesting part of the configuration has changed, we + // should completely reload the app entries. + clearEntries(); + } else { + for (int i=0; i<mAppEntries.size(); i++) { + mAppEntries.get(i).sizeStale = true; + } + } + + mHaveDisabledApps = false; + for (int i=0; i<mApplications.size(); i++) { + final ApplicationInfo info = mApplications.get(i); + // Need to trim out any applications that are disabled by + // something different than the user. + if (!info.enabled) { + if (info.enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { + mApplications.remove(i); + i--; + continue; + } + mHaveDisabledApps = true; + } + int userId = UserHandle.getUserId(info.uid); + final AppEntry entry = mEntriesMap.get(userId).get(info.packageName); + if (entry != null) { + entry.info = info; + } + } + if (mAppEntries.size() > mApplications.size()) { + // There are less apps now, some must have been uninstalled. + clearEntries(); + } + mCurComputingSizePkg = null; + if (!mBackgroundHandler.hasMessages(BackgroundHandler.MSG_LOAD_ENTRIES)) { + mBackgroundHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ENTRIES); + } + } + + private void clearEntries() { + for (int i = 0; i < mEntriesMap.size(); i++) { + mEntriesMap.valueAt(i).clear(); + } + mAppEntries.clear(); + } + + public boolean haveDisabledApps() { + return mHaveDisabledApps; + } + + void doPauseIfNeededLocked() { + if (!mResumed) { + return; + } + for (int i=0; i<mSessions.size(); i++) { + if (mSessions.get(i).mResumed) { + return; + } + } + doPauseLocked(); + } + + void doPauseLocked() { + mResumed = false; + if (mPackageIntentReceiver != null) { + mPackageIntentReceiver.unregisterReceiver(); + mPackageIntentReceiver = null; + } + } + + public AppEntry getEntry(String packageName, int userId) { + if (DEBUG_LOCKING) Log.v(TAG, "getEntry about to acquire lock..."); + synchronized (mEntriesMap) { + AppEntry entry = mEntriesMap.get(userId).get(packageName); + if (entry == null) { + ApplicationInfo info = getAppInfoLocked(packageName, userId); + if (info == null) { + try { + info = mIpm.getApplicationInfo(packageName, 0, userId); + } catch (RemoteException e) { + Log.w(TAG, "getEntry couldn't reach PackageManager", e); + return null; + } + } + entry = getEntryLocked(info); + } + if (DEBUG_LOCKING) Log.v(TAG, "...getEntry releasing lock"); + return entry; + } + } + + private ApplicationInfo getAppInfoLocked(String pkg, int userId) { + for (int i = 0; i < mApplications.size(); i++) { + ApplicationInfo info = mApplications.get(i); + if (pkg.equals(info.packageName) + && userId == UserHandle.getUserId(info.uid)) { + return info; + } + } + return null; + } + + public void ensureIcon(AppEntry entry) { + if (entry.icon != null) { + return; + } + synchronized (entry) { + entry.ensureIconLocked(mContext, mPm); + } + } + + public void requestSize(String packageName, int userId) { + if (DEBUG_LOCKING) Log.v(TAG, "requestSize about to acquire lock..."); + synchronized (mEntriesMap) { + AppEntry entry = mEntriesMap.get(userId).get(packageName); + if (entry != null) { + mPm.getPackageSizeInfo(packageName, userId, mBackgroundHandler.mStatsObserver); + } + if (DEBUG_LOCKING) Log.v(TAG, "...requestSize releasing lock"); + } + } + + long sumCacheSizes() { + long sum = 0; + if (DEBUG_LOCKING) Log.v(TAG, "sumCacheSizes about to acquire lock..."); + synchronized (mEntriesMap) { + if (DEBUG_LOCKING) Log.v(TAG, "-> sumCacheSizes now has lock"); + for (int i=mAppEntries.size()-1; i>=0; i--) { + sum += mAppEntries.get(i).cacheSize; + } + if (DEBUG_LOCKING) Log.v(TAG, "...sumCacheSizes releasing lock"); + } + return sum; + } + + int indexOfApplicationInfoLocked(String pkgName, int userId) { + for (int i=mApplications.size()-1; i>=0; i--) { + ApplicationInfo appInfo = mApplications.get(i); + if (appInfo.packageName.equals(pkgName) + && UserHandle.getUserId(appInfo.uid) == userId) { + return i; + } + } + return -1; + } + + void addPackage(String pkgName, int userId) { + try { + synchronized (mEntriesMap) { + if (DEBUG_LOCKING) Log.v(TAG, "addPackage acquired lock"); + if (DEBUG) Log.i(TAG, "Adding package " + pkgName); + if (!mResumed) { + // If we are not resumed, we will do a full query the + // next time we resume, so there is no reason to do work + // here. + if (DEBUG_LOCKING) Log.v(TAG, "addPackage release lock: not resumed"); + return; + } + if (indexOfApplicationInfoLocked(pkgName, userId) >= 0) { + if (DEBUG) Log.i(TAG, "Package already exists!"); + if (DEBUG_LOCKING) Log.v(TAG, "addPackage release lock: already exists"); + return; + } + ApplicationInfo info = mIpm.getApplicationInfo(pkgName, + userId == UserHandle.USER_OWNER ? mOwnerRetrieveFlags : mRetrieveFlags, + userId); + if (info == null) { + return; + } + if (!info.enabled) { + if (info.enabledSetting + != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { + return; + } + mHaveDisabledApps = true; + } + mApplications.add(info); + if (!mBackgroundHandler.hasMessages(BackgroundHandler.MSG_LOAD_ENTRIES)) { + mBackgroundHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ENTRIES); + } + if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_LIST_CHANGED)) { + mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_LIST_CHANGED); + } + if (DEBUG_LOCKING) Log.v(TAG, "addPackage releasing lock"); + } + } catch (RemoteException e) { + } + } + + public void removePackage(String pkgName, int userId) { + synchronized (mEntriesMap) { + if (DEBUG_LOCKING) Log.v(TAG, "removePackage acquired lock"); + int idx = indexOfApplicationInfoLocked(pkgName, userId); + if (DEBUG) Log.i(TAG, "removePackage: " + pkgName + " @ " + idx); + if (idx >= 0) { + AppEntry entry = mEntriesMap.get(userId).get(pkgName); + if (DEBUG) Log.i(TAG, "removePackage: " + entry); + if (entry != null) { + mEntriesMap.get(userId).remove(pkgName); + mAppEntries.remove(entry); + } + ApplicationInfo info = mApplications.get(idx); + mApplications.remove(idx); + if (!info.enabled) { + mHaveDisabledApps = false; + for (int i=0; i<mApplications.size(); i++) { + if (!mApplications.get(i).enabled) { + mHaveDisabledApps = true; + break; + } + } + } + if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_LIST_CHANGED)) { + mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_LIST_CHANGED); + } + } + if (DEBUG_LOCKING) Log.v(TAG, "removePackage releasing lock"); + } + } + + public void invalidatePackage(String pkgName, int userId) { + removePackage(pkgName, userId); + addPackage(pkgName, userId); + } + + private void addUser(int userId) { + if (mUm.getUserProfiles().contains(new UserHandle(userId))) { + synchronized (mEntriesMap) { + mEntriesMap.put(userId, new HashMap<String, AppEntry>()); + if (mResumed) { + // If resumed, Manually pause, then cause a resume to repopulate the app list. + // This is the simplest way to reload the packages so that the new user + // is included. Otherwise the list will be repopulated on next resume. + doPauseLocked(); + doResumeIfNeededLocked(); + } + if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_LIST_CHANGED)) { + mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_LIST_CHANGED); + } + } + } + } + + private void removeUser(int userId) { + synchronized (mEntriesMap) { + HashMap<String, AppEntry> userMap = mEntriesMap.get(userId); + if (userMap != null) { + for (AppEntry appEntry : userMap.values()) { + mAppEntries.remove(appEntry); + mApplications.remove(appEntry.info); + } + mEntriesMap.remove(userId); + if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_LIST_CHANGED)) { + mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_LIST_CHANGED); + } + } + } + } + + private AppEntry getEntryLocked(ApplicationInfo info) { + int userId = UserHandle.getUserId(info.uid); + AppEntry entry = mEntriesMap.get(userId).get(info.packageName); + if (DEBUG) Log.i(TAG, "Looking up entry of pkg " + info.packageName + ": " + entry); + if (entry == null) { + if (DEBUG) Log.i(TAG, "Creating AppEntry for " + info.packageName); + entry = new AppEntry(mContext, info, mCurId++); + mEntriesMap.get(userId).put(info.packageName, entry); + mAppEntries.add(entry); + } else if (entry.info != info) { + entry.info = info; + } + return entry; + } + + // -------------------------------------------------------------- + + private long getTotalInternalSize(PackageStats ps) { + if (ps != null) { + return ps.codeSize + ps.dataSize; + } + return SIZE_INVALID; + } + + private long getTotalExternalSize(PackageStats ps) { + if (ps != null) { + // We also include the cache size here because for non-emulated + // we don't automtically clean cache files. + return ps.externalCodeSize + ps.externalDataSize + + ps.externalCacheSize + + ps.externalMediaSize + ps.externalObbSize; + } + return SIZE_INVALID; + } + + private String getSizeStr(long size) { + if (size >= 0) { + return Formatter.formatFileSize(mContext, size); + } + return null; + } + + void rebuildActiveSessions() { + synchronized (mEntriesMap) { + if (!mSessionsChanged) { + return; + } + mActiveSessions.clear(); + for (int i=0; i<mSessions.size(); i++) { + Session s = mSessions.get(i); + if (s.mResumed) { + mActiveSessions.add(s); + } + } + } + } + + public static String normalize(String str) { + String tmp = Normalizer.normalize(str, Form.NFD); + return REMOVE_DIACRITICALS_PATTERN.matcher(tmp) + .replaceAll("").toLowerCase(); + } + + public class Session { + final Callbacks mCallbacks; + boolean mResumed; + + // Rebuilding of app list. Synchronized on mRebuildSync. + final Object mRebuildSync = new Object(); + boolean mRebuildRequested; + boolean mRebuildAsync; + AppFilter mRebuildFilter; + Comparator<AppEntry> mRebuildComparator; + ArrayList<AppEntry> mRebuildResult; + ArrayList<AppEntry> mLastAppList; + + Session(Callbacks callbacks) { + mCallbacks = callbacks; + } + + public void resume() { + if (DEBUG_LOCKING) Log.v(TAG, "resume about to acquire lock..."); + synchronized (mEntriesMap) { + if (!mResumed) { + mResumed = true; + mSessionsChanged = true; + doResumeIfNeededLocked(); + } + } + if (DEBUG_LOCKING) Log.v(TAG, "...resume releasing lock"); + } + + public void pause() { + if (DEBUG_LOCKING) Log.v(TAG, "pause about to acquire lock..."); + synchronized (mEntriesMap) { + if (mResumed) { + mResumed = false; + mSessionsChanged = true; + mBackgroundHandler.removeMessages(BackgroundHandler.MSG_REBUILD_LIST, this); + doPauseIfNeededLocked(); + } + if (DEBUG_LOCKING) Log.v(TAG, "...pause releasing lock"); + } + } + + public ArrayList<AppEntry> getAllApps() { + synchronized (mEntriesMap) { + return new ArrayList<>(mAppEntries); + } + } + + // Creates a new list of app entries with the given filter and comparator. + public ArrayList<AppEntry> rebuild(AppFilter filter, Comparator<AppEntry> comparator) { + synchronized (mRebuildSync) { + synchronized (mEntriesMap) { + mRebuildingSessions.add(this); + mRebuildRequested = true; + mRebuildAsync = false; + mRebuildFilter = filter; + mRebuildComparator = comparator; + mRebuildResult = null; + if (!mBackgroundHandler.hasMessages(BackgroundHandler.MSG_REBUILD_LIST)) { + Message msg = mBackgroundHandler.obtainMessage( + BackgroundHandler.MSG_REBUILD_LIST); + mBackgroundHandler.sendMessage(msg); + } + } + + // We will wait for .25s for the list to be built. + long waitend = SystemClock.uptimeMillis()+250; + + while (mRebuildResult == null) { + long now = SystemClock.uptimeMillis(); + if (now >= waitend) { + break; + } + try { + mRebuildSync.wait(waitend - now); + } catch (InterruptedException e) { + } + } + + mRebuildAsync = true; + + return mRebuildResult; + } + } + + void handleRebuildList() { + AppFilter filter; + Comparator<AppEntry> comparator; + synchronized (mRebuildSync) { + if (!mRebuildRequested) { + return; + } + + filter = mRebuildFilter; + comparator = mRebuildComparator; + mRebuildRequested = false; + mRebuildFilter = null; + mRebuildComparator = null; + } + + Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND); + + if (filter != null) { + filter.init(); + } + + List<AppEntry> apps; + synchronized (mEntriesMap) { + apps = new ArrayList<>(mAppEntries); + } + + ArrayList<AppEntry> filteredApps = new ArrayList<AppEntry>(); + if (DEBUG) Log.i(TAG, "Rebuilding..."); + for (int i=0; i<apps.size(); i++) { + AppEntry entry = apps.get(i); + if (filter == null || filter.filterApp(entry)) { + synchronized (mEntriesMap) { + if (DEBUG_LOCKING) Log.v(TAG, "rebuild acquired lock"); + entry.ensureLabel(mContext); + if (DEBUG) Log.i(TAG, "Using " + entry.info.packageName + ": " + entry); + filteredApps.add(entry); + if (DEBUG_LOCKING) Log.v(TAG, "rebuild releasing lock"); + } + } + } + + Collections.sort(filteredApps, comparator); + + synchronized (mRebuildSync) { + if (!mRebuildRequested) { + mLastAppList = filteredApps; + if (!mRebuildAsync) { + mRebuildResult = filteredApps; + mRebuildSync.notifyAll(); + } else { + if (!mMainHandler.hasMessages(MainHandler.MSG_REBUILD_COMPLETE, this)) { + Message msg = mMainHandler.obtainMessage( + MainHandler.MSG_REBUILD_COMPLETE, this); + mMainHandler.sendMessage(msg); + } + } + } + } + + Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); + } + + public void release() { + pause(); + synchronized (mEntriesMap) { + mSessions.remove(this); + } + } + } + + class MainHandler extends Handler { + static final int MSG_REBUILD_COMPLETE = 1; + static final int MSG_PACKAGE_LIST_CHANGED = 2; + static final int MSG_PACKAGE_ICON_CHANGED = 3; + static final int MSG_PACKAGE_SIZE_CHANGED = 4; + static final int MSG_ALL_SIZES_COMPUTED = 5; + static final int MSG_RUNNING_STATE_CHANGED = 6; + static final int MSG_LAUNCHER_INFO_CHANGED = 7; + static final int MSG_LOAD_ENTRIES_COMPLETE = 8; + + @Override + public void handleMessage(Message msg) { + rebuildActiveSessions(); + switch (msg.what) { + case MSG_REBUILD_COMPLETE: { + Session s = (Session)msg.obj; + if (mActiveSessions.contains(s)) { + s.mCallbacks.onRebuildComplete(s.mLastAppList); + } + } break; + case MSG_PACKAGE_LIST_CHANGED: { + for (int i=0; i<mActiveSessions.size(); i++) { + mActiveSessions.get(i).mCallbacks.onPackageListChanged(); + } + } break; + case MSG_PACKAGE_ICON_CHANGED: { + for (int i=0; i<mActiveSessions.size(); i++) { + mActiveSessions.get(i).mCallbacks.onPackageIconChanged(); + } + } break; + case MSG_PACKAGE_SIZE_CHANGED: { + for (int i=0; i<mActiveSessions.size(); i++) { + mActiveSessions.get(i).mCallbacks.onPackageSizeChanged( + (String)msg.obj); + } + } break; + case MSG_ALL_SIZES_COMPUTED: { + for (int i=0; i<mActiveSessions.size(); i++) { + mActiveSessions.get(i).mCallbacks.onAllSizesComputed(); + } + } break; + case MSG_RUNNING_STATE_CHANGED: { + for (int i=0; i<mActiveSessions.size(); i++) { + mActiveSessions.get(i).mCallbacks.onRunningStateChanged( + msg.arg1 != 0); + } + } break; + case MSG_LAUNCHER_INFO_CHANGED: { + for (int i=0; i<mActiveSessions.size(); i++) { + mActiveSessions.get(i).mCallbacks.onLauncherInfoChanged(); + } + } break; + case MSG_LOAD_ENTRIES_COMPLETE: { + for (int i=0; i<mActiveSessions.size(); i++) { + mActiveSessions.get(i).mCallbacks.onLoadEntriesCompleted(); + } + } break; + } + } + } + + private class BackgroundHandler extends Handler { + static final int MSG_REBUILD_LIST = 1; + static final int MSG_LOAD_ENTRIES = 2; + static final int MSG_LOAD_ICONS = 3; + static final int MSG_LOAD_SIZES = 4; + static final int MSG_LOAD_LAUNCHER = 5; + + boolean mRunning; + + BackgroundHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + // Always try rebuilding list first thing, if needed. + ArrayList<Session> rebuildingSessions = null; + synchronized (mEntriesMap) { + if (mRebuildingSessions.size() > 0) { + rebuildingSessions = new ArrayList<Session>(mRebuildingSessions); + mRebuildingSessions.clear(); + } + } + if (rebuildingSessions != null) { + for (int i=0; i<rebuildingSessions.size(); i++) { + rebuildingSessions.get(i).handleRebuildList(); + } + } + + switch (msg.what) { + case MSG_REBUILD_LIST: { + } break; + case MSG_LOAD_ENTRIES: { + int numDone = 0; + synchronized (mEntriesMap) { + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ENTRIES acquired lock"); + for (int i = 0; i < mApplications.size() && numDone < 6; i++) { + if (!mRunning) { + mRunning = true; + Message m = mMainHandler.obtainMessage( + MainHandler.MSG_RUNNING_STATE_CHANGED, 1); + mMainHandler.sendMessage(m); + } + ApplicationInfo info = mApplications.get(i); + int userId = UserHandle.getUserId(info.uid); + if (mEntriesMap.get(userId).get(info.packageName) == null) { + numDone++; + getEntryLocked(info); + } + } + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ENTRIES releasing lock"); + } + + if (numDone >= 6) { + sendEmptyMessage(MSG_LOAD_ENTRIES); + } else { + if (!mMainHandler.hasMessages(MainHandler.MSG_LOAD_ENTRIES_COMPLETE)) { + mMainHandler.sendEmptyMessage(MainHandler.MSG_LOAD_ENTRIES_COMPLETE); + } + sendEmptyMessage(MSG_LOAD_LAUNCHER); + } + } break; + case MSG_LOAD_LAUNCHER: { + Intent launchIntent = new Intent(Intent.ACTION_MAIN, null) + .addCategory(Intent.CATEGORY_LAUNCHER); + + for (int i = 0; i < mEntriesMap.size(); i++) { + int userId = mEntriesMap.keyAt(i); + List<ResolveInfo> intents = mPm.queryIntentActivitiesAsUser(launchIntent, + PackageManager.GET_DISABLED_COMPONENTS, userId); + synchronized (mEntriesMap) { + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER acquired lock"); + HashMap<String, AppEntry> userEntries = mEntriesMap.valueAt(i); + final int N = intents.size(); + for (int j = 0; j < N; j++) { + String packageName = intents.get(j).activityInfo.packageName; + AppEntry entry = userEntries.get(packageName); + if (entry != null) { + entry.hasLauncherEntry = true; + } else { + Log.w(TAG, "Cannot find pkg: " + packageName + + " on user " + userId); + } + } + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER releasing lock"); + } + } + + if (!mMainHandler.hasMessages(MainHandler.MSG_LAUNCHER_INFO_CHANGED)) { + mMainHandler.sendEmptyMessage(MainHandler.MSG_LAUNCHER_INFO_CHANGED); + } + sendEmptyMessage(MSG_LOAD_ICONS); + } break; + case MSG_LOAD_ICONS: { + int numDone = 0; + synchronized (mEntriesMap) { + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ICONS acquired lock"); + for (int i=0; i<mAppEntries.size() && numDone<2; i++) { + AppEntry entry = mAppEntries.get(i); + if (entry.icon == null || !entry.mounted) { + synchronized (entry) { + if (entry.ensureIconLocked(mContext, mPm)) { + if (!mRunning) { + mRunning = true; + Message m = mMainHandler.obtainMessage( + MainHandler.MSG_RUNNING_STATE_CHANGED, 1); + mMainHandler.sendMessage(m); + } + numDone++; + } + } + } + } + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ICONS releasing lock"); + } + if (numDone > 0) { + if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_ICON_CHANGED)) { + mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_ICON_CHANGED); + } + } + if (numDone >= 2) { + sendEmptyMessage(MSG_LOAD_ICONS); + } else { + sendEmptyMessage(MSG_LOAD_SIZES); + } + } break; + case MSG_LOAD_SIZES: { + synchronized (mEntriesMap) { + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES acquired lock"); + if (mCurComputingSizePkg != null) { + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES releasing: currently computing"); + return; + } + + long now = SystemClock.uptimeMillis(); + for (int i=0; i<mAppEntries.size(); i++) { + AppEntry entry = mAppEntries.get(i); + if (entry.size == SIZE_UNKNOWN || entry.sizeStale) { + if (entry.sizeLoadStart == 0 || + (entry.sizeLoadStart < (now-20*1000))) { + if (!mRunning) { + mRunning = true; + Message m = mMainHandler.obtainMessage( + MainHandler.MSG_RUNNING_STATE_CHANGED, 1); + mMainHandler.sendMessage(m); + } + entry.sizeLoadStart = now; + mCurComputingSizePkg = entry.info.packageName; + mCurComputingSizeUserId = UserHandle.getUserId(entry.info.uid); + mPm.getPackageSizeInfo(mCurComputingSizePkg, + mCurComputingSizeUserId, mStatsObserver); + } + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES releasing: now computing"); + return; + } + } + if (!mMainHandler.hasMessages(MainHandler.MSG_ALL_SIZES_COMPUTED)) { + mMainHandler.sendEmptyMessage(MainHandler.MSG_ALL_SIZES_COMPUTED); + mRunning = false; + Message m = mMainHandler.obtainMessage( + MainHandler.MSG_RUNNING_STATE_CHANGED, 0); + mMainHandler.sendMessage(m); + } + if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES releasing lock"); + } + } break; + } + } + + final IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() { + public void onGetStatsCompleted(PackageStats stats, boolean succeeded) { + boolean sizeChanged = false; + synchronized (mEntriesMap) { + if (DEBUG_LOCKING) Log.v(TAG, "onGetStatsCompleted acquired lock"); + HashMap<String, AppEntry> userMap = mEntriesMap.get(stats.userHandle); + if (userMap == null) { + // The user must have been removed. + return; + } + AppEntry entry = userMap.get(stats.packageName); + if (entry != null) { + synchronized (entry) { + entry.sizeStale = false; + entry.sizeLoadStart = 0; + long externalCodeSize = stats.externalCodeSize + + stats.externalObbSize; + long externalDataSize = stats.externalDataSize + + stats.externalMediaSize; + long newSize = externalCodeSize + externalDataSize + + getTotalInternalSize(stats); + if (entry.size != newSize || + entry.cacheSize != stats.cacheSize || + entry.codeSize != stats.codeSize || + entry.dataSize != stats.dataSize || + entry.externalCodeSize != externalCodeSize || + entry.externalDataSize != externalDataSize || + entry.externalCacheSize != stats.externalCacheSize) { + entry.size = newSize; + entry.cacheSize = stats.cacheSize; + entry.codeSize = stats.codeSize; + entry.dataSize = stats.dataSize; + entry.externalCodeSize = externalCodeSize; + entry.externalDataSize = externalDataSize; + entry.externalCacheSize = stats.externalCacheSize; + entry.sizeStr = getSizeStr(entry.size); + entry.internalSize = getTotalInternalSize(stats); + entry.internalSizeStr = getSizeStr(entry.internalSize); + entry.externalSize = getTotalExternalSize(stats); + entry.externalSizeStr = getSizeStr(entry.externalSize); + if (DEBUG) Log.i(TAG, "Set size of " + entry.label + " " + entry + + ": " + entry.sizeStr); + sizeChanged = true; + } + } + if (sizeChanged) { + Message msg = mMainHandler.obtainMessage( + MainHandler.MSG_PACKAGE_SIZE_CHANGED, stats.packageName); + mMainHandler.sendMessage(msg); + } + } + if (mCurComputingSizePkg != null + && (mCurComputingSizePkg.equals(stats.packageName) + && mCurComputingSizeUserId == stats.userHandle)) { + mCurComputingSizePkg = null; + sendEmptyMessage(MSG_LOAD_SIZES); + } + if (DEBUG_LOCKING) Log.v(TAG, "onGetStatsCompleted releasing lock"); + } + } + }; + } + + /** + * Receives notifications when applications are added/removed. + */ + private class PackageIntentReceiver extends BroadcastReceiver { + void registerReceiver() { + IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); + filter.addAction(Intent.ACTION_PACKAGE_REMOVED); + filter.addAction(Intent.ACTION_PACKAGE_CHANGED); + filter.addDataScheme("package"); + mContext.registerReceiver(this, filter); + // Register for events related to sdcard installation. + IntentFilter sdFilter = new IntentFilter(); + sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); + sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); + mContext.registerReceiver(this, sdFilter); + // Register for events related to user creation/deletion. + IntentFilter userFilter = new IntentFilter(); + userFilter.addAction(Intent.ACTION_USER_ADDED); + userFilter.addAction(Intent.ACTION_USER_REMOVED); + mContext.registerReceiver(this, userFilter); + } + void unregisterReceiver() { + mContext.unregisterReceiver(this); + } + @Override + public void onReceive(Context context, Intent intent) { + String actionStr = intent.getAction(); + if (Intent.ACTION_PACKAGE_ADDED.equals(actionStr)) { + Uri data = intent.getData(); + String pkgName = data.getEncodedSchemeSpecificPart(); + for (int i = 0; i < mEntriesMap.size(); i++) { + addPackage(pkgName, mEntriesMap.keyAt(i)); + } + } else if (Intent.ACTION_PACKAGE_REMOVED.equals(actionStr)) { + Uri data = intent.getData(); + String pkgName = data.getEncodedSchemeSpecificPart(); + for (int i = 0; i < mEntriesMap.size(); i++) { + removePackage(pkgName, mEntriesMap.keyAt(i)); + } + } else if (Intent.ACTION_PACKAGE_CHANGED.equals(actionStr)) { + Uri data = intent.getData(); + String pkgName = data.getEncodedSchemeSpecificPart(); + for (int i = 0; i < mEntriesMap.size(); i++) { + invalidatePackage(pkgName, mEntriesMap.keyAt(i)); + } + } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(actionStr) || + Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(actionStr)) { + // When applications become available or unavailable (perhaps because + // the SD card was inserted or ejected) we need to refresh the + // AppInfo with new label, icon and size information as appropriate + // given the newfound (un)availability of the application. + // A simple way to do that is to treat the refresh as a package + // removal followed by a package addition. + String pkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); + if (pkgList == null || pkgList.length == 0) { + // Ignore + return; + } + boolean avail = Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(actionStr); + if (avail) { + for (String pkgName : pkgList) { + for (int i = 0; i < mEntriesMap.size(); i++) { + invalidatePackage(pkgName, mEntriesMap.keyAt(i)); + } + } + } + } else if (Intent.ACTION_USER_ADDED.equals(actionStr)) { + addUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL)); + } else if (Intent.ACTION_USER_REMOVED.equals(actionStr)) { + removeUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL)); + } + } + } + + public interface Callbacks { + void onRunningStateChanged(boolean running); + void onPackageListChanged(); + void onRebuildComplete(ArrayList<AppEntry> apps); + void onPackageIconChanged(); + void onPackageSizeChanged(String packageName); + void onAllSizesComputed(); + void onLauncherInfoChanged(); + void onLoadEntriesCompleted(); + } + + public static class SizeInfo { + public long cacheSize; + public long codeSize; + public long dataSize; + public long externalCodeSize; + public long externalDataSize; + + // This is the part of externalDataSize that is in the cache + // section of external storage. Note that we don't just combine + // this with cacheSize because currently the platform can't + // automatically trim this data when needed, so it is something + // the user may need to manage. The externalDataSize also includes + // this value, since what this is here is really the part of + // externalDataSize that we can just consider to be "cache" files + // for purposes of cleaning them up in the app details UI. + public long externalCacheSize; + } + + public static class AppEntry extends SizeInfo { + public final File apkFile; + public final long id; + public String label; + public long size; + public long internalSize; + public long externalSize; + + public boolean mounted; + + public boolean hasLauncherEntry; + + public String getNormalizedLabel() { + if (normalizedLabel != null) { + return normalizedLabel; + } + normalizedLabel = normalize(label); + return normalizedLabel; + } + + // Need to synchronize on 'this' for the following. + public ApplicationInfo info; + public Drawable icon; + public String sizeStr; + public String internalSizeStr; + public String externalSizeStr; + public boolean sizeStale; + public long sizeLoadStart; + + public String normalizedLabel; + + // A location where extra info can be placed to be used by custom filters. + public Object extraInfo; + + AppEntry(Context context, ApplicationInfo info, long id) { + apkFile = new File(info.sourceDir); + this.id = id; + this.info = info; + this.size = SIZE_UNKNOWN; + this.sizeStale = true; + ensureLabel(context); + } + + public void ensureLabel(Context context) { + if (this.label == null || !this.mounted) { + if (!this.apkFile.exists()) { + this.mounted = false; + this.label = info.packageName; + } else { + this.mounted = true; + CharSequence label = info.loadLabel(context.getPackageManager()); + this.label = label != null ? label.toString() : info.packageName; + } + } + } + + boolean ensureIconLocked(Context context, PackageManager pm) { + if (this.icon == null) { + if (this.apkFile.exists()) { + this.icon = getBadgedIcon(pm); + return true; + } else { + this.mounted = false; + this.icon = context.getDrawable( + com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon); + } + } else if (!this.mounted) { + // If the app wasn't mounted but is now mounted, reload + // its icon. + if (this.apkFile.exists()) { + this.mounted = true; + this.icon = getBadgedIcon(pm); + return true; + } + } + return false; + } + + private Drawable getBadgedIcon(PackageManager pm) { + // Do badging ourself so that it comes from the user of the app not the current user. + return pm.getUserBadgedIcon(pm.loadUnbadgedItemIcon(info, info), + new UserHandle(UserHandle.getUserId(info.uid))); + } + + public String getVersion(Context context) { + try { + return context.getPackageManager().getPackageInfo(info.packageName, 0).versionName; + } catch (PackageManager.NameNotFoundException e) { + return ""; + } + } + } + + public static final Comparator<AppEntry> ALPHA_COMPARATOR = new Comparator<AppEntry>() { + private final Collator sCollator = Collator.getInstance(); + @Override + public int compare(AppEntry object1, AppEntry object2) { + return sCollator.compare(object1.label, object2.label); + } + }; + + public static final Comparator<AppEntry> SIZE_COMPARATOR + = new Comparator<AppEntry>() { + private final Collator sCollator = Collator.getInstance(); + @Override + public int compare(AppEntry object1, AppEntry object2) { + if (object1.size < object2.size) return 1; + if (object1.size > object2.size) return -1; + return sCollator.compare(object1.label, object2.label); + } + }; + + public static final Comparator<AppEntry> INTERNAL_SIZE_COMPARATOR + = new Comparator<AppEntry>() { + private final Collator sCollator = Collator.getInstance(); + @Override + public int compare(AppEntry object1, AppEntry object2) { + if (object1.internalSize < object2.internalSize) return 1; + if (object1.internalSize > object2.internalSize) return -1; + return sCollator.compare(object1.label, object2.label); + } + }; + + public static final Comparator<AppEntry> EXTERNAL_SIZE_COMPARATOR + = new Comparator<AppEntry>() { + private final Collator sCollator = Collator.getInstance(); + @Override + public int compare(AppEntry object1, AppEntry object2) { + if (object1.externalSize < object2.externalSize) return 1; + if (object1.externalSize > object2.externalSize) return -1; + return sCollator.compare(object1.label, object2.label); + } + }; + + public interface AppFilter { + void init(); + boolean filterApp(AppEntry info); + } + + public static final AppFilter FILTER_PERSONAL = new AppFilter() { + private int mCurrentUser; + + public void init() { + mCurrentUser = ActivityManager.getCurrentUser(); + } + + @Override + public boolean filterApp(AppEntry entry) { + return UserHandle.getUserId(entry.info.uid) == mCurrentUser; + } + }; + + public static final AppFilter FILTER_WORK = new AppFilter() { + private int mCurrentUser; + + public void init() { + mCurrentUser = ActivityManager.getCurrentUser(); + } + + @Override + public boolean filterApp(AppEntry entry) { + return UserHandle.getUserId(entry.info.uid) != mCurrentUser; + } + }; + + public static final AppFilter FILTER_DOWNLOADED_AND_LAUNCHER = new AppFilter() { + public void init() { + } + + @Override + public boolean filterApp(AppEntry entry) { + if ((entry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { + return true; + } else if ((entry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { + return true; + } else if (entry.hasLauncherEntry) { + return true; + } + return false; + } + }; + + public static final AppFilter FILTER_THIRD_PARTY = new AppFilter() { + public void init() { + } + + @Override + public boolean filterApp(AppEntry entry) { + if ((entry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { + return true; + } else if ((entry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { + return true; + } + return false; + } + }; + + public static final AppFilter FILTER_DISABLED = new AppFilter() { + public void init() { + } + + @Override + public boolean filterApp(AppEntry entry) { + return !entry.info.enabled; + } + }; + + public static final AppFilter FILTER_ALL_ENABLED = new AppFilter() { + public void init() { + } + + @Override + public boolean filterApp(AppEntry entry) { + return entry.info.enabled; + } + }; + + public static final AppFilter FILTER_EVERYTHING = new AppFilter() { + public void init() { + } + + @Override + public boolean filterApp(AppEntry entry) { + return true; + } + }; + + public static final AppFilter FILTER_WITH_DOMAIN_URLS = new AppFilter() { + public void init() { + } + + @Override + public boolean filterApp(AppEntry entry) { + return (entry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0; + } + }; + + public static class VolumeFilter implements AppFilter { + private final String mVolumeUuid; + + public VolumeFilter(String volumeUuid) { + mVolumeUuid = volumeUuid; + } + + @Override + public void init() { + } + + @Override + public boolean filterApp(AppEntry info) { + return Objects.equals(info.info.volumeUuid, mVolumeUuid); + } + } + + public static class CompoundFilter implements AppFilter { + private final AppFilter mFirstFilter; + private final AppFilter mSecondFilter; + + public CompoundFilter(AppFilter first, AppFilter second) { + mFirstFilter = first; + mSecondFilter = second; + } + + @Override + public void init() { + mFirstFilter.init(); + mSecondFilter.init(); + } + + @Override + public boolean filterApp(AppEntry info) { + return mFirstFilter.filterApp(info) && mSecondFilter.filterApp(info); + } + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/InterestingConfigChanges.java b/packages/SettingsLib/src/com/android/settingslib/applications/InterestingConfigChanges.java new file mode 100644 index 0000000..d34dd89 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/applications/InterestingConfigChanges.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2015 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.settingslib.applications; + +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; +import android.content.res.Resources; + +public class InterestingConfigChanges { + private final Configuration mLastConfiguration = new Configuration(); + private int mLastDensity; + + public boolean applyNewConfig(Resources res) { + int configChanges = mLastConfiguration.updateFrom(res.getConfiguration()); + boolean densityChanged = mLastDensity != res.getDisplayMetrics().densityDpi; + if (densityChanged || (configChanges&(ActivityInfo.CONFIG_LOCALE + |ActivityInfo.CONFIG_UI_MODE|ActivityInfo.CONFIG_SCREEN_LAYOUT)) != 0) { + mLastDensity = res.getDisplayMetrics().densityDpi; + return true; + } + return false; + } +} diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml index 03b6dca..e42ce66 100644 --- a/packages/SystemUI/res/layout/super_status_bar.xml +++ b/packages/SystemUI/res/layout/super_status_bar.xml @@ -20,6 +20,7 @@ <!-- This is the combined status bar / notification panel window. --> <com.android.systemui.statusbar.phone.StatusBarWindowView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:sysui="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> @@ -29,6 +30,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" + sysui:ignoreRightInset="true" > <ImageView android:id="@+id/backdrop_back" android:layout_width="match_parent" @@ -44,7 +46,9 @@ <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind" android:layout_width="match_parent" android:layout_height="match_parent" - android:importantForAccessibility="no" /> + android:importantForAccessibility="no" + sysui:ignoreRightInset="true" + /> <com.android.systemui.statusbar.AlphaOptimizedView android:id="@+id/heads_up_scrim" @@ -89,6 +93,8 @@ <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_in_front" android:layout_width="match_parent" android:layout_height="match_parent" - android:importantForAccessibility="no" /> + android:importantForAccessibility="no" + sysui:ignoreRightInset="true" + /> </com.android.systemui.statusbar.phone.StatusBarWindowView> diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index 24f92ef..354b70b 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -82,5 +82,9 @@ <attr name="fillColor" format="integer" /> <attr name="singleToneColor" format="integer" /> </declare-styleable> + + <declare-styleable name="StatusBarWindowView_Layout"> + <attr name="ignoreRightInset" format="boolean" /> + </declare-styleable> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index c026d77..0e0584f 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -801,6 +801,9 @@ <!-- Accessibility label for the button that opens the user switcher and announces the current user. --> <string name="accessibility_multi_user_switch_switcher_with_current">Switch user, current user <xliff:g id="current_user_name" example="John Doe">%s</xliff:g></string> + <!-- Accessibility label for the user icon on the lock screen. --> + <string name="accessibility_multi_user_switch_inactive">Current user <xliff:g id="current_user_name" example="John Doe">%s</xliff:g></string> + <!-- Accessibility label for the button that opens the quick contact of the user. --> <string name="accessibility_multi_user_switch_quick_contact">Show profile</string> @@ -911,7 +914,7 @@ <string name="monitoring_description_device_owned">Your device is managed by <xliff:g id="organization">%1$s</xliff:g>.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information. For more information, contact your administrator.</string> <!-- Monitoring dialog VPN text [CHAR LIMIT=400] --> - <string name="monitoring_description_vpn">You gave an app permission to set up a VPN connection.\n\nThis app can monitor your device and network activity, including emails, apps and websites.</string> + <string name="monitoring_description_vpn">You gave an app permission to set up a VPN connection.\n\nThis app can monitor your device and network activity, including emails, apps, and websites.</string> <!-- Monitoring dialog VPN with device owner text [CHAR LIMIT=400] --> <string name="monitoring_description_vpn_device_owned">Your device is managed by <xliff:g id="organization">%1$s</xliff:g>.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator.</string> @@ -923,16 +926,16 @@ <string name="legacy_vpn_name">VPN</string> <!-- Monitoring dialog text for single app (no profile or device owner) [CHAR LIMIT=400] --> - <string name="monitoring_description_app">You\'re connected to <xliff:g id="application">%1$s</xliff:g>, which can monitor your network activity including emails, apps and websites.</string> + <string name="monitoring_description_app">You\'re connected to <xliff:g id="application">%1$s</xliff:g>, which can monitor your network activity including emails, apps, and websites.</string> <!-- Monitoring dialog text for single app (inside personal profile) [CHAR LIMIT=400] --> - <string name="monitoring_description_app_personal">You\'re connected to <xliff:g id="application">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps and websites.</string> + <string name="monitoring_description_app_personal">You\'re connected to <xliff:g id="application">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps, and websites.</string> <!-- Monitoring dialog text for single app (inside work profile) [CHAR LIMIT=400] --> - <string name="monitoring_description_app_work">Your work profile is managed by <xliff:g id="organization">%1$s</xliff:g>. It is connected to <xliff:g id="application">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator.</string> + <string name="monitoring_description_app_work">Your work profile is managed by <xliff:g id="organization">%1$s</xliff:g>. It is connected to <xliff:g id="application">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator.</string> <!-- Monitoring dialog text for multiple apps (in personal and work profiles) [CHAR LIMIT=400] --> - <string name="monitoring_description_app_personal_work">Your work profile is managed by <xliff:g id="organization">%1$s</xliff:g>. It is connected to <xliff:g id="application_work">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to <xliff:g id="application_personal">%3$s</xliff:g>, which can monitor your personal network activity.</string> + <string name="monitoring_description_app_personal_work">Your work profile is managed by <xliff:g id="organization">%1$s</xliff:g>. It is connected to <xliff:g id="application_work">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps, and websites.\n\nYou\'re also connected to <xliff:g id="application_personal">%3$s</xliff:g>, which can monitor your personal network activity.</string> <!-- Monitoring dialog text for single app (with device owner) [CHAR LIMIT=400] --> <string name="monitoring_description_vpn_app_device_owned">Your device is managed by <xliff:g id="organization">%1$s</xliff:g>.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to <xliff:g id="application">%2$s</xliff:g>, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator.</string> @@ -1006,7 +1009,7 @@ <string name="volumeui_notification_text">Touch to restore the original.</string> <!-- Toast shown when user unlocks screen and managed profile activity is in the foreground --> - <string name="managed_profile_foreground_toast">You are in the Work profile</string> + <string name="managed_profile_foreground_toast">You are in the work profile</string> <string-array name="volume_stream_titles" translatable="false"> <item>Voice calls</item> <!-- STREAM_VOICE_CALL --> @@ -1087,4 +1090,10 @@ <!-- Alarm template for far alarms [CHAR LIMIT=25] --> <string name="alarm_template_far">on <xliff:g id="when" example="Fri 7:00 AM">%1$s</xliff:g></string> + <!-- Accessibility label for Quick Settings detail screens [CHAR LIMIT=NONE] --> + <string name="accessibility_quick_settings_detail">Quick Settings, <xliff:g id="title" example="Wi-Fi">%s</xliff:g>.</string> + + <!-- Accessibility label for hotspot icon [CHAR LIMIT=NONE] --> + <string name="accessibility_status_bar_hotspot">Hotspot</string> + </resources> diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 6888d0e..6acd137 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -22,10 +22,8 @@ import static javax.microedition.khronos.egl.EGL10.*; import android.app.ActivityManager; import android.app.WallpaperManager; import android.content.ComponentCallbacks2; -import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region.Op; @@ -35,6 +33,7 @@ import android.renderscript.Matrix4f; import android.service.wallpaper.WallpaperService; import android.util.Log; import android.view.Display; +import android.view.DisplayInfo; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.WindowManager; @@ -111,6 +110,9 @@ public class ImageWallpaper extends WallpaperService { float mYOffset = 0.5f; float mScale = 1f; + private Display mDefaultDisplay; + private final DisplayInfo mTmpDisplayInfo = new DisplayInfo(); + boolean mVisible = true; boolean mRedrawNeeded; boolean mOffsetsChanged; @@ -172,7 +174,9 @@ public class ImageWallpaper extends WallpaperService { super.onCreate(surfaceHolder); - updateSurfaceSize(surfaceHolder); + mDefaultDisplay = getSystemService(WindowManager.class).getDefaultDisplay(); + + updateSurfaceSize(surfaceHolder, getDefaultDisplayInfo()); setOffsetNotificationsEnabled(false); } @@ -184,9 +188,7 @@ public class ImageWallpaper extends WallpaperService { mWallpaperManager.forgetLoadedWallpaper(); } - void updateSurfaceSize(SurfaceHolder surfaceHolder) { - Point p = getDefaultDisplaySize(); - + void updateSurfaceSize(SurfaceHolder surfaceHolder, DisplayInfo displayInfo) { // Load background image dimensions, if we haven't saved them yet if (mBackgroundWidth <= 0 || mBackgroundHeight <= 0) { // Need to load the image to get dimensions @@ -194,14 +196,14 @@ public class ImageWallpaper extends WallpaperService { updateWallpaperLocked(); if (mBackgroundWidth <= 0 || mBackgroundHeight <= 0) { // Default to the display size if we can't find the dimensions - mBackgroundWidth = p.x; - mBackgroundHeight = p.y; + mBackgroundWidth = displayInfo.logicalWidth; + mBackgroundHeight = displayInfo.logicalHeight; } } // Force the wallpaper to cover the screen in both dimensions - int surfaceWidth = Math.max(p.x, mBackgroundWidth); - int surfaceHeight = Math.max(p.y, mBackgroundHeight); + int surfaceWidth = Math.max(displayInfo.logicalWidth, mBackgroundWidth); + int surfaceHeight = Math.max(displayInfo.logicalHeight, mBackgroundHeight); // If the surface dimensions haven't changed, then just return final Rect frame = surfaceHolder.getSurfaceFrame(); @@ -297,26 +299,22 @@ public class ImageWallpaper extends WallpaperService { drawFrame(); } - private Point getDefaultDisplaySize() { - Point p = new Point(); - Context c = ImageWallpaper.this.getApplicationContext(); - WindowManager wm = (WindowManager)c.getSystemService(Context.WINDOW_SERVICE); - Display d = wm.getDefaultDisplay(); - d.getRealSize(p); - return p; + private DisplayInfo getDefaultDisplayInfo() { + mDefaultDisplay.getDisplayInfo(mTmpDisplayInfo); + return mTmpDisplayInfo; } void drawFrame() { try { - int newRotation = ((WindowManager) getSystemService(WINDOW_SERVICE)). - getDefaultDisplay().getRotation(); + DisplayInfo displayInfo = getDefaultDisplayInfo(); + int newRotation = displayInfo.rotation; // Sometimes a wallpaper is not large enough to cover the screen in one dimension. // Call updateSurfaceSize -- it will only actually do the update if the dimensions // should change if (newRotation != mLastRotation) { // Update surface size (if necessary) - updateSurfaceSize(getSurfaceHolder()); + updateSurfaceSize(getSurfaceHolder(), displayInfo); } SurfaceHolder sh = getSurfaceHolder(); final Rect frame = sh.getSurfaceFrame(); diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index f129288..3e122da 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -9,14 +9,15 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.database.ContentObserver; import android.graphics.PixelFormat; import android.media.AudioAttributes; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Handler; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; -import android.os.Vibrator; import android.provider.Settings; import android.util.Log; import android.view.Gravity; @@ -56,6 +57,8 @@ public class AssistManager { private final PhoneStatusBar mBar; private final IVoiceInteractionManagerService mVoiceInteractionManagerService; + private ComponentName mAssistComponent; + private IVoiceInteractionSessionShowCallback mShowCallback = new IVoiceInteractionSessionShowCallback.Stub() { @@ -78,12 +81,24 @@ public class AssistManager { } }; + private final ContentObserver mAssistSettingsObserver = new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange) { + updateAssistInfo(); + } + }; + public AssistManager(PhoneStatusBar bar, Context context) { mContext = context; mBar = bar; mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); mVoiceInteractionManagerService = IVoiceInteractionManagerService.Stub.asInterface( ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)); + + mContext.getContentResolver().registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.ASSISTANT), false, + mAssistSettingsObserver); + mAssistSettingsObserver.onChange(false); } public void onConfigurationChanged() { @@ -108,16 +123,17 @@ public class AssistManager { } public void onGestureInvoked(boolean vibrate) { - boolean isVoiceInteractorActive = getVoiceInteractorSupportsAssistGesture(); - if (!isVoiceInteractorActive && !isAssistantIntentAvailable()) { + if (mAssistComponent == null) { return; } + if (vibrate) { vibrate(); } - if (!isVoiceInteractorActive || !isVoiceSessionRunning()) { + final boolean isService = isAssistantService(); + if (isService || !isVoiceSessionRunning()) { showOrb(); - mView.postDelayed(mHideRunnable, isVoiceInteractorActive + mView.postDelayed(mHideRunnable, isService ? TIMEOUT_SERVICE : TIMEOUT_ACTIVITY); } @@ -157,10 +173,12 @@ public class AssistManager { } private void startAssist() { - if (getVoiceInteractorSupportsAssistGesture()) { - startVoiceInteractor(); - } else { - startAssistActivity(); + if (mAssistComponent != null) { + if (isAssistantService()) { + startVoiceInteractor(); + } else { + startAssistActivity(); + } } } @@ -178,6 +196,9 @@ public class AssistManager { if (intent == null) { return; } + if (mAssistComponent != null) { + intent.setComponent(mAssistComponent); + } try { final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, @@ -255,19 +276,9 @@ public class AssistManager { } private void maybeSwapSearchIcon() { - Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, false, UserHandle.USER_CURRENT); - ComponentName component = null; - boolean isService = false; - if (getVoiceInteractorSupportsAssistGesture()) { - component = getVoiceInteractorComponentName(); - isService = true; - } else if (intent != null) { - component = intent.getComponent(); - } - if (component != null) { - replaceDrawable(mView.getOrb().getLogo(), component, ASSIST_ICON_METADATA_NAME, - isService); + if (mAssistComponent != null) { + replaceDrawable(mView.getOrb().getLogo(), mAssistComponent, ASSIST_ICON_METADATA_NAME, + isAssistantService()); } else { mView.getOrb().getLogo().setImageDrawable(null); } @@ -308,8 +319,32 @@ public class AssistManager { mView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); } - public boolean isAssistantIntentAvailable() { - return ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null; + private boolean isAssistantService() { + return mAssistComponent == null ? + false : mAssistComponent.equals(getVoiceInteractorComponentName()); + } + + private void updateAssistInfo() { + final String setting = Settings.Secure.getStringForUser(mContext.getContentResolver(), + Settings.Secure.ASSISTANT, UserHandle.USER_CURRENT); + if (setting != null) { + mAssistComponent = ComponentName.unflattenFromString(setting); + return; + } + + // Fallback to keep backward compatible behavior when there is no user setting. + if (getVoiceInteractorSupportsAssistGesture()) { + mAssistComponent = getVoiceInteractorComponentName(); + return; + } + + Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) + .getAssistIntent(mContext, false, UserHandle.USER_CURRENT); + if (intent != null) { + mAssistComponent = intent.getComponent(); + return; + } + + mAssistComponent = null; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java index f59e864..ca38528 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java @@ -110,15 +110,13 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene } private void handleRefreshState() { - boolean hasDeviceOwner = mSecurityController.hasDeviceOwner(); - boolean hasVpn = mSecurityController.isVpnEnabled(); - - mIsVisible = (hasVpn || hasDeviceOwner); - mIsIconVisible = hasVpn; - if (hasDeviceOwner) { + mIsIconVisible = mSecurityController.isVpnEnabled(); + if (mSecurityController.hasDeviceOwner()) { mFooterTextId = R.string.device_owned_footer; + mIsVisible = true; } else { mFooterTextId = R.string.vpn_footer; + mIsVisible = mIsIconVisible; } mMainHandler.post(mUpdateDisplayState); } @@ -132,15 +130,17 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene } private void createDialog() { - boolean hasDeviceOwner = mSecurityController.hasDeviceOwner(); - boolean hasProfile = mSecurityController.hasProfileOwner(); - boolean hasVpn = mSecurityController.isVpnEnabled(); + String deviceOwner = mSecurityController.getDeviceOwnerName(); + String profileOwner = mSecurityController.getProfileOwnerName(); + String primaryVpn = mSecurityController.getPrimaryVpnName(); + String profileVpn = mSecurityController.getProfileVpnName(); + boolean managed = mSecurityController.hasProfileOwner(); mDialog = new SystemUIDialog(mContext); - mDialog.setTitle(getTitle(hasDeviceOwner, hasProfile)); - mDialog.setMessage(getMessage(hasDeviceOwner, hasProfile, hasVpn)); + mDialog.setTitle(getTitle(deviceOwner)); + mDialog.setMessage(getMessage(deviceOwner, profileOwner, primaryVpn, profileVpn, managed)); mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this); - if (hasVpn) { + if (mSecurityController.isVpnEnabled()) { mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getNegativeButton(), this); } mDialog.show(); @@ -154,31 +154,42 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene return mContext.getString(R.string.quick_settings_done); } - private String getMessage(boolean hasDeviceOwner, boolean hasProfile, boolean hasVpn) { - if (hasDeviceOwner) { - if (hasVpn) { - return mContext.getString(R.string.monitoring_description_vpn_device_owned, - mSecurityController.getDeviceOwnerName()); + private String getMessage(String deviceOwner, String profileOwner, String primaryVpn, + String profileVpn, boolean primaryUserIsManaged) { + if (deviceOwner != null) { + if (primaryVpn != null) { + return mContext.getString(R.string.monitoring_description_vpn_app_device_owned, + deviceOwner, primaryVpn); } else { return mContext.getString(R.string.monitoring_description_device_owned, - mSecurityController.getDeviceOwnerName()); + deviceOwner); + } + } else if (primaryVpn != null) { + if (profileVpn != null) { + return mContext.getString(R.string.monitoring_description_app_personal_work, + profileOwner, profileVpn, primaryVpn); + } else { + return mContext.getString(R.string.monitoring_description_app_personal, + primaryVpn); } - } else if (hasProfile) { - return mContext.getString( - R.string.monitoring_description_vpn_profile_owned, - mSecurityController.getProfileOwnerName()); + } else if (profileVpn != null) { + return mContext.getString(R.string.monitoring_description_app_work, + profileOwner, profileVpn); + } else if (profileOwner != null && primaryUserIsManaged) { + return mContext.getString(R.string.monitoring_description_device_owned, + profileOwner); } else { - return mContext.getString(R.string.monitoring_description_vpn); + // No device owner, no personal VPN, no work VPN, no user owner. Why are we here? + return null; } } - private int getTitle(boolean hasDeviceOwner, boolean hasProfile) { - if (hasDeviceOwner) { + private int getTitle(String deviceOwner) { + if (deviceOwner != null) { return R.string.monitoring_title_device_owned; - } else if (hasProfile) { - return R.string.monitoring_title_profile_owned; + } else { + return R.string.monitoring_title; } - return R.string.monitoring_title; } private final Runnable mUpdateDisplayState = new Runnable() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index cd4f299..25e3d10 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -111,6 +111,8 @@ public class QSPanel extends ViewGroup { mDetailDoneButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { + announceForAccessibility( + mContext.getString(R.string.accessibility_desc_quick_settings)); closeDetail(); } }); @@ -392,6 +394,9 @@ public class QSPanel extends ViewGroup { mDetail.bringToFront(); mDetailContent.addView(r.detailView); MetricsLogger.visible(mContext, detailAdapter.getMetricsCategory()); + announceForAccessibility(mContext.getString( + R.string.accessibility_quick_settings_detail, + mContext.getString(detailAdapter.getTitle()))); setDetailRecord(r); listener = mHideGridContentWhenDone; if (r instanceof TileRecord) { diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index 7d2b5c87..442af90 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -365,7 +365,7 @@ public class Recents extends SystemUI void preloadRecentsInternal() { // Preload only the raw task list into a new load plan (which will be consumed by the - // RecentsActivity) + // RecentsActivity) only if there is a task to animate to. ActivityManager.RunningTaskInfo topTask = mSystemServicesProxy.getTopMostTask(); MutableBoolean topTaskHome = new MutableBoolean(true); RecentsTaskLoader loader = RecentsTaskLoader.getInstance(); @@ -374,8 +374,10 @@ public class Recents extends SystemUI sInstanceLoadPlan.preloadRawTasks(topTaskHome.value); loader.preloadTasks(sInstanceLoadPlan, topTaskHome.value); TaskStack top = sInstanceLoadPlan.getAllTaskStacks().get(0); - preCacheThumbnailTransitionBitmapAsync(topTask, top, mDummyStackView, - topTaskHome.value); + if (top.getTaskCount() > 0) { + preCacheThumbnailTransitionBitmapAsync(topTask, top, mDummyStackView, + topTaskHome.value); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java index 00665f4..a323684 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java @@ -48,15 +48,14 @@ public class DismissViewButton extends Button { public DismissViewButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - mAnimatedDismissDrawable = (AnimatedVectorDrawable) getContext().getResources().getDrawable( + mAnimatedDismissDrawable = (AnimatedVectorDrawable) getContext().getDrawable( R.drawable.dismiss_all_shape_animation).mutate(); mAnimatedDismissDrawable.setCallback(this); mAnimatedDismissDrawable.setBounds(0, 0, mAnimatedDismissDrawable.getIntrinsicWidth(), mAnimatedDismissDrawable.getIntrinsicHeight()); - mStaticDismissDrawable = getContext().getResources().getDrawable( - R.drawable.dismiss_all_shape); + mStaticDismissDrawable = getContext().getDrawable(R.drawable.dismiss_all_shape); mStaticDismissDrawable.setBounds(0, 0, mStaticDismissDrawable.getIntrinsicWidth(), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 13b3898..b93fc76 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -34,6 +34,7 @@ import com.android.systemui.R; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; import com.android.systemui.statusbar.policy.UserInfoController; +import com.android.systemui.statusbar.policy.UserSwitcherController; import java.text.NumberFormat; @@ -140,6 +141,10 @@ public class KeyguardStatusBarView extends RelativeLayout ((BatteryMeterView) findViewById(R.id.battery)).setBatteryController(batteryController); } + public void setUserSwitcherController(UserSwitcherController controller) { + mMultiUserSwitch.setUserSwitcherController(controller); + } + public void setUserInfoController(UserInfoController userInfoController) { userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java index f11d83c..e70d146 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java @@ -24,7 +24,7 @@ import android.provider.ContactsContract; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; -import android.view.accessibility.AccessibilityEvent; +import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.systemui.R; @@ -40,10 +40,14 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener private QSPanel mQsPanel; private KeyguardUserSwitcher mKeyguardUserSwitcher; private boolean mKeyguardMode; + private UserSwitcherController.BaseUserAdapter mUserListener; + final UserManager mUserManager; private final int[] mTmpInt2 = new int[2]; + private UserSwitcherController mUserSwitcherController; + public MultiUserSwitch(Context context, AttributeSet attrs) { super(context, attrs); mUserManager = UserManager.get(getContext()); @@ -53,10 +57,18 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener protected void onFinishInflate() { super.onFinishInflate(); setOnClickListener(this); + refreshContentDescription(); } public void setQsPanel(QSPanel qsPanel) { mQsPanel = qsPanel; + setUserSwitcherController(qsPanel.getHost().getUserSwitcherController()); + } + + public void setUserSwitcherController(UserSwitcherController userSwitcherController) { + mUserSwitcherController = userSwitcherController; + registerListener(); + refreshContentDescription(); } public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) { @@ -65,6 +77,28 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener public void setKeyguardMode(boolean keyguardShowing) { mKeyguardMode = keyguardShowing; + registerListener(); + } + + private void registerListener() { + if (UserSwitcherController.isUserSwitcherAvailable(mUserManager) && mUserListener == null) { + + final UserSwitcherController controller = mUserSwitcherController; + if (controller != null) { + mUserListener = new UserSwitcherController.BaseUserAdapter(controller) { + @Override + public void notifyDataSetChanged() { + refreshContentDescription(); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return null; + } + }; + refreshContentDescription(); + } + } } @Override @@ -74,22 +108,16 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener if (mKeyguardUserSwitcher != null) { mKeyguardUserSwitcher.show(true /* animate */); } - } else { - if (mQsPanel != null) { - UserSwitcherController userSwitcherController = - mQsPanel.getHost().getUserSwitcherController(); - if (userSwitcherController != null) { - View center = getChildCount() > 0 ? getChildAt(0) : this; - - center.getLocationInWindow(mTmpInt2); - mTmpInt2[0] += center.getWidth() / 2; - mTmpInt2[1] += center.getHeight() / 2; - - mQsPanel.showDetailAdapter(true, - userSwitcherController.userDetailAdapter, - mTmpInt2); - } - } + } else if (mQsPanel != null && mUserSwitcherController != null) { + View center = getChildCount() > 0 ? getChildAt(0) : this; + + center.getLocationInWindow(mTmpInt2); + mTmpInt2[0] += center.getWidth() / 2; + mTmpInt2[1] += center.getHeight() / 2; + + mQsPanel.showDetailAdapter(true, + mUserSwitcherController.userDetailAdapter, + mTmpInt2); } } else { Intent intent = ContactsContract.QuickContact.composeQuickContactsIntent( @@ -100,20 +128,21 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener } @Override - public void onPopulateAccessibilityEvent(AccessibilityEvent event) { - super.onPopulateAccessibilityEvent(event); + public void setClickable(boolean clickable) { + super.setClickable(clickable); + refreshContentDescription(); + } + private void refreshContentDescription() { + String currentUser = null; + if (UserSwitcherController.isUserSwitcherAvailable(mUserManager) + && mUserSwitcherController != null) { + currentUser = mUserSwitcherController.getCurrentUserName(mContext); + } + + String text = null; if (isClickable()) { - String text; if (UserSwitcherController.isUserSwitcherAvailable(mUserManager)) { - String currentUser = null; - if (mQsPanel != null) { - UserSwitcherController controller = mQsPanel.getHost() - .getUserSwitcherController(); - if (controller != null) { - currentUser = controller.getCurrentUserName(mContext); - } - } if (TextUtils.isEmpty(currentUser)) { text = mContext.getString(R.string.accessibility_multi_user_switch_switcher); } else { @@ -124,11 +153,17 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener } else { text = mContext.getString(R.string.accessibility_multi_user_switch_quick_contact); } - if (!TextUtils.isEmpty(text)) { - event.getText().add(text); + } else { + if (!TextUtils.isEmpty(currentUser)) { + text = mContext.getString( + R.string.accessibility_multi_user_switch_inactive, + currentUser); } } + if (!TextUtils.equals(getContentDescription(), text)) { + setContentDescription(text); + } } @Override 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 569b918..a5b18f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -232,6 +232,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, /** Allow some time inbetween the long press for back and recents. */ private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200; + /** If true, the system is in the half-boot-to-decryption-screen state. + * Prudently disable QS and notifications. */ private static final boolean ONLY_CORE_APPS; static { @@ -858,6 +860,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // User info. Trigger first load. mHeader.setUserInfoController(mUserInfoController); mKeyguardStatusBar.setUserInfoController(mUserInfoController); + mKeyguardStatusBar.setUserSwitcherController(mUserSwitcherController); mUserInfoController.reloadUserInfo(); mHeader.setBatteryController(mBatteryController); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 0872e06..6a6266e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -162,7 +162,8 @@ public class PhoneStatusBarPolicy { mCast.addCallback(mCastCallback); // hotspot - mService.setIcon(SLOT_HOTSPOT, R.drawable.stat_sys_hotspot, 0, null); + mService.setIcon(SLOT_HOTSPOT, R.drawable.stat_sys_hotspot, 0, + mContext.getString(R.string.accessibility_status_bar_hotspot)); mService.setIconVisibility(SLOT_HOTSPOT, mHotspot.isHotspotEnabled()); mHotspot.addCallback(mHotspotCallback); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 6a8f8ee..7f1fea1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import android.app.StatusBarManager; import android.content.Context; +import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; @@ -50,6 +51,8 @@ public class StatusBarWindowView extends FrameLayout { private NotificationPanelView mNotificationPanel; private View mBrightnessMirror; + private int mRightInset = 0; + PhoneStatusBar mService; private final Paint mTransparentSrcPaint = new Paint(); @@ -63,14 +66,18 @@ public class StatusBarWindowView extends FrameLayout { @Override protected boolean fitSystemWindows(Rect insets) { if (getFitsSystemWindows()) { - boolean changed = insets.left != getPaddingLeft() + boolean paddingChanged = insets.left != getPaddingLeft() || insets.top != getPaddingTop() - || insets.right != getPaddingRight() || insets.bottom != getPaddingBottom(); - // Drop top inset, apply right and left inset and pass through bottom inset. - if (changed) { - setPadding(insets.left, 0, insets.right, 0); + // Super-special right inset handling, because scrims and backdrop need to ignore it. + if (insets.right != mRightInset) { + mRightInset = insets.right; + applyMargins(); + } + // Drop top inset, apply left inset and pass through bottom inset. + if (paddingChanged) { + setPadding(insets.left, 0, 0, 0); } insets.left = 0; insets.top = 0; @@ -88,6 +95,30 @@ public class StatusBarWindowView extends FrameLayout { return false; } + private void applyMargins() { + final int N = getChildCount(); + for (int i = 0; i < N; i++) { + View child = getChildAt(i); + if (child.getLayoutParams() instanceof LayoutParams) { + LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (!lp.ignoreRightInset && lp.rightMargin != mRightInset) { + lp.rightMargin = mRightInset; + child.requestLayout(); + } + } + } + } + + @Override + public FrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(getContext(), attrs); + } + + @Override + protected FrameLayout.LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + } + @Override protected void onAttachedToWindow () { super.onAttachedToWindow(); @@ -244,5 +275,23 @@ public class StatusBarWindowView extends FrameLayout { mStackScrollLayout.cancelExpandHelper(); } } + + public class LayoutParams extends FrameLayout.LayoutParams { + + public boolean ignoreRightInset; + + public LayoutParams(int width, int height) { + super(width, height); + } + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + + TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.StatusBarWindowView_Layout); + ignoreRightInset = a.getBoolean( + R.styleable.StatusBarWindowView_Layout_ignoreRightInset, false); + a.recycle(); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java index e1e022d..40984d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java @@ -22,6 +22,8 @@ public interface SecurityController { String getDeviceOwnerName(); String getProfileOwnerName(); boolean isVpnEnabled(); + String getPrimaryVpnName(); + String getProfileVpnName(); void onUserSwitched(int newUserId); void addCallback(SecurityControllerCallback callback); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java index 4f47cc6..962000a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java @@ -36,6 +36,7 @@ import android.util.SparseArray; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; +import com.android.systemui.R; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -61,7 +62,7 @@ public class SecurityControllerImpl implements SecurityController { private final ArrayList<SecurityControllerCallback> mCallbacks = new ArrayList<SecurityControllerCallback>(); - private SparseArray<Boolean> mCurrentVpnUsers = new SparseArray<>(); + private SparseArray<VpnConfig> mCurrentVpns = new SparseArray<>(); private int mCurrentUserId; public SecurityControllerImpl(Context context) { @@ -82,7 +83,16 @@ public class SecurityControllerImpl implements SecurityController { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("SecurityController state:"); - pw.print(" mCurrentVpnUsers=" + mCurrentVpnUsers); + pw.print(" mCurrentVpns={"); + for (int i = 0 ; i < mCurrentVpns.size(); i++) { + if (i > 0) { + pw.print(", "); + } + pw.print(mCurrentVpns.keyAt(i)); + pw.print('='); + pw.print(mCurrentVpns.valueAt(i).user); + } + pw.println("}"); } @Override @@ -97,11 +107,7 @@ public class SecurityControllerImpl implements SecurityController { @Override public boolean hasProfileOwner() { - boolean result = false; - for (UserInfo profile : mUserManager.getProfiles(mCurrentUserId)) { - result |= (mDevicePolicyManager.getProfileOwnerAsUser(profile.id) != null); - } - return result; + return mDevicePolicyManager.getProfileOwnerAsUser(mCurrentUserId) != null; } @Override @@ -116,8 +122,37 @@ public class SecurityControllerImpl implements SecurityController { } @Override + public String getPrimaryVpnName() { + VpnConfig cfg = mCurrentVpns.get(mCurrentUserId); + if (cfg != null) { + return getNameForVpnConfig(cfg, new UserHandle(mCurrentUserId)); + } else { + return null; + } + } + + @Override + public String getProfileVpnName() { + for (UserInfo profile : mUserManager.getProfiles(mCurrentUserId)) { + if (profile.id == mCurrentUserId) { + continue; + } + VpnConfig cfg = mCurrentVpns.get(profile.id); + if (cfg != null) { + return getNameForVpnConfig(cfg, profile.getUserHandle()); + } + } + return null; + } + + @Override public boolean isVpnEnabled() { - return mCurrentVpnUsers.get(mCurrentUserId) != null; + for (UserInfo profile : mUserManager.getProfiles(mCurrentUserId)) { + if (mCurrentVpns.get(profile.id) != null) { + return true; + } + } + return false; } @Override @@ -140,6 +175,22 @@ public class SecurityControllerImpl implements SecurityController { fireCallbacks(); } + private String getNameForVpnConfig(VpnConfig cfg, UserHandle user) { + if (cfg.legacy) { + return mContext.getString(R.string.legacy_vpn_name); + } + // The package name for an active VPN is stored in the 'user' field of its VpnConfig + final String vpnPackage = cfg.user; + try { + Context userContext = mContext.createPackageContextAsUser(mContext.getPackageName(), + 0 /* flags */, user); + return VpnConfig.getVpnLabel(userContext, vpnPackage).toString(); + } catch (NameNotFoundException nnfe) { + Log.e(TAG, "Package " + vpnPackage + " is not present", nnfe); + return null; + } + } + private void fireCallbacks() { for (SecurityControllerCallback callback : mCallbacks) { callback.onStateChanged(); @@ -148,21 +199,20 @@ public class SecurityControllerImpl implements SecurityController { private void updateState() { // Find all users with an active VPN - SparseArray<Boolean> vpnUsers = new SparseArray<>(); + SparseArray<VpnConfig> vpns = new SparseArray<>(); try { - for (VpnInfo vpn : mConnectivityManagerService.getAllVpnInfo()) { - UserInfo user = mUserManager.getUserInfo(UserHandle.getUserId(vpn.ownerUid)); - int groupId = (user.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID ? - user.profileGroupId : user.id); - - vpnUsers.put(groupId, Boolean.TRUE); + for (UserInfo user : mUserManager.getUsers()) { + VpnConfig cfg = mConnectivityManagerService.getVpnConfig(user.id); + if (cfg != null) { + vpns.put(user.id, cfg); + } } } catch (RemoteException rme) { // Roll back to previous state Log.e(TAG, "Unable to list active VPNs", rme); return; } - mCurrentVpnUsers = vpnUsers; + mCurrentVpns = vpns; } private final NetworkCallback mNetworkCallback = new NetworkCallback() { @@ -182,5 +232,4 @@ public class SecurityControllerImpl implements SecurityController { fireCallbacks(); }; }; - } diff --git a/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java b/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java index 7472af9..2b76c31 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java @@ -315,6 +315,16 @@ public class QsTuner extends Fragment implements Callback { } @Override + public String getPrimaryVpnName() { + return null; + } + + @Override + public String getProfileVpnName() { + return null; + } + + @Override public void onUserSwitched(int newUserId) { } diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java index 310a64c..29bea4d 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java @@ -386,18 +386,8 @@ public class VolumeDialog { } } } else { - if (mAutomute && !row.ss.muteSupported) { - final boolean vmute = row.ss.level == 0; - mController.setStreamVolume(stream, vmute ? row.lastAudibleLevel : 0); - } else { - final boolean mute = !row.ss.muted; - mController.setStreamMute(stream, mute); - if (mAutomute) { - if (!mute && row.ss.level == 0) { - mController.setStreamVolume(stream, 1); - } - } - } + final boolean vmute = row.ss.level == 0; + mController.setStreamVolume(stream, vmute ? row.lastAudibleLevel : 0); } row.userAttempt = 0; // reset the grace period, slider should update immediately } @@ -589,6 +579,9 @@ public class VolumeDialog { if (ss.level > 0) { row.lastAudibleLevel = ss.level; } + if (ss.level == row.requestedLevel) { + row.requestedLevel = -1; + } final boolean isRingStream = row.stream == AudioManager.STREAM_RING; final boolean isSystemStream = row.stream == AudioManager.STREAM_SYSTEM; final boolean isAlarmStream = row.stream == AudioManager.STREAM_ALARM; @@ -664,7 +657,10 @@ public class VolumeDialog { row.icon.setContentDescription(ss.name); // update slider - updateVolumeRowSliderH(row, zenMuted); + final boolean enableSlider = !zenMuted; + final int vlevel = row.ss.muted && (isRingVibrate || !isRingStream && !zenMuted) ? 0 + : row.ss.level; + updateVolumeRowSliderH(row, enableSlider, vlevel); } private void updateVolumeRowSliderTintH(VolumeRow row, boolean isActive) { @@ -676,8 +672,8 @@ public class VolumeDialog { row.slider.setThumbTintList(tint); } - private void updateVolumeRowSliderH(VolumeRow row, boolean zenMuted) { - row.slider.setEnabled(!zenMuted); + private void updateVolumeRowSliderH(VolumeRow row, boolean enable, int vlevel) { + row.slider.setEnabled(enable); updateVolumeRowSliderTintH(row, row.stream == mActiveStream); if (row.tracking) { return; // don't update if user is sliding @@ -694,7 +690,6 @@ public class VolumeDialog { row.userAttempt + USER_ATTEMPT_GRACE_PERIOD); return; // don't update if visible and in grace period } - final int vlevel = row.ss.muted ? 0 : row.ss.level; if (vlevel == level) { if (mShowing && rowVisible) { return; // don't clamp if visible @@ -1018,7 +1013,7 @@ public class VolumeDialog { private StreamState ss; private long userAttempt; // last user-driven slider change private boolean tracking; // tracking slider touch - private int requestedLevel; + private int requestedLevel = -1; // pending user-requested level via progress changed private int iconRes; private int iconMuteRes; private boolean important; |