diff options
127 files changed, 1286 insertions, 461 deletions
diff --git a/Android.bp b/Android.bp index 351704a1c0b4..67b088c2dc00 100644 --- a/Android.bp +++ b/Android.bp @@ -1445,8 +1445,6 @@ droidstubs { name: "hiddenapi-mappings", defaults: ["metalava-api-stubs-default"], srcs: [ - ":non_openjdk_java_files", - ":openjdk_java_files", ":opt-telephony-common-srcs", ], diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 5e5a04b1af3b..518a29c2017a 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -583,7 +583,11 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } catch (IllegalArgumentException e) { installer = ""; } - sStatsd.informOnePackage(app, uid, pi.getLongVersionCode(), pi.versionName, + sStatsd.informOnePackage( + app, + uid, + pi.getLongVersionCode(), + pi.versionName == null ? "" : pi.versionName, installer == null ? "" : installer); } } catch (Exception e) { diff --git a/api/current.txt b/api/current.txt index 59c3f6828154..55983c86ee4b 100644 --- a/api/current.txt +++ b/api/current.txt @@ -29786,6 +29786,7 @@ package android.net.wifi { public class ScanResult implements android.os.Parcelable { method public int describeContents(); + method public int getWifiStandard(); method public boolean is80211mcResponder(); method public boolean isPasspointNetwork(); method public void writeToParcel(android.os.Parcel, int); @@ -29796,6 +29797,11 @@ package android.net.wifi { field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2 field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4 field public String SSID; + field public static final int WIFI_STANDARD_11AC = 5; // 0x5 + field public static final int WIFI_STANDARD_11AX = 6; // 0x6 + field public static final int WIFI_STANDARD_11N = 4; // 0x4 + field public static final int WIFI_STANDARD_LEGACY = 1; // 0x1 + field public static final int WIFI_STANDARD_UNKNOWN = 0; // 0x0 field public String capabilities; field public int centerFreq0; field public int centerFreq1; @@ -29992,16 +29998,11 @@ package android.net.wifi { method public String getSSID(); method public android.net.wifi.SupplicantState getSupplicantState(); method @IntRange(from=0xffffffff) public int getTxLinkSpeedMbps(); - method public int getWifiTechnology(); + method public int getWifiStandard(); method public void writeToParcel(android.os.Parcel, int); field public static final String FREQUENCY_UNITS = "MHz"; field public static final String LINK_SPEED_UNITS = "Mbps"; field public static final int LINK_SPEED_UNKNOWN = -1; // 0xffffffff - field public static final int WIFI_TECHNOLOGY_11AC = 5; // 0x5 - field public static final int WIFI_TECHNOLOGY_11AX = 6; // 0x6 - field public static final int WIFI_TECHNOLOGY_11N = 4; // 0x4 - field public static final int WIFI_TECHNOLOGY_LEGACY = 1; // 0x1 - field public static final int WIFI_TECHNOLOGY_UNKNOWN = 0; // 0x0 } public class WifiManager { diff --git a/api/system-current.txt b/api/system-current.txt index 6258b33fa626..0b1839374298 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -9496,14 +9496,17 @@ package android.telephony.ims { } public class ImsUtListener { + method public void onLineIdentificationSupplementaryServiceResponse(int, @NonNull android.telephony.ims.ImsSsInfo); method public void onSupplementaryServiceIndication(android.telephony.ims.ImsSsData); method public void onUtConfigurationCallBarringQueried(int, android.telephony.ims.ImsSsInfo[]); method public void onUtConfigurationCallForwardQueried(int, android.telephony.ims.ImsCallForwardInfo[]); method public void onUtConfigurationCallWaitingQueried(int, android.telephony.ims.ImsSsInfo[]); - method public void onUtConfigurationQueried(int, android.os.Bundle); + method @Deprecated public void onUtConfigurationQueried(int, android.os.Bundle); method public void onUtConfigurationQueryFailed(int, android.telephony.ims.ImsReasonInfo); method public void onUtConfigurationUpdateFailed(int, android.telephony.ims.ImsReasonInfo); method public void onUtConfigurationUpdated(int); + field @Deprecated public static final String BUNDLE_KEY_CLIR = "queryClir"; + field @Deprecated public static final String BUNDLE_KEY_SSINFO = "imsSsInfo"; } public abstract class ImsVideoCallProvider { diff --git a/api/system-lint-baseline.txt b/api/system-lint-baseline.txt index a907fa64d9ce..21526d007dc5 100644 --- a/api/system-lint-baseline.txt +++ b/api/system-lint-baseline.txt @@ -135,6 +135,12 @@ MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId( +MutableBareField: android.net.wifi.WifiConfiguration#allowAutojoin: + +MutableBareField: android.net.wifi.WifiConfiguration#carrierId: + + + NoClone: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0: diff --git a/api/test-lint-baseline.txt b/api/test-lint-baseline.txt index a43b45d4e5c7..9606413ff7cd 100644 --- a/api/test-lint-baseline.txt +++ b/api/test-lint-baseline.txt @@ -1799,6 +1799,48 @@ MissingNullability: android.widget.TimePicker#getPmView(): +MutableBareField: android.content.AutofillOptions#appDisabledExpiration: + +MutableBareField: android.content.AutofillOptions#augmentedAutofillEnabled: + +MutableBareField: android.content.AutofillOptions#disabledActivities: + +MutableBareField: android.content.AutofillOptions#whitelistedActivitiesForAugmentedAutofill: + +MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#cache: + +MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#dbName: + +MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#dbSize: + +MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#lookaside: + +MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#pageSize: + +MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#dbStats: + +MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#largestMemAlloc: + +MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#memoryUsed: + +MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#pageCacheOverflow: + +MutableBareField: android.os.StrictMode.ViolationInfo#broadcastIntentAction: + +MutableBareField: android.os.StrictMode.ViolationInfo#durationMillis: + +MutableBareField: android.os.StrictMode.ViolationInfo#numAnimationsRunning: + +MutableBareField: android.os.StrictMode.ViolationInfo#numInstances: + +MutableBareField: android.os.StrictMode.ViolationInfo#tags: + +MutableBareField: android.os.StrictMode.ViolationInfo#violationNumThisLoop: + +MutableBareField: android.os.StrictMode.ViolationInfo#violationUptimeMillis: + + + NoByteOrShort: android.media.audiofx.AudioEffect#byteArrayToShort(byte[]): NoByteOrShort: android.media.audiofx.AudioEffect#setParameter(int, short) parameter #1: @@ -2133,6 +2175,10 @@ StreamFiles: android.provider.MediaStore#scanVolume(android.content.Context, jav +UseParcelFileDescriptor: android.util.proto.ProtoOutputStream#ProtoOutputStream(java.io.FileDescriptor) parameter #0: + + + UserHandle: android.app.admin.DevicePolicyManager#getOwnerInstalledCaCerts(android.os.UserHandle): UserHandle: android.app.role.RoleManager#addOnRoleHoldersChangedListenerAsUser(java.util.concurrent.Executor, android.app.role.OnRoleHoldersChangedListener, android.os.UserHandle): diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp index 0176f8047974..c9277a57bd07 100644 --- a/cmds/incidentd/src/Section.cpp +++ b/cmds/incidentd/src/Section.cpp @@ -495,6 +495,7 @@ LogSection::LogSection(int id, const char* logID, ...) : WorkerThreadSection(id) name += " "; name += arg; } + va_end(args); switch (mLogID) { case LOG_ID_EVENTS: diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java index 8fbbcf4b88c6..d59ee92dba7e 100644 --- a/core/java/android/view/GestureDetector.java +++ b/core/java/android/view/GestureDetector.java @@ -145,7 +145,7 @@ public class GestureDetector { boolean onSingleTapConfirmed(MotionEvent e); /** - * Notified when a double-tap occurs. + * Notified when a double-tap occurs. Triggered on the down event of second tap. * * @param e The down motion event of the first tap of the double-tap. * @return true if the event is consumed, else false @@ -378,7 +378,9 @@ public class GestureDetector { * * @param context the application's context * @param listener the listener invoked for all the callbacks, this must - * not be null. + * not be null. If the listener implements the {@link OnDoubleTapListener} or + * {@link OnContextClickListener} then it will also be set as the listener for + * these callbacks (for example when using the {@link SimpleOnGestureListener}). * * @throws NullPointerException if {@code listener} is null. */ @@ -393,7 +395,9 @@ public class GestureDetector { * * @param context the application's context * @param listener the listener invoked for all the callbacks, this must - * not be null. + * not be null. If the listener implements the {@link OnDoubleTapListener} or + * {@link OnContextClickListener} then it will also be set as the listener for + * these callbacks (for example when using the {@link SimpleOnGestureListener}). * @param handler the handler to use for running deferred listener events. * * @throws NullPointerException if {@code listener} is null. diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 033e9b2c6eba..36a7a9c91ee4 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -337,6 +337,14 @@ public final class SystemUiDeviceConfigFlags { "brightline_falsing_zigzag_y_secondary_deviance"; + // Flags related to screenshots + + /** + * (boolean) Whether screenshot flow going to the corner (instead of shown in a notification) + * is enabled. + */ + public static final String SCREENSHOT_CORNER_FLOW = "screenshot_corner_flow"; + private SystemUiDeviceConfigFlags() { } } diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java index b7523963ec19..db91dc5a8bc3 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/core/java/com/android/server/SystemConfig.java @@ -863,11 +863,7 @@ public class SystemConfig { XmlUtils.skipCurrentTag(parser); } break; case "component-override": { - if (allowAppConfigs) { - readComponentOverrides(parser, permFile); - } else { - logNotAllowedInPartition(name, permFile, parser); - } + readComponentOverrides(parser, permFile); XmlUtils.skipCurrentTag(parser); } break; case "backup-transport-whitelisted-service": { diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 4fb03d6dc328..e74cbb14ee4d 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -299,13 +299,13 @@ <string name="permgrouplab_microphone" msgid="171539900250043464">"Μικρόφωνο"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"ηχογραφεί"</string> <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η εγγραφή ήχου;"</string> - <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Σωματική δραστηριότητα"</string> + <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Σωματική δραστ/τητα"</string> <string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"πρόσβαση στη σωματική σας δραστηριότητα"</string> <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στη σωματική σας δραστηριότητα;"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"Κάμερα"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"γίνεται λήψη φωτογραφιών και εγγραφή βίντεο"</string> <string name="permgrouprequest_camera" msgid="1299833592069671756">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> η λήψη φωτογραφιών και η εγγραφή βίντεο;"</string> - <string name="permgrouplab_calllog" msgid="8798646184930388160">"Αρχεία καταγραφής κλήσεων"</string> + <string name="permgrouplab_calllog" msgid="8798646184930388160">"Αρχεία καταγρ. κλήσ."</string> <string name="permgroupdesc_calllog" msgid="3006237336748283775">"ανάγνωση και εγγραφή αρχείου καταγραφής τηλεφωνικών κλήσεων"</string> <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στα αρχεία καταγραφής τηλεφωνικών κλήσεών σας;"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Τηλέφωνο"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 32530d3cfb60..02c804378122 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -299,7 +299,7 @@ <string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"enregistrer des fichiers audio"</string> <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Autoriser <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à enregistrer l\'audio?"</string> - <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"données d\'activité physique"</string> + <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Activité physique"</string> <string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"accéder à vos activités physiques"</string> <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à vos activités physiques?"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 86e8b36c103e..2888a532bcb4 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -304,13 +304,13 @@ <string name="permgrouprequest_storage" msgid="7885942926944299560">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה לתמונות, למדיה ולקבצים במכשיר?"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"מיקרופון"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"הקלטת אודיו"</string> - <string name="permgrouprequest_microphone" msgid="9167492350681916038">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאה להקליט אודיו?"</string> + <string name="permgrouprequest_microphone" msgid="9167492350681916038">"לאשר לאפליקציית <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> להקליט אודיו?"</string> <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"פעילות גופנית"</string> <string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"גישה לפעילות הגופנית שלך"</string> <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"האם לאפשר לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> גישה לפעילות הגופנית שלך?"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"מצלמה"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"צילום תמונות והקלטת וידאו"</string> - <string name="permgrouprequest_camera" msgid="1299833592069671756">"לאשר לאפליקציה של <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> לצלם תמונות וסרטונים?"</string> + <string name="permgrouprequest_camera" msgid="1299833592069671756">"לאשר לאפליקציית <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> לצלם תמונות וסרטונים?"</string> <string name="permgrouplab_calllog" msgid="8798646184930388160">"יומני שיחות"</string> <string name="permgroupdesc_calllog" msgid="3006237336748283775">"קריאה וכתיבה של יומן השיחות של הטלפון"</string> <string name="permgrouprequest_calllog" msgid="8487355309583773267">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה ליומני השיחות של הטלפון?"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 904f8b079a12..3fb67669e4da 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -305,13 +305,13 @@ <string name="permgrouplab_camera" msgid="4820372495894586615">"ಕ್ಯಾಮರಾ"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"ಚಿತ್ರಗಳನ್ನು ತೆಗೆಯಲು, ವೀಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಲು"</string> <string name="permgrouprequest_camera" msgid="1299833592069671756">"ಚಿತ್ರಗಳನ್ನು ಸೆರೆಹಿಡಿಯಲು ಮತ್ತು ವೀಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string> - <string name="permgrouplab_calllog" msgid="8798646184930388160">"ಕರೆಯ ಲಾಗ್ಗಳು"</string> + <string name="permgrouplab_calllog" msgid="8798646184930388160">"ಕರೆಯ ಲಾಗ್"</string> <string name="permgroupdesc_calllog" msgid="3006237336748283775">"ಪೋನ್ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಓದಿ ಮತ್ತು ಬರೆಯಿರಿ"</string> <string name="permgrouprequest_calllog" msgid="8487355309583773267">"ನಿಮ್ಮ ಫೋನ್ ಕರೆಯ ಲಾಗ್ಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"ಫೋನ್"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"ಫೋನ್ ಕರೆ ಮಾಡಲು ಹಾಗೂ ನಿರ್ವಹಿಸಲು"</string> <string name="permgrouprequest_phone" msgid="9166979577750581037">"ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string> - <string name="permgrouplab_sensors" msgid="4838614103153567532">"ದೇಹದ ಸೆನ್ಸರ್ಗಳು"</string> + <string name="permgrouplab_sensors" msgid="4838614103153567532">"ದೇಹದ ಸೆನ್ಸರ್"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸಾರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string> <string name="permgrouprequest_sensors" msgid="6349806962814556786">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string> <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index dcb766d2bd8c..db54c4280b17 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -305,7 +305,7 @@ <string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"сүрөт жана видео тартууга"</string> <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна сүрөттөр менен видеолорду тартканга уруксат бересизби?"</string> - <string name="permgrouplab_calllog" msgid="8798646184930388160">"Чалуулар тизмелери"</string> + <string name="permgrouplab_calllog" msgid="8798646184930388160">"Чалуулар тизмеси"</string> <string name="permgroupdesc_calllog" msgid="3006237336748283775">"телефондогу чалуулар тизмесин окуу жана жазуу"</string> <string name="permgrouprequest_calllog" msgid="8487355309583773267">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна телефондогу чалуулар тизмесин пайдаланууга уруксат берилсинби?"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index f1a6136ef006..82ec2b661f10 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -301,13 +301,13 @@ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Permiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să acceseze fotografiile, conținutul media și fișierele de pe dispozitiv?"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Microfon"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"înregistreze sunet"</string> - <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Pemiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să înregistreze conținut audio?"</string> + <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Pemiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să înregistreze audio?"</string> <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Activitate fizică"</string> <string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"accesați activitatea fizică"</string> <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Permiteți aplicației <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să vă acceseze activitatea fizică?"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"Camera foto"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografieze și să înregistreze videoclipuri"</string> - <string name="permgrouprequest_camera" msgid="1299833592069671756">"Permiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să facă fotografii și să înregistreze videoclipuri?"</string> + <string name="permgrouprequest_camera" msgid="1299833592069671756">"Permiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să fotografieze și să înregistreze video?"</string> <string name="permgrouplab_calllog" msgid="8798646184930388160">"Jurnale de apeluri"</string> <string name="permgroupdesc_calllog" msgid="3006237336748283775">"să citească și să scrie jurnalul de apeluri telefonice"</string> <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Permiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să vă acceseze jurnalele de apeluri?"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 1549f4ddfacd..18a87941e044 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -310,7 +310,7 @@ <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup k vašej fyzickej aktivite?"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparát"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"fotenie a natáčanie videí"</string> - <string name="permgrouprequest_camera" msgid="1299833592069671756">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> snímať fotky a zaznamenávať video?"</string> + <string name="permgrouprequest_camera" msgid="1299833592069671756">"Chcete povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> fotiť a nahrávať video?"</string> <string name="permgrouplab_calllog" msgid="8798646184930388160">"Zoznam hovorov"</string> <string name="permgroupdesc_calllog" msgid="3006237336748283775">"čítať a zapisovať do zoznamu hovorov"</string> <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Povoliť aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup k zoznamu hovorov?"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 5431796ece89..fd77532c2cfb 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1234,7 +1234,7 @@ <string name="volume_unknown" msgid="1400219669770445902">"ระดับเสียง"</string> <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"ระดับบลูทูธ"</string> <string name="volume_icon_description_ringer" msgid="3326003847006162496">"ระดับเสียงเรียกเข้า"</string> - <string name="volume_icon_description_incall" msgid="8890073218154543397">"ปริมาณการโทร"</string> + <string name="volume_icon_description_incall" msgid="8890073218154543397">"ระดับเสียงการโทร"</string> <string name="volume_icon_description_media" msgid="4217311719665194215">"ระดับเสียงของสื่อ"</string> <string name="volume_icon_description_notification" msgid="7044986546477282274">"ระดับเสียงของการแจ้งเตือน"</string> <string name="ringtone_default" msgid="3789758980357696936">"เสียงเรียกเข้าเริ่มต้น"</string> diff --git a/libs/hwui/TreeInfo.cpp b/libs/hwui/TreeInfo.cpp index dc53dd6c27c3..750f869e2551 100644 --- a/libs/hwui/TreeInfo.cpp +++ b/libs/hwui/TreeInfo.cpp @@ -24,7 +24,6 @@ TreeInfo::TreeInfo(TraversalMode mode, renderthread::CanvasContext& canvasContex : mode(mode) , prepareTextures(mode == MODE_FULL) , canvasContext(canvasContext) - , damageGenerationId(canvasContext.getFrameNumber()) , disableForceDark(canvasContext.useForceDark() ? 0 : 1) , screenSize(canvasContext.getNextFrameSize()) {} diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index e5c502cca09a..4ca26c273c95 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -303,6 +303,7 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, int64_t sy info.damageAccumulator = &mDamageAccumulator; info.layerUpdateQueue = &mLayerUpdateQueue; + info.damageGenerationId = mDamageId++; info.out.canDrawThisFrame = true; mAnimationContext->startFrame(info.mode); @@ -702,7 +703,7 @@ bool CanvasContext::surfaceRequiresRedraw() { surface->query(NATIVE_WINDOW_WIDTH, &width); surface->query(NATIVE_WINDOW_HEIGHT, &height); - return width == mLastFrameWidth && height == mLastFrameHeight; + return width != mLastFrameWidth || height != mLastFrameHeight; } void CanvasContext::setRenderAheadDepth(int renderAhead) { diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 6e3e43af8c6f..b192d461da9b 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -245,6 +245,7 @@ private: // Need at least 4 because we do quad buffer. Add a 5th for good measure. RingBuffer<SwapHistory, 5> mSwapHistory; int64_t mFrameNumber = -1; + int64_t mDamageId = 0; // last vsync for a dropped frame due to stuffed queue nsecs_t mLastDropVsync = 0; diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java index 412312e5af25..706727bf050e 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java @@ -93,6 +93,7 @@ import com.android.systemui.statusbar.policy.RemoteInputUriController; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.tv.TvStatusBar; +import com.android.systemui.theme.ThemeOverlayController; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.util.leak.GarbageMonitor; import com.android.systemui.volume.VolumeUI; @@ -183,6 +184,18 @@ public abstract class CarSystemUIBinder { public abstract SystemUI bindsSizeCompatModeActivityController( SizeCompatModeActivityController sysui); + /** Inject into SliceBroadcastRelayHandler. */ + @Binds + @IntoMap + @ClassKey(SliceBroadcastRelayHandler.class) + public abstract SystemUI bindSliceBroadcastRelayHandler(SliceBroadcastRelayHandler sysui); + + /** Inject into ThemeOverlayController. */ + @Binds + @IntoMap + @ClassKey(ThemeOverlayController.class) + public abstract SystemUI bindThemeOverlayController(ThemeOverlayController sysui); + /** Inject into StatusBar. */ @Binds @IntoMap diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java index 658a0b59622c..6f19559bcbd1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java @@ -93,7 +93,7 @@ public class WifiUtils { if (bssid != null) { visibility.append(" ").append(bssid); } - visibility.append(" technology = ").append(info.getWifiTechnology()); + visibility.append(" standard = ").append(info.getWifiStandard()); visibility.append(" rssi=").append(info.getRssi()); visibility.append(" "); visibility.append(" score=").append(info.score); diff --git a/packages/SystemUI/docs/broadcasts.md b/packages/SystemUI/docs/broadcasts.md new file mode 100644 index 000000000000..56a637fe588c --- /dev/null +++ b/packages/SystemUI/docs/broadcasts.md @@ -0,0 +1,89 @@ +# Using SystemUI's BroadcastDispatcher + +## What is this dispatcher? + +This is an internal dispatcher class for global broadcasts that SystemUI components want to receive. The dispatcher consolidates most `BroadcastReceiver` that exist in SystemUI by merging the `IntentFilter` and subscribing a single `BroadcastReceiver` per user with the system. + +## Why use the dispatcher? + +Having a single `BroadcastReceiver` in SystemUI improves the multi dispatch situation that occurs whenever many classes are filtering for the same intent action. In particular: +* All supported `BroadcastReceiver` will be aggregated into one single receiver per user. +* Whenever there is a broadcast, the number of IPC calls from `system_server` into SystemUI will be reduced to one per user (plus one for `USER_ALL`). This is meaninful for actions that are filtered by `BroadcastReceiver` in multiple classes. +*There could be more than one per user in the case of unsupported filters.* +* The dispatcher immediately moves out of the main thread upon broadcast, giving back control to `system_server`. This improves the total dispatch time for broadcasts and prevents from timing out. +* The dispatcher significantly reduces time spent in main thread by handling most operations in a background thread and only using the main thread for subscribing/unsubscribind and dispatching where appropriate. + +## Should I use the dispatcher? + +The dispatcher supports `BroadcastReceiver` dynamic subscriptions in the following cases: + +* The `IntentFilter` contains at least one action. +* The `IntentFilter` may or may not contain categories. +* The `IntentFilter` **does not** contain data types, data schemes, data authorities or data paths. +* The broadcast **is not** gated behind a permission. + +Additionally, the dispatcher supports the following: + +* Subscriptions can be done in any thread. +* Broadcasts will be dispatched on the main thread (same as `system_server`) by default but a `Handler` can be specified for dispatching +* A `UserHandle` can be provided to filter the broadcasts by user. + +If introducing a new `BroadcastReceiver` (not declared in `AndroidManifest`) that satisfies the constraints above, use the dispatcher to reduce the load on `system_server`. + +Do not use the dispatcher to obtain the last broadcast (by passing a null `BroadcastReceiver`). `BroadcastDispatcher#registerReceiver` **does not** return the last sticky Intent. + +Additionally, if listening to some broadcast is latency critical (beyond 100ms of latency), consider registering with Context instead. + +## How do I use the dispatcher? + +Acquire the dispatcher by using `@Inject` to obtain a `BroadcastDispatcher`. Then, use the following methods in that instance. + +### Subscribe + +```kotlin +/** + * Register a receiver for broadcast with the dispatcher + * + * @param receiver A receiver to dispatch the [Intent] + * @param filter A filter to determine what broadcasts should be dispatched to this receiver. + * It will only take into account actions and categories for filtering. It must + * have at least one action. + * @param handler A handler to dispatch [BroadcastReceiver.onReceive]. By default, it is the + * main handler. Pass `null` to use the default. + * @param user A user handle to determine which broadcast should be dispatched to this receiver. + * By default, it is the current user. + * @throws IllegalArgumentException if the filter has other constraints that are not actions or + * categories or the filter has no actions. + */ +@JvmOverloads +fun registerReceiver(BroadcastReceiver, IntentFilter, Handler? = mainHandler, UserHandle = context.user) +``` + +All subscriptions are done with the same overloaded method. As specified in the doc, in order to pass a `UserHandle` with the default `Handler`, pass `null` for the `Handler`. + +In the same way as with `Context`, subscribing the same `BroadcastReceiver` for the same user using different filters will result on two subscriptions, not in replacing the filter. + +### Unsubscribe + +There are two methods to unsubscribe a given `BroadcastReceiver`. One that will remove it for all users and another where the user can be specified. This allows using separate subscriptions of the same receiver for different users and manipulating them separately. + +```kotlin +/** + * Unregister receiver for all users. + * <br> + * This will remove every registration of [receiver], not those done just with [UserHandle.ALL]. + * + * @param receiver The receiver to unregister. It will be unregistered for all users. + */ +fun unregisterReceiver(BroadcastReceiver) + +/** + * Unregister receiver for a particular user. + * + * @param receiver The receiver to unregister. It will be unregistered for all users. + * @param user The user associated to the registered [receiver]. It can be [UserHandle.ALL]. + */ +fun unregisterReceiverForUser(BroadcastReceiver, UserHandle) +``` + +Unregistering can be done even if the `BroadcastReceiver` has never been registered with `BroadcastDispatcher`. In that case, it is a No-Op. diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index 6186589ab086..5f92b2811807 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -89,6 +89,14 @@ public abstract class TaskStackChangeListener { onTaskMovedToFront(taskInfo.taskId); } + /** + * Called when a task’s description is changed due to an activity calling + * ActivityManagerService.setTaskDescription + * + * @param taskInfo info about the task which changed, with {@link TaskInfo#taskDescription} + */ + public void onTaskDescriptionChanged(RunningTaskInfo taskInfo) { } + public void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) { } public void onSizeCompatModeActivityChanged(int displayId, IBinder activityToken) { } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java index 8d823ca34b39..074ef53aa57c 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java @@ -230,6 +230,11 @@ public class TaskStackChangeListeners extends TaskStackListener { .sendToTarget(); } + @Override + public void onTaskDescriptionChanged(RunningTaskInfo taskInfo) { + mHandler.obtainMessage(H.ON_TASK_DESCRIPTION_CHANGED, taskInfo).sendToTarget(); + } + private final class H extends Handler { private static final int ON_TASK_STACK_CHANGED = 1; private static final int ON_TASK_SNAPSHOT_CHANGED = 2; @@ -254,6 +259,7 @@ public class TaskStackChangeListeners extends TaskStackListener { private static final int ON_TASK_LIST_UPDATED = 21; private static final int ON_SINGLE_TASK_DISPLAY_EMPTY = 22; private static final int ON_TASK_LIST_FROZEN_UNFROZEN = 23; + private static final int ON_TASK_DESCRIPTION_CHANGED = 24; public H(Looper looper) { @@ -421,6 +427,13 @@ public class TaskStackChangeListeners extends TaskStackListener { } break; } + case ON_TASK_DESCRIPTION_CHANGED: { + final RunningTaskInfo info = (RunningTaskInfo) msg.obj; + for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { + mTaskStackListeners.get(i).onTaskDescriptionChanged(info); + } + break; + } } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 8373fb24ee4f..6685db130d4a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -102,6 +102,7 @@ import com.android.systemui.DejankUtils; import com.android.systemui.DumpController; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainLooper; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; @@ -1502,6 +1503,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @VisibleForTesting @Inject protected KeyguardUpdateMonitor(Context context, @MainLooper Looper mainLooper, + BroadcastDispatcher broadcastDispatcher, DumpController dumpController) { mContext = context; mSubscriptionManager = SubscriptionManager.from(context); @@ -1645,12 +1647,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); - context.registerReceiver(mBroadcastReceiver, filter, null, mHandler); + broadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, mHandler); final IntentFilter bootCompleteFilter = new IntentFilter(); bootCompleteFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); bootCompleteFilter.addAction(Intent.ACTION_BOOT_COMPLETED); - context.registerReceiver(mBroadcastReceiver, bootCompleteFilter, null, mHandler); + broadcastDispatcher.registerReceiver(mBroadcastReceiver, bootCompleteFilter, mHandler); final IntentFilter allUserFilter = new IntentFilter(); allUserFilter.addAction(Intent.ACTION_USER_INFO_CHANGED); @@ -1661,8 +1663,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab allUserFilter.addAction(ACTION_USER_UNLOCKED); allUserFilter.addAction(ACTION_USER_STOPPED); allUserFilter.addAction(ACTION_USER_REMOVED); - context.registerReceiverAsUser(mBroadcastAllReceiver, UserHandle.ALL, allUserFilter, - null, mHandler); + broadcastDispatcher.registerReceiver(mBroadcastAllReceiver, allUserFilter, mHandler, + UserHandle.ALL); mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener); try { diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java index 9e2464ea4fbb..dfabe696cf71 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java @@ -32,6 +32,7 @@ import android.view.LayoutInflater; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Observer; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager.DockEventListener; @@ -125,9 +126,9 @@ public final class ClockManager { @Inject public ClockManager(Context context, InjectionInflationController injectionInflater, PluginManager pluginManager, SysuiColorExtractor colorExtractor, - @Nullable DockManager dockManager) { + @Nullable DockManager dockManager, BroadcastDispatcher broadcastDispatcher) { this(context, injectionInflater, pluginManager, colorExtractor, - context.getContentResolver(), new CurrentUserObservable(context), + context.getContentResolver(), new CurrentUserObservable(broadcastDispatcher), new SettingsWrapper(context.getContentResolver()), dockManager); } diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index fef9198d670a..2afcb12da730 100644 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -51,6 +51,7 @@ import androidx.annotation.StyleRes; import com.android.settingslib.Utils; import com.android.settingslib.graph.ThemedBatteryDrawable; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.settings.CurrentUserTracker; @@ -112,16 +113,13 @@ public class BatteryMeterView extends LinearLayout implements private int mNonAdaptedForegroundColor; private int mNonAdaptedBackgroundColor; - public BatteryMeterView(Context context) { - this(context, null, 0); - } - public BatteryMeterView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BatteryMeterView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + BroadcastDispatcher broadcastDispatcher = Dependency.get(BroadcastDispatcher.class); setOrientation(LinearLayout.HORIZONTAL); setGravity(Gravity.CENTER_VERTICAL | Gravity.START); @@ -161,7 +159,7 @@ public class BatteryMeterView extends LinearLayout implements // Init to not dark at all. onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT); - mUserTracker = new CurrentUserTracker(mContext) { + mUserTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mUser = newUserId; diff --git a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java index 3a8536b8127e..4afa96987499 100644 --- a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java +++ b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java @@ -32,6 +32,7 @@ import android.provider.Settings; import android.util.Log; import android.view.WindowManagerGlobal; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.phone.SystemUIDialog; /** @@ -45,10 +46,14 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver { private Dialog mNewSessionDialog; - public void register(Context context) { + /** + * Register this receiver with the {@link BroadcastDispatcher} + * + * @param broadcastDispatcher to register the receiver. + */ + public void register(BroadcastDispatcher broadcastDispatcher) { IntentFilter f = new IntentFilter(Intent.ACTION_USER_SWITCHED); - context.registerReceiverAsUser(this, UserHandle.SYSTEM, - f, null /* permission */, null /* scheduler */); + broadcastDispatcher.registerReceiver(this, f, null /* handler */, UserHandle.SYSTEM); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/LatencyTester.java b/packages/SystemUI/src/com/android/systemui/LatencyTester.java index 30a60abfcd86..1a47daceafcc 100644 --- a/packages/SystemUI/src/com/android/systemui/LatencyTester.java +++ b/packages/SystemUI/src/com/android/systemui/LatencyTester.java @@ -29,6 +29,7 @@ import android.os.SystemClock; import com.android.internal.util.LatencyTracker; import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.phone.BiometricUnlockController; import javax.inject.Inject; @@ -49,13 +50,16 @@ public class LatencyTester extends SystemUI { "com.android.systemui.latency.ACTION_TURN_ON_SCREEN"; private final BiometricUnlockController mBiometricUnlockController; private final PowerManager mPowerManager; + private final BroadcastDispatcher mBroadcastDispatcher; @Inject public LatencyTester(Context context, BiometricUnlockController biometricUnlockController, - PowerManager powerManager) { + PowerManager powerManager, BroadcastDispatcher broadcastDispatcher) { super(context); + mBiometricUnlockController = biometricUnlockController; mPowerManager = powerManager; + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -67,7 +71,7 @@ public class LatencyTester extends SystemUI { IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_FINGERPRINT_WAKE); filter.addAction(ACTION_TURN_ON_SCREEN); - mContext.registerReceiver(new BroadcastReceiver() { + mBroadcastDispatcher.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 8a99e451934e..ab7eec52a959 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -67,6 +67,8 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.systemui.RegionInterceptingFrameLayout.RegionInterceptableView; +import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.plugins.qs.QS; @@ -103,6 +105,9 @@ public class ScreenDecorations extends SystemUI implements Tunable { private final Lazy<StatusBar> mStatusBarLazy; private DisplayManager mDisplayManager; + private final BroadcastDispatcher mBroadcastDispatcher; + private final Handler mMainHandler; + private final TunerService mTunerService; private DisplayManager.DisplayListener mDisplayListener; @VisibleForTesting @@ -140,9 +145,16 @@ public class ScreenDecorations extends SystemUI implements Tunable { } @Inject - public ScreenDecorations(Context context, Lazy<StatusBar> statusBarLazy) { + public ScreenDecorations(Context context, + Lazy<StatusBar> statusBarLazy, + @MainHandler Handler handler, + BroadcastDispatcher broadcastDispatcher, + TunerService tunerService) { super(context); mStatusBarLazy = statusBarLazy; + mMainHandler = handler; + mBroadcastDispatcher = broadcastDispatcher; + mTunerService = tunerService; } @Override @@ -239,8 +251,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { mWindowManager.getDefaultDisplay().getMetrics(metrics); mDensity = metrics.density; - Dependency.get(Dependency.MAIN_HANDLER).post( - () -> Dependency.get(TunerService.class).addTunable(this, SIZE)); + mMainHandler.post(() -> mTunerService.addTunable(this, SIZE)); // Watch color inversion and invert the overlay as needed. mColorInversionSetting = new SecureSetting(mContext, mHandler, @@ -255,7 +266,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); - mContext.registerReceiver(mIntentReceiver, filter, null /* permission */, mHandler); + mBroadcastDispatcher.registerReceiver(mIntentReceiver, filter, mHandler); mOverlay.addOnLayoutChangeListener(new OnLayoutChangeListener() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java b/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java index 92fbd259b471..7a4ef2b7bbf2 100644 --- a/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java +++ b/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java @@ -28,19 +28,27 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.SliceBroadcastRelay; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; +import javax.inject.Singleton; /** * Allows settings to register certain broadcasts to launch the settings app for pinned slices. * @see SliceBroadcastRelay */ +@Singleton public class SliceBroadcastRelayHandler extends SystemUI { private static final String TAG = "SliceBroadcastRelay"; private static final boolean DEBUG = false; private final ArrayMap<Uri, BroadcastRelay> mRelays = new ArrayMap<>(); + private final BroadcastDispatcher mBroadcastDispatcher; - public SliceBroadcastRelayHandler(Context context) { + @Inject + public SliceBroadcastRelayHandler(Context context, BroadcastDispatcher broadcastDispatcher) { super(context); + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -48,9 +56,10 @@ public class SliceBroadcastRelayHandler extends SystemUI { if (DEBUG) Log.d(TAG, "Start"); IntentFilter filter = new IntentFilter(SliceBroadcastRelay.ACTION_REGISTER); filter.addAction(SliceBroadcastRelay.ACTION_UNREGISTER); - mContext.registerReceiver(mReceiver, filter); + mBroadcastDispatcher.registerReceiver(mReceiver, filter); } + // This does not use BroadcastDispatcher as the filter may have schemas or mime types. @VisibleForTesting void handleIntent(Intent intent) { if (SliceBroadcastRelay.ACTION_REGISTER.equals(intent.getAction())) { diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java index 3ff1b97c3753..9a277e8fa77c 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java @@ -34,6 +34,7 @@ import androidx.slice.Clock; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.model.SysUiState; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -161,6 +162,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { private final Lazy<SysUiState> mSysUiFlagContainer; private final Lazy<WakefulnessLifecycle> mWakefulnessLifecycle; private final Lazy<PackageManagerWrapper> mPackageManagerWrapper; + private final Lazy<BroadcastDispatcher> mBroadcastDispatcher; private boolean mOnLockscreen; private boolean mIsDozing; @@ -193,7 +195,8 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { Lazy<OverviewProxyService> overviewProxyService, Lazy<SysUiState> sysUiFlagContainer, Lazy<WakefulnessLifecycle> wakefulnessLifecycle, - Lazy<PackageManagerWrapper> packageManagerWrapper) { + Lazy<PackageManagerWrapper> packageManagerWrapper, + Lazy<BroadcastDispatcher> broadcastDispatcher) { mClock = clock; mHandler = handler; mPhenotypeHelper = phenotypeHelper; @@ -207,6 +210,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { for (String action : DEFAULT_HOME_CHANGE_ACTIONS) { mDefaultHomeIntentFilter.addAction(action); } + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -215,7 +219,8 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { mAssistHandleCallbacks = callbacks; mConsecutiveTaskSwitches = 0; mDefaultHome = getCurrentDefaultHome(); - context.registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter); + mBroadcastDispatcher.get() + .registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter); mOnLockscreen = onLockscreen(mStatusBarStateController.get().getState()); mIsDozing = mStatusBarStateController.get().isDozing(); mStatusBarStateController.get().addCallback(mStatusBarStateListener); diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index b7a6167df6bc..398826c552bd 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -45,6 +45,7 @@ import com.android.systemui.ConfigurationChangedReceiver; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.assist.ui.DefaultUiController; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -161,14 +162,15 @@ public class AssistManager implements ConfigurationChangedReceiver { Context context, AssistUtils assistUtils, AssistHandleBehaviorController handleController, - CommandQueue commandQueue) { + CommandQueue commandQueue, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mDeviceProvisionedController = controller; mCommandQueue = commandQueue; mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); mAssistUtils = assistUtils; mAssistDisclosure = new AssistDisclosure(context, new Handler()); - mPhoneStateMonitor = new PhoneStateMonitor(context); + mPhoneStateMonitor = new PhoneStateMonitor(context, broadcastDispatcher); mHandleController = handleController; registerVoiceInteractionSessionListener(); diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java index e73dc4a57bd7..95d611a605d2 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java @@ -29,6 +29,7 @@ import androidx.annotation.Nullable; import com.android.systemui.Dependency; import com.android.systemui.SysUiServiceProvider; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.PackageManagerWrapper; @@ -67,7 +68,7 @@ final class PhoneStateMonitor { private boolean mLauncherShowing; @Nullable private ComponentName mDefaultHome; - PhoneStateMonitor(Context context) { + PhoneStateMonitor(Context context, BroadcastDispatcher broadcastDispatcher) { mContext = context; mStatusBarStateController = Dependency.get(StatusBarStateController.class); @@ -77,7 +78,7 @@ final class PhoneStateMonitor { for (String action : DEFAULT_HOME_CHANGE_ACTIONS) { intentFilter.addAction(action); } - mContext.registerReceiver(new BroadcastReceiver() { + broadcastDispatcher.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { mDefaultHome = getCurrentDefaultHome(); diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt index ddda95ad8fda..24357a740331 100644 --- a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt +++ b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt @@ -31,6 +31,7 @@ import com.android.systemui.Dumpable import java.io.FileDescriptor import java.io.PrintWriter import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicInteger private const val MSG_REGISTER_RECEIVER = 0 private const val MSG_UNREGISTER_RECEIVER = 1 @@ -50,6 +51,13 @@ class UserBroadcastDispatcher( private val bgLooper: Looper ) : BroadcastReceiver(), Dumpable { + companion object { + // Used only for debugging. If not debugging, this variable will not be accessed and all + // received broadcasts will be tagged with 0. However, as DEBUG is false, nothing will be + // logged + val index = AtomicInteger(0) + } + private val bgHandler = object : Handler(bgLooper) { override fun handleMessage(msg: Message) { when (msg.what) { @@ -97,7 +105,10 @@ class UserBroadcastDispatcher( private val receiverToReceiverData = ArrayMap<BroadcastReceiver, MutableSet<ReceiverData>>() override fun onReceive(context: Context, intent: Intent) { - bgHandler.post(HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult)) + val id = if (DEBUG) index.getAndIncrement() else 0 + if (DEBUG) Log.w(TAG, "[$id] Received $intent") + bgHandler.post( + HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult, id)) } /** @@ -161,17 +172,19 @@ class UserBroadcastDispatcher( val actionsToReceivers: Map<String, Set<ReceiverData>>, val context: Context, val intent: Intent, - val pendingResult: PendingResult + val pendingResult: PendingResult, + val index: Int ) : Runnable { override fun run() { - if (DEBUG) Log.w(TAG, "Dispatching $intent") + if (DEBUG) Log.w(TAG, "[$index] Dispatching $intent") actionsToReceivers.get(intent.action) ?.filter { it.filter.hasAction(intent.action) && it.filter.matchCategories(intent.categories) == null } ?.forEach { it.handler.post { - if (DEBUG) Log.w(TAG, "Dispatching to ${it.receiver}") + if (DEBUG) Log.w(TAG, + "[$index] Dispatching ${intent.action} to ${it.receiver}") it.receiver.pendingResult = pendingResult it.receiver.onReceive(context, intent) } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java index 61ded138134c..4593164869fd 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java @@ -19,7 +19,11 @@ package com.android.systemui.dagger; import android.app.Activity; import com.android.systemui.ForegroundServicesDialog; +import com.android.systemui.keyguard.WorkLockActivity; +import com.android.systemui.settings.BrightnessDialog; import com.android.systemui.tuner.TunerActivity; +import com.android.systemui.usb.UsbDebuggingActivity; +import com.android.systemui.usb.UsbDebuggingSecondaryUserActivity; import dagger.Binds; import dagger.Module; @@ -42,4 +46,29 @@ public abstract class DefaultActivityBinder { @IntoMap @ClassKey(ForegroundServicesDialog.class) public abstract Activity bindForegroundServicesDialog(ForegroundServicesDialog activity); + + /** Inject into WorkLockActivity. */ + @Binds + @IntoMap + @ClassKey(WorkLockActivity.class) + public abstract Activity bindWorkLockActivity(WorkLockActivity activity); + + /** Inject into BrightnessDialog. */ + @Binds + @IntoMap + @ClassKey(BrightnessDialog.class) + public abstract Activity bindBrightnessDialog(BrightnessDialog activity); + + /** Inject into UsbDebuggingActivity. */ + @Binds + @IntoMap + @ClassKey(UsbDebuggingActivity.class) + public abstract Activity bindUsbDebuggingActivity(UsbDebuggingActivity activity); + + /** Inject into UsbDebuggingSecondaryUserActivity. */ + @Binds + @IntoMap + @ClassKey(UsbDebuggingSecondaryUserActivity.class) + public abstract Activity bindUsbDebuggingSecondaryUserActivity( + UsbDebuggingSecondaryUserActivity activity); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index 248bf62230dd..6d61b2fb9990 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -35,6 +35,7 @@ import android.view.LayoutInflater; import com.android.internal.logging.MetricsLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.widget.LockPatternUtils; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgHandler; import com.android.systemui.dagger.qualifiers.BgLooper; import com.android.systemui.dagger.qualifiers.MainHandler; @@ -226,8 +227,8 @@ public class DependencyProvider { @Singleton @Provides public DeviceProvisionedController provideDeviceProvisionedController(Context context, - @MainHandler Handler mainHandler) { - return new DeviceProvisionedControllerImpl(context, mainHandler); + @MainHandler Handler mainHandler, BroadcastDispatcher broadcastDispatcher) { + return new DeviceProvisionedControllerImpl(context, mainHandler, broadcastDispatcher); } /** */ diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java index 4a9301cf5cfc..3b0c9aebfe08 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java @@ -30,6 +30,7 @@ import com.android.systemui.ForegroundServiceController; import com.android.systemui.LatencyTester; import com.android.systemui.ScreenDecorations; import com.android.systemui.SizeCompatModeActivityController; +import com.android.systemui.SliceBroadcastRelayHandler; import com.android.systemui.SystemUI; import com.android.systemui.UiOffloadThread; import com.android.systemui.appops.AppOpsController; @@ -99,6 +100,7 @@ import com.android.systemui.statusbar.policy.RemoteInputUriController; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.tv.TvStatusBar; +import com.android.systemui.theme.ThemeOverlayController; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.util.leak.GarbageMonitor; import com.android.systemui.volume.VolumeUI; @@ -185,12 +187,24 @@ public abstract class SystemUIBinder { public abstract SystemUI bindsSizeCompatModeActivityController( SizeCompatModeActivityController sysui); + /** Inject into SliceBroadcastRelayHandler. */ + @Binds + @IntoMap + @ClassKey(SliceBroadcastRelayHandler.class) + public abstract SystemUI bindSliceBroadcastRelayHandler(SliceBroadcastRelayHandler sysui); + /** Inject into StatusBar. */ @Binds @IntoMap @ClassKey(StatusBar.class) public abstract SystemUI bindsStatusBar(StatusBar sysui); + /** Inject into ThemeOverlayController. */ + @Binds + @IntoMap + @ClassKey(ThemeOverlayController.class) + public abstract SystemUI bindThemeOverlayController(ThemeOverlayController sysui); + /** Inject into TvStatusBar. */ @Binds @IntoMap diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index 33f68cfc1492..eaa72dc4fb8c 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -29,6 +29,7 @@ import android.os.Handler; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; import com.android.systemui.SystemUIApplication; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.plugins.FalsingManager; @@ -58,6 +59,7 @@ public class DozeFactory { private final DelayedWakeLock.Builder mDelayedWakeLockBuilder; private final Handler mHandler; private final BiometricUnlockController mBiometricUnlockController; + private final BroadcastDispatcher mBroadcastDispatcher; @Inject public DozeFactory(FalsingManager falsingManager, DozeLog dozeLog, @@ -67,7 +69,8 @@ public class DozeFactory { DockManager dockManager, @Nullable IWallpaperManager wallpaperManager, ProximitySensor proximitySensor, DelayedWakeLock.Builder delayedWakeLockBuilder, Handler handler, - BiometricUnlockController biometricUnlockController) { + BiometricUnlockController biometricUnlockController, + BroadcastDispatcher broadcastDispatcher) { mFalsingManager = falsingManager; mDozeLog = dozeLog; mDozeParameters = dozeParameters; @@ -82,6 +85,7 @@ public class DozeFactory { mDelayedWakeLockBuilder = delayedWakeLockBuilder; mHandler = handler; mBiometricUnlockController = biometricUnlockController; + mBroadcastDispatcher = broadcastDispatcher; } /** Creates a DozeMachine with its parts for {@code dozeService}. */ @@ -123,8 +127,8 @@ public class DozeFactory { DozeParameters params, Handler handler) { Sensor sensor = DozeSensors.findSensorWithType(sensorManager, context.getString(R.string.doze_brightness_sensor_type)); - return new DozeScreenBrightness(context, service, sensorManager, sensor, host, handler, - params.getPolicy()); + return new DozeScreenBrightness(context, service, sensorManager, sensor, + mBroadcastDispatcher, host, handler, params.getPolicy()); } private DozeTriggers createDozeTriggers(Context context, AsyncSensorManager sensorManager, @@ -134,7 +138,7 @@ public class DozeFactory { boolean allowPulseTriggers = true; return new DozeTriggers(context, machine, host, alarmManager, config, params, sensorManager, handler, wakeLock, allowPulseTriggers, dockManager, - mProximitySensor, dozeLog); + mProximitySensor, dozeLog, mBroadcastDispatcher); } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java index bd6882c01bbd..39a256248aae 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java @@ -31,6 +31,7 @@ import android.os.UserHandle; import android.provider.Settings; import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; /** * Controls the screen brightness when dozing. @@ -49,6 +50,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi private final Handler mHandler; private final SensorManager mSensorManager; private final Sensor mLightSensor; + private final BroadcastDispatcher mBroadcastDispatcher; private final int[] mSensorToBrightness; private final int[] mSensorToScrimOpacity; private final boolean mDebuggable; @@ -69,13 +71,15 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi @VisibleForTesting public DozeScreenBrightness(Context context, DozeMachine.Service service, - SensorManager sensorManager, Sensor lightSensor, DozeHost host, + SensorManager sensorManager, Sensor lightSensor, + BroadcastDispatcher broadcastDispatcher, DozeHost host, Handler handler, int defaultDozeBrightness, int[] sensorToBrightness, int[] sensorToScrimOpacity, boolean debuggable) { mContext = context; mDozeService = service; mSensorManager = sensorManager; mLightSensor = lightSensor; + mBroadcastDispatcher = broadcastDispatcher; mDozeHost = host; mHandler = handler; mDebuggable = debuggable; @@ -87,14 +91,15 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi if (mDebuggable) { IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_AOD_BRIGHTNESS); - mContext.registerReceiverAsUser(this, UserHandle.ALL, filter, null, handler); + mBroadcastDispatcher.registerReceiver(this, filter, handler, UserHandle.ALL); } } public DozeScreenBrightness(Context context, DozeMachine.Service service, - SensorManager sensorManager, Sensor lightSensor, DozeHost host, - Handler handler, AlwaysOnDisplayPolicy policy) { - this(context, service, sensorManager, lightSensor, host, handler, + SensorManager sensorManager, Sensor lightSensor, + BroadcastDispatcher broadcastDispatcher, DozeHost host, Handler handler, + AlwaysOnDisplayPolicy policy) { + this(context, service, sensorManager, lightSensor, broadcastDispatcher, host, handler, context.getResources().getInteger( com.android.internal.R.integer.config_screenBrightnessDoze), policy.screenBrightnessArray, policy.dimmingScrimArray, DEBUG_AOD_BRIGHTNESS); @@ -127,7 +132,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi private void onDestroy() { setLightSensorEnabled(false); if (mDebuggable) { - mContext.unregisterReceiver(this); + mBroadcastDispatcher.unregisterReceiver(this); } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index b212884ebb98..1134268aa5c6 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -36,6 +36,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dock.DockManager; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.Assert; @@ -80,6 +81,7 @@ public class DozeTriggers implements DozeMachine.Part { private final DockEventListener mDockEventListener = new DockEventListener(); private final DockManager mDockManager; private final ProximitySensor.ProximityCheck mProxCheck; + private final BroadcastDispatcher mBroadcastDispatcher; private long mNotificationPulseTime; private boolean mPulsePending; @@ -91,7 +93,7 @@ public class DozeTriggers implements DozeMachine.Part { DozeParameters dozeParameters, AsyncSensorManager sensorManager, Handler handler, WakeLock wakeLock, boolean allowPulseTriggers, DockManager dockManager, ProximitySensor proximitySensor, - DozeLog dozeLog) { + DozeLog dozeLog, BroadcastDispatcher broadcastDispatcher) { mContext = context; mMachine = machine; mDozeHost = dozeHost; @@ -107,6 +109,7 @@ public class DozeTriggers implements DozeMachine.Part { mDockManager = dockManager; mProxCheck = new ProximitySensor.ProximityCheck(proximitySensor, handler); mDozeLog = dozeLog; + mBroadcastDispatcher = broadcastDispatcher; } private void onNotification(Runnable onPulseSuppressedListener) { @@ -299,7 +302,7 @@ public class DozeTriggers implements DozeMachine.Part { public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { switch (newState) { case INITIALIZED: - mBroadcastReceiver.register(mContext); + mBroadcastReceiver.register(mBroadcastDispatcher); mDozeHost.addCallback(mHostCallback); if (mDockManager != null) { mDockManager.addListener(mDockEventListener); @@ -334,7 +337,7 @@ public class DozeTriggers implements DozeMachine.Part { mDozeSensors.updateListening(); break; case FINISH: - mBroadcastReceiver.unregister(mContext); + mBroadcastReceiver.unregister(mBroadcastDispatcher); mDozeHost.removeCallback(mHostCallback); if (mDockManager != null) { mDockManager.removeListener(mDockEventListener); @@ -437,22 +440,22 @@ public class DozeTriggers implements DozeMachine.Part { } } - public void register(Context context) { + public void register(BroadcastDispatcher broadcastDispatcher) { if (mRegistered) { return; } IntentFilter filter = new IntentFilter(PULSE_ACTION); filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE); filter.addAction(Intent.ACTION_USER_SWITCHED); - context.registerReceiver(this, filter); + broadcastDispatcher.registerReceiver(this, filter); mRegistered = true; } - public void unregister(Context context) { + public void unregister(BroadcastDispatcher broadcastDispatcher) { if (!mRegistered) { return; } - context.unregisterReceiver(this); + broadcastDispatcher.unregisterReceiver(this); mRegistered = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 1bef56179479..bb2d142c11a1 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -146,6 +146,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final DevicePolicyManager mDevicePolicyManager; private final LockPatternUtils mLockPatternUtils; private final KeyguardManager mKeyguardManager; + private final BroadcastDispatcher mBroadcastDispatcher; private ArrayList<Action> mItems; private ActionsDialog mDialog; @@ -183,13 +184,14 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, Context.DEVICE_POLICY_SERVICE); mLockPatternUtils = new LockPatternUtils(mContext); mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); + mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class); // receive broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); - Dependency.get(BroadcastDispatcher.class).registerReceiver(mBroadcastReceiver, filter); + mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter); ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); @@ -901,7 +903,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mAdapter.notifyDataSetChanged(); if (mShowSilentToggle) { IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); - mContext.registerReceiver(mRingerModeReceiver, filter); + mBroadcastDispatcher.registerReceiver(mRingerModeReceiver, filter); } } @@ -919,7 +921,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mWindowManagerFuncs.onGlobalActionsHidden(); if (mShowSilentToggle) { try { - mContext.unregisterReceiver(mRingerModeReceiver); + mBroadcastDispatcher.unregisterReceiver(mRingerModeReceiver); } catch (IllegalArgumentException ie) { // ignore this Log.w(TAG, ie); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 411bf9a80dca..3b1edcca5b74 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -87,6 +87,7 @@ import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.SystemUIFactory; import com.android.systemui.UiOffloadThread; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.KeyguardBypassController; @@ -319,6 +320,7 @@ public class KeyguardViewMediator extends SystemUI { */ private boolean mWaitingUntilKeyguardVisible = false; private final LockPatternUtils mLockPatternUtils; + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mKeyguardDonePending = false; private boolean mHideAnimationRun = false; private boolean mHideAnimationRunning = false; @@ -685,8 +687,10 @@ public class KeyguardViewMediator extends SystemUI { public KeyguardViewMediator( Context context, FalsingManager falsingManager, - LockPatternUtils lockPatternUtils) { - this(context, falsingManager, lockPatternUtils, SystemUIFactory.getInstance()); + LockPatternUtils lockPatternUtils, + BroadcastDispatcher broadcastDispatcher) { + this(context, falsingManager, lockPatternUtils, broadcastDispatcher, + SystemUIFactory.getInstance()); } @VisibleForTesting @@ -694,10 +698,12 @@ public class KeyguardViewMediator extends SystemUI { Context context, FalsingManager falsingManager, LockPatternUtils lockPatternUtils, + BroadcastDispatcher broadcastDispatcher, SystemUIFactory systemUIFactory) { super(context); mFalsingManager = falsingManager; mLockPatternUtils = lockPatternUtils; + mBroadcastDispatcher = broadcastDispatcher; mStatusBarKeyguardViewManager = systemUIFactory.createStatusBarKeyguardViewManager( mContext, mViewMediatorCallback, @@ -722,7 +728,7 @@ public class KeyguardViewMediator extends SystemUI { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SHUTDOWN); - mContext.registerReceiver(mBroadcastReceiver, filter); + mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter); final IntentFilter delayedActionFilter = new IntentFilter(); delayedActionFilter.addAction(DELAYED_KEYGUARD_ACTION); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java index 4d061e18ebba..86c532cdb773 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java @@ -36,6 +36,9 @@ import android.view.View; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; /** * Bouncer between work activities and the activity used to confirm credentials before unlocking @@ -67,14 +70,21 @@ public class WorkLockActivity extends Activity { * @see KeyguardManager */ private KeyguardManager mKgm; + private final BroadcastDispatcher mBroadcastDispatcher; + + @Inject + public WorkLockActivity(BroadcastDispatcher broadcastDispatcher) { + super(); + mBroadcastDispatcher = broadcastDispatcher; + } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - registerReceiverAsUser(mLockEventReceiver, UserHandle.ALL, - new IntentFilter(Intent.ACTION_DEVICE_LOCKED_CHANGED), /* permission */ null, - /* scheduler */ null); + mBroadcastDispatcher.registerReceiver(mLockEventReceiver, + new IntentFilter(Intent.ACTION_DEVICE_LOCKED_CHANGED), null /* handler */, + UserHandle.ALL); // Once the receiver is registered, check whether anything happened between now and the time // when this activity was launched. If it did and the user is unlocked now, just quit. diff --git a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java index 05be4259dd3b..75e260e7fa70 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java @@ -19,10 +19,12 @@ package com.android.systemui.pip; import android.content.Context; import android.content.res.Configuration; +import com.android.systemui.broadcast.BroadcastDispatcher; + import java.io.PrintWriter; public interface BasePipManager { - void initialize(Context context); + void initialize(Context context, BroadcastDispatcher broadcastDispatcher); void showPictureInPictureMenu(); default void expandPip() {} default void hidePipMenu(Runnable onStartCallback, Runnable onEndCallback) {} diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java index feb5d1917384..583ce67e26d4 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java @@ -26,6 +26,7 @@ import android.os.UserHandle; import android.os.UserManager; import com.android.systemui.SystemUI; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.CommandQueue; import java.io.FileDescriptor; @@ -42,12 +43,15 @@ public class PipUI extends SystemUI implements CommandQueue.Callbacks { private final CommandQueue mCommandQueue; private BasePipManager mPipManager; + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mSupportsPip; @Inject - public PipUI(Context context, CommandQueue commandQueue) { + public PipUI(Context context, CommandQueue commandQueue, + BroadcastDispatcher broadcastDispatcher) { super(context); + mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; } @@ -68,7 +72,7 @@ public class PipUI extends SystemUI implements CommandQueue.Callbacks { mPipManager = pm.hasSystemFeature(FEATURE_LEANBACK_ONLY) ? com.android.systemui.pip.tv.PipManager.getInstance() : com.android.systemui.pip.phone.PipManager.getInstance(); - mPipManager.initialize(mContext); + mPipManager.initialize(mContext, mBroadcastDispatcher); mCommandQueue.addCallback(this); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java index 369073c6564d..c33b8d9fbd90 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java @@ -37,6 +37,7 @@ import android.view.IPinnedStackController; import com.android.systemui.Dependency; import com.android.systemui.UiOffloadThread; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.pip.BasePipManager; import com.android.systemui.pip.PipBoundsHandler; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -200,7 +201,7 @@ public class PipManager implements BasePipManager { /** * Initializes {@link PipManager}. */ - public void initialize(Context context) { + public void initialize(Context context, BroadcastDispatcher broadcastDispatcher) { mContext = context; mActivityManager = ActivityManager.getService(); mActivityTaskManager = ActivityTaskManager.getService(); @@ -214,7 +215,7 @@ public class PipManager implements BasePipManager { mPipBoundsHandler = new PipBoundsHandler(context); mInputConsumerController = InputConsumerController.getPipInputConsumer(); - mMediaController = new PipMediaController(context, mActivityManager); + mMediaController = new PipMediaController(context, mActivityManager, broadcastDispatcher); mMenuController = new PipMenuActivityController(context, mActivityManager, mMediaController, mInputConsumerController); mTouchHandler = new PipTouchHandler(context, mActivityManager, mActivityTaskManager, diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java index 174a7ef19cbd..e57b4166937f 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java @@ -37,6 +37,7 @@ import android.os.UserHandle; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.UserInfoController; import java.util.ArrayList; @@ -109,7 +110,8 @@ public class PipMediaController { private ArrayList<ActionListener> mListeners = new ArrayList<>(); - public PipMediaController(Context context, IActivityManager activityManager) { + public PipMediaController(Context context, IActivityManager activityManager, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mActivityManager = activityManager; IntentFilter mediaControlFilter = new IntentFilter(); @@ -117,7 +119,7 @@ public class PipMediaController { mediaControlFilter.addAction(ACTION_PAUSE); mediaControlFilter.addAction(ACTION_NEXT); mediaControlFilter.addAction(ACTION_PREV); - mContext.registerReceiver(mPlayPauseActionReceiver, mediaControlFilter); + broadcastDispatcher.registerReceiver(mPlayPauseActionReceiver, mediaControlFilter); createMediaActions(); mMediaSessionManager = diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java index 81d6973efb2a..195fca85a314 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java @@ -48,6 +48,7 @@ import android.view.DisplayInfo; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.UiOffloadThread; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.pip.BasePipManager; import com.android.systemui.pip.PipBoundsHandler; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -227,7 +228,7 @@ public class PipManager implements BasePipManager { /** * Initializes {@link PipManager}. */ - public void initialize(Context context) { + public void initialize(Context context, BroadcastDispatcher broadcastDispatcher) { if (mInitialized) { return; } @@ -238,8 +239,8 @@ public class PipManager implements BasePipManager { ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED); - mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, intentFilter, - null, null); + broadcastDispatcher.registerReceiver(mBroadcastReceiver, intentFilter, + null /* handler */, UserHandle.ALL); if (sSettingsPackageAndClassNamePairList == null) { String[] settings = mContext.getResources().getStringArray( @@ -286,7 +287,7 @@ public class PipManager implements BasePipManager { Log.e(TAG, "Failed to register pinned stack listener", e); } - mPipNotification = new PipNotification(context); + mPipNotification = new PipNotification(context, broadcastDispatcher); } private void loadConfigurationsAndApply(Configuration newConfig) { diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java index d50f294e4999..ca1513128e56 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java @@ -34,6 +34,7 @@ import android.util.Log; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.util.NotificationChannels; /** @@ -143,7 +144,7 @@ public class PipNotification { } }; - public PipNotification(Context context) { + public PipNotification(Context context, BroadcastDispatcher broadcastDispatcher) { mNotificationManager = (NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE); @@ -161,7 +162,7 @@ public class PipNotification { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ACTION_MENU); intentFilter.addAction(ACTION_CLOSE); - context.registerReceiver(mEventReceiver, intentFilter); + broadcastDispatcher.registerReceiver(mEventReceiver, intentFilter); onConfigurationChanged(context); } diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt index ca16e84fbe0d..d592492820c1 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt @@ -34,6 +34,7 @@ import com.android.systemui.Dumpable import com.android.systemui.R import com.android.systemui.appops.AppOpItem import com.android.systemui.appops.AppOpsController +import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dagger.qualifiers.BgHandler import com.android.systemui.dagger.qualifiers.MainHandler import java.io.FileDescriptor @@ -47,10 +48,11 @@ fun isPermissionsHubEnabled() = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_P @Singleton class PrivacyItemController @Inject constructor( - val context: Context, + private val context: Context, private val appOpsController: AppOpsController, @MainHandler private val uiHandler: Handler, - @BgHandler private val bgHandler: Handler + @BgHandler private val bgHandler: Handler, + private val broadcastDispatcher: BroadcastDispatcher ) : Dumpable { @VisibleForTesting @@ -138,15 +140,15 @@ class PrivacyItemController @Inject constructor( } private fun unregisterReceiver() { - context.unregisterReceiver(userSwitcherReceiver) + broadcastDispatcher.unregisterReceiver(userSwitcherReceiver) } private fun registerReceiver() { - context.registerReceiverAsUser(userSwitcherReceiver, UserHandle.ALL, IntentFilter().apply { + broadcastDispatcher.registerReceiver(userSwitcherReceiver, IntentFilter().apply { intents.forEach { addAction(it) } - }, null, null) + }, null /* handler */, UserHandle.ALL) } private fun update(updateUsers: Boolean) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 39f08650bf2c..cac90257cd43 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -50,6 +50,7 @@ import com.android.systemui.Dependency; import com.android.systemui.DumpController; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTileView; @@ -125,12 +126,13 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } public QSPanel(Context context, AttributeSet attrs, DumpController dumpController) { - this(context, attrs, dumpController, null); + this(context, attrs, dumpController, null, Dependency.get(BroadcastDispatcher.class)); } @Inject public QSPanel(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - DumpController dumpController, PluginManager pluginManager) { + DumpController dumpController, PluginManager pluginManager, + BroadcastDispatcher broadcastDispatcher) { super(context, attrs); mContext = context; @@ -177,7 +179,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne updateResources(); mBrightnessController = new BrightnessController(getContext(), - findViewById(R.id.brightness_slider)); + findViewById(R.id.brightness_slider), broadcastDispatcher); mDumpController = dumpController; mPluginManager = pluginManager; if (mPluginManager != null && Settings.System.getInt( diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index b395c3c336d3..6d434b19d3a3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -34,6 +34,7 @@ import com.android.systemui.DumpController; import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.SysUiServiceProvider; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgLooper; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.plugins.PluginListener; @@ -80,6 +81,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D private final TunerService mTunerService; private final PluginManager mPluginManager; private final DumpController mDumpController; + private final BroadcastDispatcher mBroadcastDispatcher; private final List<Callback> mCallbacks = new ArrayList<>(); private AutoTileManager mAutoTiles; @@ -99,14 +101,16 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D PluginManager pluginManager, TunerService tunerService, Provider<AutoTileManager> autoTiles, - DumpController dumpController) { + DumpController dumpController, + BroadcastDispatcher broadcastDispatcher) { mIconController = iconController; mContext = context; mTunerService = tunerService; mPluginManager = pluginManager; mDumpController = dumpController; + mBroadcastDispatcher = broadcastDispatcher; - mServices = new TileServices(this, bgLooper); + mServices = new TileServices(this, bgLooper, mBroadcastDispatcher); defaultFactory.setHost(this); mQsFactories.add(defaultFactory); @@ -334,7 +338,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D Intent intent = new Intent().setComponent(component); TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(), mContext, mServices, new Tile(), intent, - new UserHandle(ActivityManager.getCurrentUser())); + new UserHandle(ActivityManager.getCurrentUser()), + mBroadcastDispatcher); lifecycleManager.onStopListening(); lifecycleManager.onTileRemoved(); TileLifecycleManager.setTileAdded(mContext, component, false); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 24ac27e2e77b..19af235b4f68 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -61,6 +61,7 @@ import com.android.settingslib.Utils; import com.android.systemui.BatteryMeterView; import com.android.systemui.DualToneHandler; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; @@ -150,6 +151,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements private boolean mPermissionsHubEnabled; private PrivacyItemController mPrivacyItemController; + private BroadcastDispatcher mBroadcastDispatcher; private final BroadcastReceiver mRingerReceiver = new BroadcastReceiver() { @Override @@ -189,7 +191,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements NextAlarmController nextAlarmController, ZenModeController zenModeController, StatusBarIconController statusBarIconController, ActivityStarter activityStarter, PrivacyItemController privacyItemController, - CommandQueue commandQueue) { + CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher) { super(context, attrs); mAlarmController = nextAlarmController; mZenController = zenModeController; @@ -198,6 +200,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mPrivacyItemController = privacyItemController; mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); + mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; } @@ -551,14 +554,14 @@ public class QuickStatusBarHeader extends RelativeLayout implements if (listening) { mZenController.addCallback(this); mAlarmController.addCallback(this); - mContext.registerReceiver(mRingerReceiver, + mBroadcastDispatcher.registerReceiver(mRingerReceiver, new IntentFilter(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)); mPrivacyItemController.addCallback(mPICCallback); } else { mZenController.removeCallback(this); mAlarmController.removeCallback(this); mPrivacyItemController.removeCallback(mPICCallback); - mContext.unregisterReceiver(mRingerReceiver); + mBroadcastDispatcher.unregisterReceiver(mRingerReceiver); mPrivacyChipLogged = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java index f59e0c2d9bc2..926141297add 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java @@ -38,6 +38,8 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; + import java.util.Objects; import java.util.Set; @@ -72,6 +74,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements private final UserHandle mUser; private final IBinder mToken = new Binder(); private final PackageManagerAdapter mPackageManagerAdapter; + private final BroadcastDispatcher mBroadcastDispatcher; private Set<Integer> mQueuedMessages = new ArraySet<>(); private QSTileServiceWrapper mWrapper; @@ -88,13 +91,15 @@ public class TileLifecycleManager extends BroadcastReceiver implements private boolean mIsBound; public TileLifecycleManager(Handler handler, Context context, IQSService service, Tile tile, - Intent intent, UserHandle user) { - this(handler, context, service, tile, intent, user, new PackageManagerAdapter(context)); + Intent intent, UserHandle user, BroadcastDispatcher broadcastDispatcher) { + this(handler, context, service, tile, intent, user, new PackageManagerAdapter(context), + broadcastDispatcher); } @VisibleForTesting TileLifecycleManager(Handler handler, Context context, IQSService service, Tile tile, - Intent intent, UserHandle user, PackageManagerAdapter packageManagerAdapter) { + Intent intent, UserHandle user, PackageManagerAdapter packageManagerAdapter, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mHandler = handler; mIntent = intent; @@ -102,6 +107,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements mIntent.putExtra(TileService.EXTRA_TOKEN, mToken); mUser = user; mPackageManagerAdapter = packageManagerAdapter; + mBroadcastDispatcher = broadcastDispatcher; if (DEBUG) Log.d(TAG, "Creating " + mIntent + " " + mUser); } @@ -306,13 +312,14 @@ public class TileLifecycleManager extends BroadcastReceiver implements filter.addDataScheme("package"); mContext.registerReceiverAsUser(this, mUser, filter, null, mHandler); filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED); - mContext.registerReceiverAsUser(this, mUser, filter, null, mHandler); + mBroadcastDispatcher.registerReceiver(this, filter, mHandler, mUser); mReceiverRegistered = true; } private void stopPackageListening() { if (DEBUG) Log.d(TAG, "stopPackageListening"); mContext.unregisterReceiver(this); + mBroadcastDispatcher.unregisterReceiver(this); mReceiverRegistered = false; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java index 0b4e6485551c..1902d655abc3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java @@ -34,6 +34,7 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener; import java.util.List; @@ -72,10 +73,10 @@ public class TileServiceManager { private boolean mStarted = false; TileServiceManager(TileServices tileServices, Handler handler, ComponentName component, - Tile tile) { + Tile tile, BroadcastDispatcher broadcastDispatcher) { this(tileServices, handler, new TileLifecycleManager(handler, tileServices.getContext(), tileServices, tile, new Intent().setComponent(component), - new UserHandle(ActivityManager.getCurrentUser()))); + new UserHandle(ActivityManager.getCurrentUser()), broadcastDispatcher)); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java index 13cfa78b7c1e..db7c6ad69d23 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java @@ -37,6 +37,7 @@ import android.util.Log; import com.android.internal.statusbar.StatusBarIcon; import com.android.systemui.Dependency; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.qs.QSTileHost; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -60,13 +61,15 @@ public class TileServices extends IQSService.Stub { private final Handler mHandler; private final Handler mMainHandler; private final QSTileHost mHost; + private final BroadcastDispatcher mBroadcastDispatcher; private int mMaxBound = DEFAULT_MAX_BOUND; - public TileServices(QSTileHost host, Looper looper) { + public TileServices(QSTileHost host, Looper looper, BroadcastDispatcher broadcastDispatcher) { mHost = host; mContext = mHost.getContext(); - mContext.registerReceiver(mRequestListeningReceiver, + mBroadcastDispatcher = broadcastDispatcher; + mBroadcastDispatcher.registerReceiver(mRequestListeningReceiver, new IntentFilter(TileService.ACTION_REQUEST_LISTENING)); mHandler = new Handler(looper); mMainHandler = new Handler(Looper.getMainLooper()); @@ -82,7 +85,8 @@ public class TileServices extends IQSService.Stub { public TileServiceManager getTileWrapper(CustomTile tile) { ComponentName component = tile.getComponent(); - TileServiceManager service = onCreateTileService(component, tile.getQsTile()); + TileServiceManager service = onCreateTileService(component, tile.getQsTile(), + mBroadcastDispatcher); synchronized (mServices) { mServices.put(tile, service); mTiles.put(component, tile); @@ -93,8 +97,10 @@ public class TileServices extends IQSService.Stub { return service; } - protected TileServiceManager onCreateTileService(ComponentName component, Tile tile) { - return new TileServiceManager(this, mHandler, component, tile); + protected TileServiceManager onCreateTileService(ComponentName component, Tile tile, + BroadcastDispatcher broadcastDispatcher) { + return new TileServiceManager(this, mHandler, component, tile, + broadcastDispatcher); } public void freeService(CustomTile tile, TileServiceManager service) { @@ -323,7 +329,7 @@ public class TileServices extends IQSService.Stub { public void destroy() { synchronized (mServices) { mServices.values().forEach(service -> service.handleDestroy()); - mContext.unregisterReceiver(mRequestListeningReceiver); + mBroadcastDispatcher.unregisterReceiver(mRequestListeningReceiver); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java index 19e20a93ce66..da74663191f2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java @@ -33,6 +33,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyProperties; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile.BooleanState; import com.android.systemui.qs.GlobalSetting; @@ -46,13 +47,16 @@ public class AirplaneModeTile extends QSTileImpl<BooleanState> { private final Icon mIcon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_airplane); private final GlobalSetting mSetting; private final ActivityStarter mActivityStarter; + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mListening; @Inject - public AirplaneModeTile(QSHost host, ActivityStarter activityStarter) { + public AirplaneModeTile(QSHost host, ActivityStarter activityStarter, + BroadcastDispatcher broadcastDispatcher) { super(host); mActivityStarter = activityStarter; + mBroadcastDispatcher = broadcastDispatcher; mSetting = new GlobalSetting(mContext, mHandler, Global.AIRPLANE_MODE_ON) { @Override @@ -133,9 +137,9 @@ public class AirplaneModeTile extends QSTileImpl<BooleanState> { if (listening) { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); - mContext.registerReceiver(mReceiver, filter); + mBroadcastDispatcher.registerReceiver(mReceiver, filter); } else { - mContext.unregisterReceiver(mReceiver); + mBroadcastDispatcher.unregisterReceiver(mReceiver); } mSetting.setListening(listening); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index 869fa6b18245..52d1a5b3b991 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -52,6 +52,7 @@ import com.android.settingslib.notification.EnableZenModeDialog; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.SysUIToast; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.QSTile.BooleanState; @@ -78,6 +79,7 @@ public class DndTile extends QSTileImpl<BooleanState> { private final ZenModeController mController; private final DndDetailAdapter mDetailAdapter; private final ActivityStarter mActivityStarter; + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mListening; private boolean mShowingDetail; @@ -85,12 +87,13 @@ public class DndTile extends QSTileImpl<BooleanState> { @Inject public DndTile(QSHost host, ZenModeController zenModeController, - ActivityStarter activityStarter) { + ActivityStarter activityStarter, BroadcastDispatcher broadcastDispatcher) { super(host); mController = zenModeController; mActivityStarter = activityStarter; mDetailAdapter = new DndDetailAdapter(); - mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE)); + mBroadcastDispatcher = broadcastDispatcher; + broadcastDispatcher.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE)); mReceiverRegistered = true; mController.observe(getLifecycle(), mZenCallback); } @@ -99,7 +102,7 @@ public class DndTile extends QSTileImpl<BooleanState> { protected void handleDestroy() { super.handleDestroy(); if (mReceiverRegistered) { - mContext.unregisterReceiver(mReceiver); + mBroadcastDispatcher.unregisterReceiver(mReceiver); mReceiverRegistered = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java index 476a239de721..8bbfd243bd42 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java @@ -29,6 +29,7 @@ import android.widget.Switch; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.qs.QSTile.BooleanState; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.tileimpl.QSTileImpl; @@ -39,12 +40,14 @@ import javax.inject.Inject; public class NfcTile extends QSTileImpl<BooleanState> { private NfcAdapter mAdapter; + private BroadcastDispatcher mBroadcastDispatcher; private boolean mListening; @Inject - public NfcTile(QSHost host) { + public NfcTile(QSHost host, BroadcastDispatcher broadcastDispatcher) { super(host); + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -56,10 +59,10 @@ public class NfcTile extends QSTileImpl<BooleanState> { public void handleSetListening(boolean listening) { mListening = listening; if (mListening) { - mContext.registerReceiver(mNfcReceiver, + mBroadcastDispatcher.registerReceiver(mNfcReceiver, new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)); } else { - mContext.unregisterReceiver(mNfcReceiver); + mBroadcastDispatcher.unregisterReceiver(mNfcReceiver); } } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 6d7acd9727cd..264d644f9057 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -17,8 +17,10 @@ package com.android.systemui.screenshot; import static android.content.Context.NOTIFICATION_SERVICE; +import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_CORNER_FLOW; import static com.android.systemui.screenshot.GlobalScreenshot.EXTRA_ACTION_INTENT; import static com.android.systemui.screenshot.GlobalScreenshot.EXTRA_CANCEL_NOTIFICATION; import static com.android.systemui.screenshot.GlobalScreenshot.EXTRA_DISALLOW_ENTER_PIP; @@ -29,6 +31,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; +import android.annotation.Nullable; import android.app.ActivityOptions; import android.app.Notification; import android.app.Notification.BigPictureStyle; @@ -59,12 +62,17 @@ import android.media.MediaActionSound; import android.net.Uri; import android.os.AsyncTask; import android.os.Environment; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; import android.os.PowerManager; import android.os.Process; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.MediaStore; import android.text.TextUtils; import android.util.DisplayMetrics; +import android.util.Log; import android.util.Slog; import android.view.Display; import android.view.LayoutInflater; @@ -96,6 +104,7 @@ import java.util.Date; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.function.Function; import javax.inject.Inject; import javax.inject.Singleton; @@ -109,6 +118,7 @@ class SaveImageInBackgroundData { Bitmap image; Uri imageUri; Runnable finisher; + Function<PendingIntent, Void> onEditReady; int iconSize; int previewWidth; int previewheight; @@ -343,6 +353,9 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { R.drawable.ic_screenshot_edit, r.getString(com.android.internal.R.string.screenshot_edit), editAction); mNotificationBuilder.addAction(editActionBuilder.build()); + if (editAction != null && mParams.onEditReady != null) { + mParams.onEditReady.apply(editAction); + } // Create a delete action for the notification PendingIntent deleteAction = PendingIntent.getBroadcast(context, requestCode, @@ -380,40 +393,46 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { GlobalScreenshot.notifyScreenshotError(mParams.context, mNotificationManager, mParams.errorMsgResId); } else { - // Show the final notification to indicate screenshot saved - Context context = mParams.context; - Resources r = context.getResources(); - - // Create the intent to show the screenshot in gallery - Intent launchIntent = new Intent(Intent.ACTION_VIEW); - launchIntent.setDataAndType(mParams.imageUri, "image/png"); - launchIntent.setFlags( - Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION); - - final long now = System.currentTimeMillis(); - - // Update the text and the icon for the existing notification - mPublicNotificationBuilder + if (mParams.onEditReady != null) { + // Cancel the "saving screenshot" notification + mNotificationManager.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT); + } else { + // Show the final notification to indicate screenshot saved + Context context = mParams.context; + Resources r = context.getResources(); + + // Create the intent to show the screenshot in gallery + Intent launchIntent = new Intent(Intent.ACTION_VIEW); + launchIntent.setDataAndType(mParams.imageUri, "image/png"); + launchIntent.setFlags( + Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION); + + final long now = System.currentTimeMillis(); + + // Update the text and the icon for the existing notification + mPublicNotificationBuilder + .setContentTitle(r.getString(R.string.screenshot_saved_title)) + .setContentText(r.getString(R.string.screenshot_saved_text)) + .setContentIntent( + PendingIntent.getActivity(mParams.context, 0, launchIntent, 0)) + .setWhen(now) + .setAutoCancel(true) + .setColor(context.getColor( + com.android.internal.R.color.system_notification_accent_color)); + mNotificationBuilder .setContentTitle(r.getString(R.string.screenshot_saved_title)) .setContentText(r.getString(R.string.screenshot_saved_text)) .setContentIntent(PendingIntent.getActivity(mParams.context, 0, launchIntent, 0)) .setWhen(now) .setAutoCancel(true) .setColor(context.getColor( - com.android.internal.R.color.system_notification_accent_color)); - mNotificationBuilder - .setContentTitle(r.getString(R.string.screenshot_saved_title)) - .setContentText(r.getString(R.string.screenshot_saved_text)) - .setContentIntent(PendingIntent.getActivity(mParams.context, 0, launchIntent, 0)) - .setWhen(now) - .setAutoCancel(true) - .setColor(context.getColor( - com.android.internal.R.color.system_notification_accent_color)) - .setPublicVersion(mPublicNotificationBuilder.build()) - .setFlag(Notification.FLAG_NO_CLEAR, false); - - mNotificationManager.notify(SystemMessage.NOTE_GLOBAL_SCREENSHOT, - mNotificationBuilder.build()); + com.android.internal.R.color.system_notification_accent_color)) + .setPublicVersion(mPublicNotificationBuilder.build()) + .setFlag(Notification.FLAG_NO_CLEAR, false); + + mNotificationManager.notify(SystemMessage.NOTE_GLOBAL_SCREENSHOT, + mNotificationBuilder.build()); + } } mParams.finisher.run(); mParams.clearContext(); @@ -473,8 +492,12 @@ public class GlobalScreenshot { private static final float SCREENSHOT_SCALE = 1f; private static final float SCREENSHOT_DROP_IN_MIN_SCALE = SCREENSHOT_SCALE * 0.725f; private static final float SCREENSHOT_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.45f; + private static final float SCREENSHOT_CORNER_MIN_SCALE = SCREENSHOT_SCALE * 0.2f; private static final float SCREENSHOT_FAST_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.6f; private static final float SCREENSHOT_DROP_OUT_MIN_SCALE_OFFSET = 0f; + private static final float SCREENSHOT_CORNER_MIN_SCALE_OFFSET = .1f; + private static final long SCREENSHOT_CORNER_TIMEOUT_MILLIS = 8000; + private static final int MESSAGE_CORNER_TIMEOUT = 2; private final int mPreviewWidth; private final int mPreviewHeight; @@ -502,6 +525,19 @@ public class GlobalScreenshot { private MediaActionSound mCameraSound; + private final Handler mScreenshotHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MESSAGE_CORNER_TIMEOUT: + GlobalScreenshot.this.clearScreenshot(); + break; + default: + break; + } + } + }; + /** * @param context everything needs a context :( @@ -574,12 +610,14 @@ public class GlobalScreenshot { /** * Creates a new worker thread and saves the screenshot to the media store. */ - private void saveScreenshotInWorkerThread(Runnable finisher) { + private void saveScreenshotInWorkerThread( + Runnable finisher, @Nullable Function<PendingIntent, Void> onEditReady) { SaveImageInBackgroundData data = new SaveImageInBackgroundData(); data.context = mContext; data.image = mScreenBitmap; data.iconSize = mNotificationIconSize; data.finisher = finisher; + data.onEditReady = onEditReady; data.previewWidth = mPreviewWidth; data.previewheight = mPreviewHeight; if (mSaveInBgTask != null) { @@ -589,6 +627,10 @@ public class GlobalScreenshot { .execute(); } + private void saveScreenshotInWorkerThread(Runnable finisher) { + saveScreenshotInWorkerThread(finisher, null); + } + /** * Takes a screenshot of the current display and shows an animation. */ @@ -683,6 +725,22 @@ public class GlobalScreenshot { } /** + * Clears current screenshot + */ + private void clearScreenshot() { + if (mScreenshotLayout.isAttachedToWindow()) { + mWindowManager.removeView(mScreenshotLayout); + } + + // Clear any references to the bitmap + mScreenBitmap = null; + mScreenshotView.setImageBitmap(null); + mBackgroundView.setVisibility(View.GONE); + mScreenshotView.setVisibility(View.GONE); + mScreenshotView.setLayerType(View.LAYER_TYPE_NONE, null); + } + + /** * Starts the animation after taking the screenshot */ private void startAnimation(final Runnable finisher, int w, int h, boolean statusBarVisible, @@ -706,34 +764,55 @@ public class GlobalScreenshot { mScreenshotAnimation.removeAllListeners(); } + boolean useCornerFlow = + DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, SCREENSHOT_CORNER_FLOW, false); mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams); ValueAnimator screenshotDropInAnim = createScreenshotDropInAnimation(); - ValueAnimator screenshotFadeOutAnim = createScreenshotDropOutAnimation(w, h, - statusBarVisible, navBarVisible); + ValueAnimator screenshotFadeOutAnim = useCornerFlow + ? createScreenshotToCornerAnimation(w, h) + : createScreenshotDropOutAnimation(w, h, statusBarVisible, navBarVisible); mScreenshotAnimation = new AnimatorSet(); mScreenshotAnimation.playSequentially(screenshotDropInAnim, screenshotFadeOutAnim); mScreenshotAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { // Save the screenshot once we have a bit of time now - saveScreenshotInWorkerThread(finisher); - mWindowManager.removeView(mScreenshotLayout); - - // Clear any references to the bitmap - mScreenBitmap = null; - mScreenshotView.setImageBitmap(null); + if (!useCornerFlow) { + saveScreenshotInWorkerThread(finisher); + clearScreenshot(); + } else { + mScreenshotView.requestFocus(); + mScreenshotView.setOnClickListener((v) -> { + // TODO: remove once we have a better UI to show that we aren't ready yet + Toast notReadyToast = Toast.makeText( + mContext, "Screenshot is not ready yet", Toast.LENGTH_SHORT); + notReadyToast.show(); + }); + saveScreenshotInWorkerThread(finisher, intent -> { + mScreenshotHandler.post(() -> mScreenshotView.setOnClickListener(v -> { + try { + intent.send(); + clearScreenshot(); + } catch (PendingIntent.CanceledException e) { + Log.e(TAG, "Edit intent cancelled", e); + } + mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT); + })); + return null; + }); + mScreenshotHandler.sendMessageDelayed( + mScreenshotHandler.obtainMessage(MESSAGE_CORNER_TIMEOUT), + SCREENSHOT_CORNER_TIMEOUT_MILLIS); + } } }); - mScreenshotLayout.post(new Runnable() { - @Override - public void run() { - // Play the shutter sound to notify that we've taken a screenshot - mCameraSound.play(MediaActionSound.SHUTTER_CLICK); + mScreenshotHandler.post(() -> { + // Play the shutter sound to notify that we've taken a screenshot + mCameraSound.play(MediaActionSound.SHUTTER_CLICK); - mScreenshotView.setLayerType(View.LAYER_TYPE_HARDWARE, null); - mScreenshotView.buildLayer(); - mScreenshotAnimation.start(); - } + mScreenshotView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + mScreenshotView.buildLayer(); + mScreenshotAnimation.start(); }); } private ValueAnimator createScreenshotDropInAnimation() { @@ -878,6 +957,47 @@ public class GlobalScreenshot { return anim; } + private ValueAnimator createScreenshotToCornerAnimation(int w, int h) { + ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); + anim.setStartDelay(SCREENSHOT_DROP_OUT_DELAY); + + final float scaleDurationPct = + (float) SCREENSHOT_DROP_OUT_SCALE_DURATION / SCREENSHOT_DROP_OUT_DURATION; + final Interpolator scaleInterpolator = new Interpolator() { + @Override + public float getInterpolation(float x) { + if (x < scaleDurationPct) { + // Decelerate, and scale the input accordingly + return (float) (1f - Math.pow(1f - (x / scaleDurationPct), 2f)); + } + return 1f; + } + }; + + // Determine the bounds of how to scale + float halfScreenWidth = (w - 2f * mBgPadding) / 2f; + float halfScreenHeight = (h - 2f * mBgPadding) / 2f; + final float offsetPct = SCREENSHOT_CORNER_MIN_SCALE_OFFSET; + final PointF finalPos = new PointF( + -halfScreenWidth + (SCREENSHOT_CORNER_MIN_SCALE + offsetPct) * halfScreenWidth, + halfScreenHeight - (SCREENSHOT_CORNER_MIN_SCALE + offsetPct) * halfScreenHeight); + + // Animate the screenshot to the bottom left corner + anim.setDuration(SCREENSHOT_DROP_OUT_DURATION); + anim.addUpdateListener(animation -> { + float t = (Float) animation.getAnimatedValue(); + float scaleT = (SCREENSHOT_DROP_IN_MIN_SCALE + mBgPaddingScale) + - scaleInterpolator.getInterpolation(t) + * (SCREENSHOT_DROP_IN_MIN_SCALE - SCREENSHOT_CORNER_MIN_SCALE); + mBackgroundView.setAlpha((1f - t) * BACKGROUND_ALPHA); + mScreenshotView.setScaleX(scaleT); + mScreenshotView.setScaleY(scaleT); + mScreenshotView.setTranslationX(t * finalPos.x); + mScreenshotView.setTranslationY(t * finalPos.y); + }); + return anim; + } + static void notifyScreenshotError(Context context, NotificationManager nManager, int msgResId) { Resources r = context.getResources(); String errorMsg = r.getString(msgResId); diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java index 176676fcb9b3..b1f1f3844cac 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java @@ -44,6 +44,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.systemui.Dependency; +import com.android.systemui.broadcast.BroadcastDispatcher; import java.util.ArrayList; @@ -281,12 +282,13 @@ public class BrightnessController implements ToggleSlider.Listener { } }; - public BrightnessController(Context context, ToggleSlider control) { + public BrightnessController(Context context, ToggleSlider control, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mControl = control; mControl.setMax(GAMMA_SPACE_MAX); mBackgroundHandler = new Handler((Looper) Dependency.get(Dependency.BG_LOOPER)); - mUserTracker = new CurrentUserTracker(mContext) { + mUserTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mBackgroundHandler.post(mUpdateModeRunnable); diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java index d8b4df5e94d8..70c2531ca6d4 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java +++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java @@ -28,11 +28,21 @@ import android.view.WindowManager; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; /** A dialog that provides controls for adjusting the screen brightness. */ public class BrightnessDialog extends Activity { private BrightnessController mBrightnessController; + private final BroadcastDispatcher mBroadcastDispatcher; + + @Inject + public BrightnessDialog(BroadcastDispatcher broadcastDispatcher) { + mBroadcastDispatcher = broadcastDispatcher; + } + @Override protected void onCreate(Bundle savedInstanceState) { @@ -49,7 +59,7 @@ public class BrightnessDialog extends Activity { setContentView(v); final ToggleSliderView slider = findViewById(R.id.brightness_slider); - mBrightnessController = new BrightnessController(this, slider); + mBrightnessController = new BrightnessController(this, slider, mBroadcastDispatcher); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java index 3cf08b4b866e..3cdc01d95f58 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java +++ b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java @@ -16,11 +16,11 @@ package com.android.systemui.settings; -import android.content.Context; - import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import com.android.systemui.broadcast.BroadcastDispatcher; + /** * A class that has an observable for the current user. */ @@ -42,8 +42,8 @@ public class CurrentUserObservable { } }; - public CurrentUserObservable(Context context) { - mTracker = new CurrentUserTracker(context) { + public CurrentUserObservable(BroadcastDispatcher broadcastDispatcher) { + mTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mCurrentUser.setValue(newUserId); diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java index 0b89dc1070e1..9f79785be56e 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java +++ b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java @@ -23,6 +23,7 @@ import android.content.Intent; import android.content.IntentFilter; import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; import java.util.ArrayList; import java.util.List; @@ -33,8 +34,8 @@ public abstract class CurrentUserTracker { private Consumer<Integer> mCallback = this::onUserSwitched; - public CurrentUserTracker(Context context) { - this(UserReceiver.getInstance(context)); + public CurrentUserTracker(BroadcastDispatcher broadcastDispatcher) { + this(UserReceiver.getInstance(broadcastDispatcher)); } @VisibleForTesting @@ -60,20 +61,20 @@ public abstract class CurrentUserTracker { static class UserReceiver extends BroadcastReceiver { private static UserReceiver sInstance; - private Context mAppContext; private boolean mReceiverRegistered; private int mCurrentUserId; + private final BroadcastDispatcher mBroadcastDispatcher; private List<Consumer<Integer>> mCallbacks = new ArrayList<>(); @VisibleForTesting - UserReceiver(Context context) { - mAppContext = context.getApplicationContext(); + UserReceiver(BroadcastDispatcher broadcastDispatcher) { + mBroadcastDispatcher = broadcastDispatcher; } - static UserReceiver getInstance(Context context) { + static UserReceiver getInstance(BroadcastDispatcher broadcastDispatcher) { if (sInstance == null) { - sInstance = new UserReceiver(context); + sInstance = new UserReceiver(broadcastDispatcher); } return sInstance; } @@ -96,7 +97,7 @@ public abstract class CurrentUserTracker { if (!mReceiverRegistered) { mCurrentUserId = ActivityManager.getCurrentUser(); IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED); - mAppContext.registerReceiver(this, filter); + mBroadcastDispatcher.registerReceiver(this, filter); mReceiverRegistered = true; } } @@ -105,7 +106,7 @@ public abstract class CurrentUserTracker { if (mCallbacks.contains(callback)) { mCallbacks.remove(callback); if (mCallbacks.size() == 0 && mReceiverRegistered) { - mAppContext.unregisterReceiver(this); + mBroadcastDispatcher.unregisterReceiver(this); mReceiverRegistered = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 7adf7af89f0d..571d3d7a11be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -46,6 +46,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.recents.OverviewProxyService; @@ -90,6 +91,7 @@ public class NotificationLockscreenUserManagerImpl implements private final UserManager mUserManager; private final IStatusBarService mBarService; private final List<UserChangedListener> mListeners = new ArrayList<>(); + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mShowLockscreenNotifications; private boolean mAllowLockscreenRemoteInput; @@ -180,7 +182,8 @@ public class NotificationLockscreenUserManagerImpl implements } @Inject - public NotificationLockscreenUserManagerImpl(Context context) { + public NotificationLockscreenUserManagerImpl(Context context, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService( Context.DEVICE_POLICY_SERVICE); @@ -191,6 +194,7 @@ public class NotificationLockscreenUserManagerImpl implements Dependency.get(StatusBarStateController.class).addCallback(this); mLockPatternUtils = new LockPatternUtils(context); mKeyguardManager = context.getSystemService(KeyguardManager.class); + mBroadcastDispatcher = broadcastDispatcher; } public void setUpWithPresenter(NotificationPresenter presenter) { @@ -244,15 +248,15 @@ public class NotificationLockscreenUserManagerImpl implements UserHandle.USER_ALL); } - mContext.registerReceiverAsUser(mAllUsersReceiver, UserHandle.ALL, + mBroadcastDispatcher.registerReceiver(mAllUsersReceiver, new IntentFilter(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), - null, null); + null /* handler */, UserHandle.ALL); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_USER_ADDED); filter.addAction(Intent.ACTION_USER_UNLOCKED); - mContext.registerReceiver(mBaseBroadcastReceiver, filter); + mBroadcastDispatcher.registerReceiver(mBaseBroadcastReceiver, filter); IntentFilter internalFilter = new IntentFilter(); internalFilter.addAction(NOTIFICATION_UNLOCKED_BY_WORK_CHALLENGE_ACTION); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java index fbd8d8a76d26..07e9f944b802 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java @@ -24,6 +24,8 @@ import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManager; +import com.android.systemui.broadcast.BroadcastDispatcher; + import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -40,6 +42,7 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { private final Context mContext; private final UserManager mUserManager; + private final BroadcastDispatcher mBroadcastDispatcher; private final LinkedList<UserInfo> mProfiles; private boolean mListening; private int mCurrentUser; @@ -47,9 +50,10 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { /** */ @Inject - public ManagedProfileControllerImpl(Context context) { + public ManagedProfileControllerImpl(Context context, BroadcastDispatcher broadcastDispatcher) { mContext = context; mUserManager = UserManager.get(mContext); + mBroadcastDispatcher = broadcastDispatcher; mProfiles = new LinkedList<UserInfo>(); } @@ -129,9 +133,10 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED); filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); - mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null); + mBroadcastDispatcher.registerReceiver( + mReceiver, filter, null /* handler */, UserHandle.ALL); } else { - mContext.unregisterReceiver(mReceiver); + mBroadcastDispatcher.unregisterReceiver(mReceiver); } } 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 0645423f531b..01cd2b49d059 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -41,6 +41,7 @@ import com.android.internal.telephony.TelephonyIntents; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.UiOffloadThread; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.privacy.PrivacyItem; import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.privacy.PrivacyItemControllerKt; @@ -138,7 +139,7 @@ public class PhoneStatusBarPolicy private AlarmManager.AlarmClockInfo mNextAlarm; public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController, - CommandQueue commandQueue) { + CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher) { mContext = context; mIconController = iconController; mCast = Dependency.get(CastController.class); @@ -184,7 +185,7 @@ public class PhoneStatusBarPolicy filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED); - mContext.registerReceiver(mIntentReceiver, filter, null, mHandler); + broadcastDispatcher.registerReceiver(mIntentReceiver, filter, mHandler); // listen for user / profile change. try { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 51a51a5d406f..4148a73e579c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -850,8 +850,8 @@ public class StatusBar extends SystemUI implements DemoMode, if (mWallpaperSupported) { // Make sure we always have the most current wallpaper info. IntentFilter wallpaperChangedFilter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED); - mContext.registerReceiverAsUser(mWallpaperChangedReceiver, UserHandle.ALL, - wallpaperChangedFilter, null /* broadcastPermission */, null /* scheduler */); + mBroadcastDispatcher.registerReceiver(mWallpaperChangedReceiver, wallpaperChangedFilter, + null /* handler */, UserHandle.ALL); mWallpaperChangedReceiver.onReceive(mContext, null); } else if (DEBUG) { Log.v(TAG, "start(): no wallpaper service "); @@ -915,7 +915,8 @@ public class StatusBar extends SystemUI implements DemoMode, // end old BaseStatusBar.start(). // Lastly, call to the icon policy to install/update all the icons. - mIconPolicy = new PhoneStatusBarPolicy(mContext, mIconController, mCommandQueue); + mIconPolicy = new PhoneStatusBarPolicy(mContext, mIconController, mCommandQueue, + mBroadcastDispatcher); mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconController); mKeyguardStateController.addCallback(this); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java index 3fc9b44f3850..f0f94201f3af 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -34,6 +34,7 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.settingslib.fuelgauge.Estimate; import com.android.settingslib.utils.PowerUtil; import com.android.systemui.Dependency; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.power.EnhancedEstimates; import java.io.FileDescriptor; @@ -58,6 +59,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC private static final int UPDATE_GRANULARITY_MSEC = 1000 * 60; private final EnhancedEstimates mEstimates; + private final BroadcastDispatcher mBroadcastDispatcher; private final ArrayList<BatteryController.BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>(); private final ArrayList<EstimateFetchCompletion> mFetchCallbacks = new ArrayList<>(); private final PowerManager mPowerManager; @@ -76,17 +78,20 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC private boolean mFetchingEstimate = false; @Inject - public BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates) { - this(context, enhancedEstimates, context.getSystemService(PowerManager.class)); + public BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates, + BroadcastDispatcher broadcastDispatcher) { + this(context, enhancedEstimates, context.getSystemService(PowerManager.class), + broadcastDispatcher); } @VisibleForTesting BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates, - PowerManager powerManager) { + PowerManager powerManager, BroadcastDispatcher broadcastDispatcher) { mContext = context; mHandler = new Handler(); mPowerManager = powerManager; mEstimates = enhancedEstimates; + mBroadcastDispatcher = broadcastDispatcher; registerReceiver(); updatePowerSave(); @@ -99,7 +104,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED); filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING); filter.addAction(ACTION_LEVEL_TEST); - mContext.registerReceiver(this, filter); + mBroadcastDispatcher.registerReceiver(this, filter); } @Override @@ -306,7 +311,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC public void dispatchDemoCommand(String command, Bundle args) { if (!mDemoMode && command.equals(COMMAND_ENTER)) { mDemoMode = true; - mContext.unregisterReceiver(this); + mBroadcastDispatcher.unregisterReceiver(this); } else if (mDemoMode && command.equals(COMMAND_EXIT)) { mDemoMode = false; registerReceiver(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java index 568f5906c11c..dba3b923db4f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java @@ -16,8 +16,6 @@ package com.android.systemui.statusbar.policy; -import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; - import android.app.StatusBarManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -62,9 +60,6 @@ import java.util.Calendar; import java.util.Locale; import java.util.TimeZone; -import javax.inject.Inject; -import javax.inject.Named; - /** * Digital clock for the status bar. */ @@ -116,19 +111,12 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C private final BroadcastDispatcher mBroadcastDispatcher; public Clock(Context context, AttributeSet attrs) { - this(context, attrs, null, Dependency.get(CommandQueue.class)); - } - - @Inject - public Clock(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue) { - this(context, attrs, 0, broadcastDispatcher, commandQueue); + this(context, attrs, 0); } - public Clock(Context context, AttributeSet attrs, int defStyle, - BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue) { + public Clock(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - mCommandQueue = commandQueue; + mCommandQueue = Dependency.get(CommandQueue.class); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.Clock, @@ -140,13 +128,13 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C } finally { a.recycle(); } - mCurrentUserTracker = new CurrentUserTracker(context) { + mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class); + mCurrentUserTracker = new CurrentUserTracker(mBroadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mCurrentUserId = newUserId; } }; - mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -197,8 +185,8 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); filter.addAction(Intent.ACTION_USER_SWITCHED); - getContext().registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, filter, - null, Dependency.get(Dependency.TIME_TICK_HANDLER)); + mBroadcastDispatcher.registerReceiver(mIntentReceiver, filter, + Dependency.get(Dependency.TIME_TICK_HANDLER), UserHandle.ALL); Dependency.get(TunerService.class).addTunable(this, CLOCK_SECONDS, StatusBarIconController.ICON_BLACKLIST); mCommandQueue.addCallback(this); @@ -225,7 +213,7 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mAttached) { - getContext().unregisterReceiver(mIntentReceiver); + mBroadcastDispatcher.unregisterReceiver(mIntentReceiver); mAttached = false; Dependency.get(TunerService.class).removeTunable(this); mCommandQueue.removeCallback(this); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java index 74a30fa8094f..d48876778590 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java @@ -29,6 +29,7 @@ import android.widget.TextView; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import java.util.Date; import java.util.Locale; @@ -41,6 +42,7 @@ public class DateView extends TextView { private DateFormat mDateFormat; private String mLastText; private String mDatePattern; + private final BroadcastDispatcher mBroadcastDispatcher; private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override @@ -75,6 +77,7 @@ public class DateView extends TextView { if (mDatePattern == null) { mDatePattern = getContext().getString(R.string.system_ui_date_pattern); } + mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class); } @Override @@ -86,7 +89,7 @@ public class DateView extends TextView { filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_LOCALE_CHANGED); - getContext().registerReceiver(mIntentReceiver, filter, null, + mBroadcastDispatcher.registerReceiver(mIntentReceiver, filter, Dependency.get(Dependency.TIME_TICK_HANDLER)); updateClock(); @@ -97,7 +100,7 @@ public class DateView extends TextView { super.onDetachedFromWindow(); mDateFormat = null; // reload the locale next time - getContext().unregisterReceiver(mIntentReceiver); + mBroadcastDispatcher.unregisterReceiver(mIntentReceiver); } protected void updateClock() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java index 0a40b3c4831c..b6ffd58be816 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java @@ -24,6 +24,7 @@ import android.provider.Settings.Global; import android.provider.Settings.Secure; import android.util.Log; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.settings.CurrentUserTracker; @@ -49,8 +50,9 @@ public class DeviceProvisionedControllerImpl extends CurrentUserTracker implemen /** */ @Inject - public DeviceProvisionedControllerImpl(Context context, @MainHandler Handler mainHandler) { - super(context); + public DeviceProvisionedControllerImpl(Context context, @MainHandler Handler mainHandler, + BroadcastDispatcher broadcastDispatcher) { + super(broadcastDispatcher); mContext = context; mContentResolver = context.getContentResolver(); mDeviceProvisionedUri = Global.getUriFor(Global.DEVICE_PROVISIONED); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java index 5a97eedd9b2c..3d51be7c02f4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java @@ -35,6 +35,7 @@ import android.provider.Settings; import androidx.annotation.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgLooper; import com.android.systemui.util.Utils; @@ -57,6 +58,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio private AppOpsManager mAppOpsManager; private StatusBarManager mStatusBarManager; + private BroadcastDispatcher mBroadcastDispatcher; private boolean mAreActiveLocationRequests; @@ -65,14 +67,16 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio private final H mHandler = new H(); @Inject - public LocationControllerImpl(Context context, @BgLooper Looper bgLooper) { + public LocationControllerImpl(Context context, @BgLooper Looper bgLooper, + BroadcastDispatcher broadcastDispatcher) { mContext = context; + mBroadcastDispatcher = broadcastDispatcher; // Register to listen for changes in location settings. IntentFilter filter = new IntentFilter(); filter.addAction(LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION); filter.addAction(LocationManager.MODE_CHANGED_ACTION); - context.registerReceiverAsUser(this, UserHandle.ALL, filter, null, new Handler(bgLooper)); + mBroadcastDispatcher.registerReceiver(this, filter, new Handler(bgLooper), UserHandle.ALL); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mStatusBarManager diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 60784c91ee62..e5898eded11e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -64,6 +64,7 @@ import com.android.systemui.ConfigurationChangedReceiver; import com.android.systemui.DemoMode; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgLooper; import com.android.systemui.settings.CurrentUserTracker; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; @@ -109,6 +110,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private final SubscriptionDefaults mSubDefaults; private final DataSaverController mDataSaverController; private final CurrentUserTracker mUserTracker; + private final BroadcastDispatcher mBroadcastDispatcher; private final Object mLock = new Object(); private Config mConfig; @@ -170,7 +172,8 @@ public class NetworkControllerImpl extends BroadcastReceiver */ @Inject public NetworkControllerImpl(Context context, @BgLooper Looper bgLooper, - DeviceProvisionedController deviceProvisionedController) { + DeviceProvisionedController deviceProvisionedController, + BroadcastDispatcher broadcastDispatcher) { this(context, (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE), (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE), (WifiManager) context.getSystemService(Context.WIFI_SERVICE), @@ -179,7 +182,8 @@ public class NetworkControllerImpl extends BroadcastReceiver new AccessPointControllerImpl(context), new DataUsageController(context), new SubscriptionDefaults(), - deviceProvisionedController); + deviceProvisionedController, + broadcastDispatcher); mReceiverHandler.post(mRegisterListeners); } @@ -191,12 +195,14 @@ public class NetworkControllerImpl extends BroadcastReceiver AccessPointControllerImpl accessPointController, DataUsageController dataUsageController, SubscriptionDefaults defaultsHandler, - DeviceProvisionedController deviceProvisionedController) { + DeviceProvisionedController deviceProvisionedController, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mConfig = config; mReceiverHandler = new Handler(bgLooper); mCallbackHandler = callbackHandler; mDataSaverController = new DataSaverControllerImpl(context); + mBroadcastDispatcher = broadcastDispatcher; mSubscriptionManager = subManager; mSubDefaults = defaultsHandler; @@ -229,7 +235,7 @@ public class NetworkControllerImpl extends BroadcastReceiver // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it updateAirplaneMode(true /* force callback */); - mUserTracker = new CurrentUserTracker(mContext) { + mUserTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { NetworkControllerImpl.this.onUserSwitched(newUserId); @@ -315,7 +321,7 @@ public class NetworkControllerImpl extends BroadcastReceiver filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); filter.addAction(Intent.ACTION_BOOT_COMPLETED); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); - mContext.registerReceiver(this, filter, null, mReceiverHandler); + mBroadcastDispatcher.registerReceiver(this, filter, mReceiverHandler); mListening = true; updateMobileControllers(); 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 0c68383649ab..c1614587ea35 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java @@ -48,6 +48,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgHandler; import com.android.systemui.settings.CurrentUserTracker; @@ -100,13 +101,14 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi /** */ @Inject - public SecurityControllerImpl(Context context, @BgHandler Handler bgHandler) { - this(context, bgHandler, null); + public SecurityControllerImpl(Context context, @BgHandler Handler bgHandler, + BroadcastDispatcher broadcastDispatcher) { + this(context, bgHandler, broadcastDispatcher, null); } public SecurityControllerImpl(Context context, Handler bgHandler, - SecurityControllerCallback callback) { - super(context); + BroadcastDispatcher broadcastDispatcher, SecurityControllerCallback callback) { + super(broadcastDispatcher); mContext = context; mBgHandler = bgHandler; mDevicePolicyManager = (DevicePolicyManager) @@ -124,8 +126,7 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi IntentFilter filter = new IntentFilter(); filter.addAction(KeyChain.ACTION_TRUST_STORE_CHANGED); filter.addAction(Intent.ACTION_USER_UNLOCKED); - context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, - bgHandler); + broadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, bgHandler, UserHandle.ALL); // TODO: re-register network callback on user change. mConnectivityManager.registerNetworkCallback(REQUEST, mNetworkCallback); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 2c996684f437..075c6d40ca31 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -59,6 +59,7 @@ import com.android.systemui.Prefs; import com.android.systemui.Prefs.Key; import com.android.systemui.R; import com.android.systemui.SystemUISecondaryUserService; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; @@ -96,6 +97,7 @@ public class UserSwitcherController implements Dumpable { private final KeyguardStateController mKeyguardStateController; protected final Handler mHandler; private final ActivityStarter mActivityStarter; + private final BroadcastDispatcher mBroadcastDispatcher; private ArrayList<UserRecord> mUsers = new ArrayList<>(); private Dialog mExitGuestDialog; @@ -111,10 +113,12 @@ public class UserSwitcherController implements Dumpable { @Inject public UserSwitcherController(Context context, KeyguardStateController keyguardStateController, - @MainHandler Handler handler, ActivityStarter activityStarter) { + @MainHandler Handler handler, ActivityStarter activityStarter, + BroadcastDispatcher broadcastDispatcher) { mContext = context; + mBroadcastDispatcher = broadcastDispatcher; if (!UserManager.isGuestUserEphemeral()) { - mGuestResumeSessionReceiver.register(context); + mGuestResumeSessionReceiver.register(mBroadcastDispatcher); } mKeyguardStateController = keyguardStateController; mHandler = handler; @@ -127,8 +131,8 @@ public class UserSwitcherController implements Dumpable { filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_USER_STOPPED); filter.addAction(Intent.ACTION_USER_UNLOCKED); - mContext.registerReceiverAsUser(mReceiver, UserHandle.SYSTEM, filter, - null /* permission */, null /* scheduler */); + mBroadcastDispatcher.registerReceiver( + mReceiver, filter, null /* handler */, UserHandle.SYSTEM); mSecondaryUserServiceIntent = new Intent(context, SystemUISecondaryUserService.class); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java index 1c7a1951b27d..a2028e6c0c33 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java @@ -39,6 +39,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dumpable; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.qs.GlobalSetting; import com.android.systemui.settings.CurrentUserTracker; @@ -77,8 +78,9 @@ public class ZenModeControllerImpl extends CurrentUserTracker private NotificationManager.Policy mConsolidatedNotificationPolicy; @Inject - public ZenModeControllerImpl(Context context, @MainHandler Handler handler) { - super(context); + public ZenModeControllerImpl(Context context, @MainHandler Handler handler, + BroadcastDispatcher broadcastDispatcher) { + super(broadcastDispatcher); mContext = context; mModeSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE) { @Override diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index 9a58a355c586..128bb213c9d1 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -36,6 +36,7 @@ import android.util.Log; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.SystemUI; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.google.android.collect.Sets; @@ -45,6 +46,9 @@ import org.json.JSONObject; import java.util.Map; import java.util.Set; +import javax.inject.Inject; +import javax.inject.Singleton; + /** * Controls the application of theme overlays across the system for all users. * This service is responsible for: @@ -54,15 +58,19 @@ import java.util.Set; * - Observing work profile changes and applying overlays from the primary user to their * associated work profiles */ +@Singleton public class ThemeOverlayController extends SystemUI { private static final String TAG = "ThemeOverlayController"; private static final boolean DEBUG = false; private ThemeOverlayManager mThemeManager; private UserManager mUserManager; + private BroadcastDispatcher mBroadcastDispatcher; - public ThemeOverlayController(Context context) { + @Inject + public ThemeOverlayController(Context context, BroadcastDispatcher broadcastDispatcher) { super(context); + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -78,13 +86,13 @@ public class ThemeOverlayController extends SystemUI { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED); - mContext.registerReceiverAsUser(new BroadcastReceiver() { + mBroadcastDispatcher.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) Log.d(TAG, "Updating overlays for user switch / profile added."); updateThemeOverlays(); } - }, UserHandle.ALL, filter, null, bgHandler); + }, filter, bgHandler, UserHandle.ALL); mContext.getContentResolver().registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), false, diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java index 2d6027cb324d..ce0032e619e7 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java @@ -34,6 +34,7 @@ import android.util.ArraySet; import com.android.internal.util.ArrayUtils; import com.android.systemui.DejankUtils; import com.android.systemui.DemoMode; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.qs.QSTileHost; import com.android.systemui.settings.CurrentUserTracker; @@ -82,7 +83,7 @@ public class TunerServiceImpl extends TunerService { */ @Inject public TunerServiceImpl(Context context, @MainHandler Handler mainHandler, - LeakDetector leakDetector) { + LeakDetector leakDetector, BroadcastDispatcher broadcastDispatcher) { mContext = context; mContentResolver = mContext.getContentResolver(); mLeakDetector = leakDetector; @@ -95,7 +96,7 @@ public class TunerServiceImpl extends TunerService { } mCurrentUser = ActivityManager.getCurrentUser(); - mUserTracker = new CurrentUserTracker(mContext) { + mUserTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mCurrentUser = newUserId; diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java index 4d12cc9ebcff..2f13f395d057 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java @@ -42,6 +42,9 @@ import android.widget.Toast; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; public class UsbDebuggingActivity extends AlertActivity implements DialogInterface.OnClickListener { @@ -49,12 +52,20 @@ public class UsbDebuggingActivity extends AlertActivity private CheckBox mAlwaysAllow; private UsbDisconnectedReceiver mDisconnectedReceiver; + private final BroadcastDispatcher mBroadcastDispatcher; private String mKey; + @Inject + public UsbDebuggingActivity(BroadcastDispatcher broadcastDispatcher) { + super(); + mBroadcastDispatcher = broadcastDispatcher; + } + @Override public void onCreate(Bundle icicle) { Window window = getWindow(); - window.addSystemFlags(WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + window.addSystemFlags( + WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); super.onCreate(icicle); @@ -138,13 +149,13 @@ public class UsbDebuggingActivity extends AlertActivity public void onStart() { super.onStart(); IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE); - registerReceiver(mDisconnectedReceiver, filter); + mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter); } @Override protected void onStop() { if (mDisconnectedReceiver != null) { - unregisterReceiver(mDisconnectedReceiver); + mBroadcastDispatcher.unregisterReceiver(mDisconnectedReceiver); } super.onStop(); } diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java index bafd1f1c25a4..032b72ebff7d 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java @@ -29,10 +29,19 @@ import android.os.SystemProperties; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; public class UsbDebuggingSecondaryUserActivity extends AlertActivity implements DialogInterface.OnClickListener { private UsbDisconnectedReceiver mDisconnectedReceiver; + private final BroadcastDispatcher mBroadcastDispatcher; + + @Inject + public UsbDebuggingSecondaryUserActivity(BroadcastDispatcher broadcastDispatcher) { + mBroadcastDispatcher = broadcastDispatcher; + } @Override public void onCreate(Bundle icicle) { @@ -74,13 +83,13 @@ public class UsbDebuggingSecondaryUserActivity extends AlertActivity super.onStart(); IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE); - registerReceiver(mDisconnectedReceiver, filter); + mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter); } @Override protected void onStop() { if (mDisconnectedReceiver != null) { - unregisterReceiver(mDisconnectedReceiver); + mBroadcastDispatcher.unregisterReceiver(mDisconnectedReceiver); } super.onStop(); } diff --git a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java index 5ed027d37def..60d76789ff63 100644 --- a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java +++ b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java @@ -37,7 +37,6 @@ import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.NotificationPanelView; -import com.android.systemui.statusbar.policy.Clock; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -179,11 +178,6 @@ public class InjectionInflationController { * Creates the QSCustomizer. */ QSCustomizer createQSCustomizer(); - - /** - * Creates a Clock. - */ - Clock createClock(); } /** diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 7d283924a0ca..c1da53b09cfc 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; @@ -37,6 +38,7 @@ import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricSourceType; @@ -44,6 +46,8 @@ import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback; import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; +import android.os.Handler; +import android.os.UserHandle; import android.os.UserManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; @@ -58,6 +62,7 @@ import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; import com.android.systemui.DumpController; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.phone.KeyguardBypassController; import org.junit.Assert; @@ -109,6 +114,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private KeyguardBypassController mKeyguardBypassController; @Mock private SubscriptionManager mSubscriptionManager; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; private TestableLooper mTestableLooper; private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor; @@ -143,6 +150,16 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { } @Test + public void testReceiversRegistered() { + verify(mBroadcastDispatcher, atLeastOnce()).registerReceiver( + eq(mKeyguardUpdateMonitor.mBroadcastReceiver), + any(IntentFilter.class), any(Handler.class)); + verify(mBroadcastDispatcher, atLeastOnce()).registerReceiver( + eq(mKeyguardUpdateMonitor.mBroadcastAllReceiver), + any(IntentFilter.class), any(Handler.class), eq(UserHandle.ALL)); + } + + @Test public void testIgnoresSimStateCallback_rebroadcast() { Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); @@ -518,10 +535,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { AtomicBoolean mSimStateChanged = new AtomicBoolean(false); protected TestableKeyguardUpdateMonitor(Context context) { - super(context, TestableLooper.get(KeyguardUpdateMonitorTest.this) - .getLooper(), mDumpController); - context.unregisterReceiver(mBroadcastReceiver); - context.unregisterReceiver(mBroadcastAllReceiver); + super(context, + TestableLooper.get(KeyguardUpdateMonitorTest.this).getLooper(), + mBroadcastDispatcher, mDumpController); mStrongAuthTracker = KeyguardUpdateMonitorTest.this.mStrongAuthTracker; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index 7359fdce462d..1e9000b76c3f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -50,6 +50,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R.dimen; import com.android.systemui.ScreenDecorations.TunablePaddingTagListener; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentService; import com.android.systemui.statusbar.phone.StatusBar; @@ -79,9 +80,13 @@ public class ScreenDecorationsTest extends SysuiTestCase { private WindowManager mWindowManager; private FragmentService mFragmentService; private FragmentHostManager mFragmentHostManager; - private TunerService mTunerService; private StatusBarWindowView mView; private TunablePaddingService mTunablePaddingService; + private Handler mMainHandler; + @Mock + private TunerService mTunerService; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; @Mock private Lazy<StatusBar> mStatusBarLazy; @Before @@ -89,10 +94,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); mTestableLooper = TestableLooper.get(this); - mDependency.injectTestDependency(Dependency.MAIN_HANDLER, - new Handler(mTestableLooper.getLooper())); + mMainHandler = new Handler(mTestableLooper.getLooper()); mTunablePaddingService = mDependency.injectMockDependency(TunablePaddingService.class); - mTunerService = mDependency.injectMockDependency(TunerService.class); mFragmentService = mDependency.injectMockDependency(FragmentService.class); mWindowManager = mock(WindowManager.class); @@ -108,7 +111,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { when(mFragmentService.getFragmentHostManager(any())).thenReturn(mFragmentHostManager); - mScreenDecorations = new ScreenDecorations(mContext, mStatusBarLazy) { + mScreenDecorations = new ScreenDecorations(mContext, mStatusBarLazy, mMainHandler, + mBroadcastDispatcher, mTunerService) { @Override public void start() { super.start(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java index a766885297fa..7d556236b518 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java @@ -17,6 +17,7 @@ package com.android.systemui; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; @@ -34,11 +35,14 @@ import android.testing.AndroidTestingRunner; import androidx.test.filters.SmallTest; import com.android.settingslib.SliceBroadcastRelay; +import com.android.systemui.broadcast.BroadcastDispatcher; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; @RunWith(AndroidTestingRunner.class) @SmallTest @@ -47,11 +51,15 @@ public class SliceBroadcastRelayHandlerTest extends SysuiTestCase { private static final String TEST_ACTION = "com.android.systemui.action.TEST_ACTION"; private SliceBroadcastRelayHandler mRelayHandler; private Context mSpyContext; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; + @Before public void setup() { + MockitoAnnotations.initMocks(this); mSpyContext = spy(mContext); - mRelayHandler = new SliceBroadcastRelayHandler(mSpyContext); + mRelayHandler = new SliceBroadcastRelayHandler(mSpyContext, mBroadcastDispatcher); } @Test @@ -136,6 +144,16 @@ public class SliceBroadcastRelayHandlerTest extends SysuiTestCase { verify(Receiver.sReceiver, timeout(2000)).onReceive(any(), any()); } + @Test + public void testRegisteredWithDispatcher() { + mRelayHandler.start(); + + verify(mBroadcastDispatcher) + .registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); + verify(mSpyContext, never()) + .registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); + } + public static class Receiver extends BroadcastReceiver { private static BroadcastReceiver sReceiver; diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java index 316b891080ce..2ed0b4ffa0f4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java @@ -45,6 +45,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.util.sensors.FakeSensorManager; import org.junit.Before; @@ -66,6 +67,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { FakeSensorManager mSensorManager; @Mock DozeHost mDozeHost; + @Mock + BroadcastDispatcher mBroadcastDispatcher; DozeScreenBrightness mScreen; @Before @@ -82,7 +85,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { mSensorManager = new FakeSensorManager(mContext); mSensor = mSensorManager.getFakeLightSensor(); mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, - mSensor.getSensor(), mDozeHost, null /* handler */, + mSensor.getSensor(), mBroadcastDispatcher, mDozeHost, null /* handler */, DEFAULT_BRIGHTNESS, SENSOR_TO_BRIGHTNESS, SENSOR_TO_OPACITY, true /* debuggable */); } @@ -185,7 +188,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { @Test public void testNullSensor() throws Exception { mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, - null /* sensor */, mDozeHost, null /* handler */, + null /* sensor */, mBroadcastDispatcher, mDozeHost, null /* handler */, DEFAULT_BRIGHTNESS, SENSOR_TO_BRIGHTNESS, SENSOR_TO_OPACITY, true /* debuggable */); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 756227e58ec2..226bf6b3abce 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -39,6 +39,7 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dock.DockManager; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.sensors.AsyncSensorManager; @@ -66,6 +67,8 @@ public class DozeTriggersTest extends SysuiTestCase { private DozeHost mHost; @Mock private AlarmManager mAlarmManager; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; private DozeTriggers mTriggers; private FakeSensorManager mSensors; private Sensor mTapSensor; @@ -87,7 +90,7 @@ public class DozeTriggersTest extends SysuiTestCase { mTriggers = new DozeTriggers(mContext, mMachine, mHost, mAlarmManager, config, parameters, asyncSensorManager, Handler.createAsync(Looper.myLooper()), wakeLock, true, - mDockManagerFake, mProximitySensor, mock(DozeLog.class)); + mDockManagerFake, mProximitySensor, mock(DozeLog.class), mBroadcastDispatcher); waitForSensorManager(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index 9312ed26c217..c8152792be91 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -37,6 +37,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; @@ -60,6 +61,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private @Mock StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private @Mock StatusBarWindowController mStatusBarWindowController; private @Mock SystemUIFactory mSystemUIFactory; + private @Mock BroadcastDispatcher mBroadcastDispatcher; private FalsingManagerFake mFalsingManager; @@ -81,7 +83,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { TestableLooper.get(this).runWithLooper(() -> { mViewMediator = new KeyguardViewMediator( - mContext, mFalsingManager, mLockPatternUtils, mSystemUIFactory); + mContext, mFalsingManager, mLockPatternUtils, mBroadcastDispatcher, + mSystemUIFactory); }); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java index 6e726cf6bf8d..187c72a065a7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java @@ -35,6 +35,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.keyguard.WorkLockActivity; import org.junit.Before; @@ -55,12 +56,13 @@ public class WorkLockActivityTest extends SysuiTestCase { private @Mock DevicePolicyManager mDevicePolicyManager; private @Mock KeyguardManager mKeyguardManager; private @Mock Context mContext; + private @Mock BroadcastDispatcher mBroadcastDispatcher; private WorkLockActivity mActivity; private static class WorkLockActivityTestable extends WorkLockActivity { - WorkLockActivityTestable(Context baseContext) { - super(); + WorkLockActivityTestable(Context baseContext, BroadcastDispatcher broadcastDispatcher) { + super(broadcastDispatcher); attachBaseContext(baseContext); } } @@ -77,7 +79,7 @@ public class WorkLockActivityTest extends SysuiTestCase { if (Looper.myLooper() == null) { Looper.prepare(); } - mActivity = new WorkLockActivityTestable(mContext); + mActivity = new WorkLockActivityTestable(mContext, mBroadcastDispatcher); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt index 462c82ee0b36..098521fbda51 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt @@ -36,6 +36,7 @@ import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.appops.AppOpItem import com.android.systemui.appops.AppOpsController +import com.android.systemui.broadcast.BroadcastDispatcher import org.hamcrest.Matchers.hasItem import org.hamcrest.Matchers.not import org.hamcrest.Matchers.nullValue @@ -62,7 +63,6 @@ import org.mockito.Mockito.doReturn import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.reset -import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations @@ -89,6 +89,8 @@ class PrivacyItemControllerTest : SysuiTestCase() { private lateinit var callback: PrivacyItemController.Callback @Mock private lateinit var userManager: UserManager + @Mock + private lateinit var broadcastDispatcher: BroadcastDispatcher @Captor private lateinit var argCaptor: ArgumentCaptor<List<PrivacyItem>> @Captor @@ -99,7 +101,7 @@ class PrivacyItemControllerTest : SysuiTestCase() { private lateinit var handler: Handler fun PrivacyItemController(context: Context) = - PrivacyItemController(context, appOpsController, handler, handler) + PrivacyItemController(context, appOpsController, handler, handler, broadcastDispatcher) @Before fun setup() { @@ -180,14 +182,12 @@ class PrivacyItemControllerTest : SysuiTestCase() { @Test fun testRegisterReceiver_allUsers() { - val spiedContext = spy(mContext) - val itemController = PrivacyItemController(spiedContext) - itemController.addCallback(callback) + privacyItemController.addCallback(callback) testableLooper.processAllMessages() - verify(spiedContext, atLeastOnce()).registerReceiverAsUser( - eq(itemController.userSwitcherReceiver), eq(UserHandle.ALL), any(), eq(null), - eq(null)) - verify(spiedContext, never()).unregisterReceiver(eq(itemController.userSwitcherReceiver)) + verify(broadcastDispatcher, atLeastOnce()).registerReceiver( + eq(privacyItemController.userSwitcherReceiver), any(), eq(null), eq(UserHandle.ALL)) + verify(broadcastDispatcher, never()) + .unregisterReceiver(eq(privacyItemController.userSwitcherReceiver)) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index ca30bed3892c..a31fc3a611cf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -39,6 +39,7 @@ import com.android.systemui.DumpController; import com.android.systemui.R; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiBaseFragmentTest; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.shared.plugins.PluginManager; @@ -98,7 +99,8 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { QSTileHost host = new QSTileHost(mContext, mock(StatusBarIconController.class), mock(QSFactoryImpl.class), new Handler(), Looper.myLooper(), mock(PluginManager.class), mock(TunerService.class), - () -> mock(AutoTileManager.class), mock(DumpController.class)); + () -> mock(AutoTileManager.class), mock(DumpController.class), + mock(BroadcastDispatcher.class)); qs.setHost(host); qs.setListening(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java index 77520140b1a3..0247c2f79ee7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java @@ -41,6 +41,7 @@ import com.android.internal.util.CollectionUtils; import com.android.systemui.DumpController; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.qs.QSFactory; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.tileimpl.QSFactoryImpl; @@ -84,6 +85,8 @@ public class QSTileHostTest extends SysuiTestCase { @Mock private DumpController mDumpController; @Mock + private BroadcastDispatcher mBroadcastDispatcher; + @Mock private QSTile.State mMockState; private Handler mHandler; private TestableLooper mLooper; @@ -96,7 +99,7 @@ public class QSTileHostTest extends SysuiTestCase { mHandler = new Handler(mLooper.getLooper()); mQSTileHost = new TestQSTileHost(mContext, mIconController, mDefaultFactory, mHandler, mLooper.getLooper(), - mPluginManager, mTunerService, mAutoTiles, mDumpController); + mPluginManager, mTunerService, mAutoTiles, mDumpController, mBroadcastDispatcher); setUpTileFactory(); Settings.Secure.putStringForUser(mContext.getContentResolver(), QSTileHost.TILES_SETTING, "", ActivityManager.getCurrentUser()); @@ -168,9 +171,10 @@ public class QSTileHostTest extends SysuiTestCase { TestQSTileHost(Context context, StatusBarIconController iconController, QSFactoryImpl defaultFactory, Handler mainHandler, Looper bgLooper, PluginManager pluginManager, TunerService tunerService, - Provider<AutoTileManager> autoTiles, DumpController dumpController) { + Provider<AutoTileManager> autoTiles, DumpController dumpController, + BroadcastDispatcher broadcastDispatcher) { super(context, iconController, defaultFactory, mainHandler, bgLooper, pluginManager, - tunerService, autoTiles, dumpController); + tunerService, autoTiles, dumpController, broadcastDispatcher); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java index 11b0c69e8a41..9e5e582bf5e7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java @@ -45,6 +45,7 @@ import android.test.suitebuilder.annotation.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import org.junit.After; import org.junit.Before; @@ -59,6 +60,8 @@ public class TileLifecycleManagerTest extends SysuiTestCase { private final PackageManagerAdapter mMockPackageManagerAdapter = Mockito.mock(PackageManagerAdapter.class); + private final BroadcastDispatcher mMockBroadcastDispatcher = + Mockito.mock(BroadcastDispatcher.class); private final IQSTileService.Stub mMockTileService = Mockito.mock(IQSTileService.Stub.class); private ComponentName mTileServiceComponentName; private Intent mTileServiceIntent; @@ -87,7 +90,8 @@ public class TileLifecycleManagerTest extends SysuiTestCase { Mockito.mock(IQSService.class), new Tile(), mTileServiceIntent, mUser, - mMockPackageManagerAdapter); + mMockPackageManagerAdapter, + mMockBroadcastDispatcher); } @After diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java index d18cebba62b4..824c50dc82bb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java @@ -32,6 +32,7 @@ import android.testing.TestableLooper.RunWithLooper; import com.android.systemui.DumpController; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.shared.plugins.PluginManager; @@ -45,7 +46,9 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import java.util.ArrayList; @@ -57,21 +60,37 @@ public class TileServicesTest extends SysuiTestCase { private TileServices mTileService; private ArrayList<TileServiceManager> mManagers; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; + @Mock + private StatusBarIconController mStatusBarIconController; + @Mock + private QSFactoryImpl mQSFactory; + @Mock + private PluginManager mPluginManager; + @Mock + private TunerService mTunerService; + @Mock + private AutoTileManager mAutoTileManager; + @Mock + private DumpController mDumpController; @Before public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); mDependency.injectMockDependency(BluetoothController.class); mManagers = new ArrayList<>(); QSTileHost host = new QSTileHost(mContext, - mock(StatusBarIconController.class), - mock(QSFactoryImpl.class), + mStatusBarIconController, + mQSFactory, new Handler(), Looper.myLooper(), - mock(PluginManager.class), - mock(TunerService.class), - () -> mock(AutoTileManager.class), - mock(DumpController.class)); - mTileService = new TestTileServices(host, Looper.getMainLooper()); + mPluginManager, + mTunerService, + () -> mAutoTileManager, + mDumpController, + mBroadcastDispatcher); + mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher); } @After @@ -138,12 +157,14 @@ public class TileServicesTest extends SysuiTestCase { } private class TestTileServices extends TileServices { - public TestTileServices(QSTileHost host, Looper looper) { - super(host, looper); + TestTileServices(QSTileHost host, Looper looper, + BroadcastDispatcher broadcastDispatcher) { + super(host, looper, broadcastDispatcher); } @Override - protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile) { + protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile, + BroadcastDispatcher broadcastDispatcher) { TileServiceManager manager = mock(TileServiceManager.class); mManagers.add(manager); when(manager.isLifecycleStarted()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java index 4162bc1da479..1b515c6bbdbd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java @@ -21,9 +21,12 @@ import android.content.Intent; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; /** * Testing functionality of the current user tracker @@ -33,10 +36,13 @@ public class CurrentUserTrackerTest extends SysuiTestCase { private CurrentUserTracker mTracker; private CurrentUserTracker.UserReceiver mReceiver; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; @Before public void setUp() { - mReceiver = new CurrentUserTracker.UserReceiver(getContext()); + MockitoAnnotations.initMocks(this); + mReceiver = new CurrentUserTracker.UserReceiver(mBroadcastDispatcher); mTracker = new CurrentUserTracker(mReceiver) { @Override public void onUserSwitched(int newUserId) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index 85a0fbd74550..548f7a86adf3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -47,6 +47,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationData; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -74,6 +75,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { @Mock private NotificationData mNotificationData; @Mock private DeviceProvisionedController mDeviceProvisionedController; @Mock private StatusBarKeyguardViewManager mKeyguardViewManager; + @Mock private BroadcastDispatcher mBroadcastDispatcher; private int mCurrentUserId; private TestNotificationLockscreenUserManager mLockscreenUserManager; @@ -194,7 +196,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { private class TestNotificationLockscreenUserManager extends NotificationLockscreenUserManagerImpl { public TestNotificationLockscreenUserManager(Context context) { - super(context); + super(context, mBroadcastDispatcher); } public BroadcastReceiver getBaseBroadcastReceiverForTest() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java index e626d083d366..48ed4ba2224c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java @@ -27,6 +27,7 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.power.EnhancedEstimates; import org.junit.Assert; @@ -44,13 +45,15 @@ public class BatteryControllerTest extends SysuiTestCase { @Mock private PowerManager mPowerManager; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; private BatteryControllerImpl mBatteryController; @Before public void setUp() { MockitoAnnotations.initMocks(this); mBatteryController = new BatteryControllerImpl(getContext(), mock(EnhancedEstimates.class), - mPowerManager); + mPowerManager, mBroadcastDispatcher); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java index 3dcb34aac814..5f772b2548ff 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java @@ -27,6 +27,7 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback; import org.junit.Before; @@ -44,7 +45,8 @@ public class LocationControllerImplTest extends SysuiTestCase { @Before public void setup() { mLocationController = spy(new LocationControllerImpl(mContext, - TestableLooper.get(this).getLooper())); + TestableLooper.get(this).getLooper(), + mock(BroadcastDispatcher.class))); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index c03f07e59129..4d866136c915 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -56,6 +56,7 @@ import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.net.DataUsageController; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; @@ -93,6 +94,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected WifiManager mMockWm; protected SubscriptionManager mMockSm; protected TelephonyManager mMockTm; + protected BroadcastDispatcher mMockBd; protected Config mConfig; protected CallbackHandler mCallbackHandler; protected SubscriptionDefaults mMockSubDefaults; @@ -130,6 +132,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mMockTm = mock(TelephonyManager.class); mMockSm = mock(SubscriptionManager.class); mMockCm = mock(ConnectivityManager.class); + mMockBd = mock(BroadcastDispatcher.class); mMockSubDefaults = mock(SubscriptionDefaults.class); mNetCapabilities = new NetworkCapabilities(); when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true); @@ -157,7 +160,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, mConfig, TestableLooper.get(this).getLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), - mMockSubDefaults, mMockProvisionController); + mMockSubDefaults, mMockProvisionController, mMockBd); setupNetworkController(); // Trigger blank callbacks to always get the current state (some tests don't trigger @@ -208,7 +211,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mConfig, TestableLooper.get(this).getLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), mMockSubDefaults, - mock(DeviceProvisionedController.class)); + mock(DeviceProvisionedController.class), mMockBd); setupNetworkController(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index aa4723acba62..ab74caa95e61 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -108,7 +108,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { mConfig, Looper.getMainLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), mMockSubDefaults, - mock(DeviceProvisionedController.class)); + mock(DeviceProvisionedController.class), mMockBd); setupNetworkController(); setupDefaultSignal(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index 0b53c486356f..57dcbf21e147 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -61,7 +61,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, mConfig, Looper.getMainLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), - mMockSubDefaults, mock(DeviceProvisionedController.class)); + mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd); setupNetworkController(); verifyLastMobileDataIndicators(false, -1, 0); @@ -123,7 +123,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, mConfig, Looper.getMainLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), - mMockSubDefaults, mock(DeviceProvisionedController.class)); + mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd); setupNetworkController(); // No Subscriptions. diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java index 97542a9e5966..0c9130d08d6d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java @@ -45,6 +45,7 @@ import android.test.suitebuilder.annotation.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.SecurityController.SecurityControllerCallback; import org.junit.After; @@ -99,7 +100,7 @@ public class SecurityControllerTest extends SysuiTestCase implements SecurityCon // TODO: Migrate this test to TestableLooper and use a handler attached // to that. mSecurityController = new SecurityControllerImpl(mContext, - new Handler(Looper.getMainLooper()), this); + new Handler(Looper.getMainLooper()), mock(BroadcastDispatcher.class), this); } @After diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java index 47e449212fa5..dcf0ef781b07 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java @@ -33,6 +33,7 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.ZenModeController.Callback; import org.junit.Before; @@ -51,6 +52,8 @@ public class ZenModeControllerImplTest extends SysuiTestCase { NotificationManager mNm; @Mock ZenModeConfig mConfig; + @Mock + BroadcastDispatcher mBroadcastDispatcher; private ZenModeControllerImpl mController; @@ -60,7 +63,8 @@ public class ZenModeControllerImplTest extends SysuiTestCase { mContext.addMockSystemService(NotificationManager.class, mNm); when(mNm.getZenModeConfig()).thenReturn(mConfig); - mController = new ZenModeControllerImpl(mContext, Handler.createAsync(Looper.myLooper())); + mController = new ZenModeControllerImpl(mContext, Handler.createAsync(Looper.myLooper()), + mBroadcastDispatcher); } @Test diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a3e6dd966294..340720e2f1fb 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -751,17 +751,17 @@ public class PackageManagerService extends IPackageManager.Stub static final List<SystemPartition> SYSTEM_PARTITIONS = Collections.unmodifiableList( Arrays.asList( new SystemPartition(Environment.getRootDirectory(), 0 /* scanFlag */, - true /* hasPriv */, false /* hasOverlays */), + false /* hasOverlays */), new SystemPartition(Environment.getVendorDirectory(), SCAN_AS_VENDOR, - true /* hasPriv */, true /* hasOverlays */), + true /* hasOverlays */), new SystemPartition(Environment.getOdmDirectory(), SCAN_AS_ODM, - true /* hasPriv */, true /* hasOverlays */), + true /* hasOverlays */), new SystemPartition(Environment.getOemDirectory(), SCAN_AS_OEM, - false /* hasPriv */, true /* hasOverlays */), + true /* hasOverlays */), new SystemPartition(Environment.getProductDirectory(), SCAN_AS_PRODUCT, - true /* hasPriv */, true /* hasOverlays */), + true /* hasOverlays */), new SystemPartition(Environment.getSystemExtDirectory(), SCAN_AS_SYSTEM_EXT, - true /* hasPriv */, true /* hasOverlays */))); + true /* hasOverlays */))); private final List<SystemPartition> mDirsToScanAsSystem; @@ -2427,12 +2427,28 @@ public class PackageManagerService extends IPackageManager.Stub @Nullable public final File overlayFolder; - private SystemPartition(File folder, int scanFlag, boolean hasPrivApps, - boolean hasOverlays) { + + private static boolean shouldScanPrivApps(@ScanFlags int scanFlags) { + if ((scanFlags & SCAN_AS_OEM) != 0) { + return false; + } + if (scanFlags == 0) { // /system partition + return true; + } + if ((scanFlags + & (SCAN_AS_VENDOR | SCAN_AS_ODM | SCAN_AS_PRODUCT | SCAN_AS_SYSTEM_EXT)) != 0) { + return true; + } + return false; + } + + private SystemPartition(File folder, int scanFlag, boolean hasOverlays) { this.folder = folder; this.scanFlag = scanFlag; this.appFolder = toCanonical(new File(folder, "app")); - this.privAppFolder = hasPrivApps ? toCanonical(new File(folder, "priv-app")) : null; + this.privAppFolder = shouldScanPrivApps(scanFlag) + ? toCanonical(new File(folder, "priv-app")) + : null; this.overlayFolder = hasOverlays ? toCanonical(new File(folder, "overlay")) : null; } @@ -17800,17 +17816,6 @@ public class PackageManagerService extends IPackageManager.Stub } } - static boolean locationIsPrivileged(String path) { - // TODO(dariofreni): include APEX partitions when they will support priv apps. - for (int i = 0, size = SYSTEM_PARTITIONS.size(); i < size; i++) { - SystemPartition partition = SYSTEM_PARTITIONS.get(i); - if (partition.containsPrivPath(path)) { - return true; - } - } - return false; - } - private static @Nullable SystemPartition resolveApexToSystemPartition( ApexManager.ActiveApexInfo apexInfo) { for (int i = 0, size = SYSTEM_PARTITIONS.size(); i < size; i++) { @@ -17818,7 +17823,7 @@ public class PackageManagerService extends IPackageManager.Stub if (apexInfo.preinstalledApexPath.getAbsolutePath().startsWith( sp.folder.getAbsolutePath())) { return new SystemPartition(apexInfo.apexDirectory, sp.scanFlag, - false /* hasPriv */, false /* hasOverlays */); + false /* hasOverlays */); } } return null; diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index a11ae8ce6f54..66c77f583c57 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -3513,7 +3513,7 @@ public final class Settings { int pkgFlags = 0; int pkgPrivateFlags = 0; pkgFlags |= ApplicationInfo.FLAG_SYSTEM; - if (PackageManagerService.locationIsPrivileged(codePathStr)) { + if (codePathStr.contains("/priv-app/")) { pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED; } PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr), diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 1fd15d9e765f..198bb146c9b2 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -53,6 +53,7 @@ import android.util.Slog; import android.util.SparseBooleanArray; import com.android.internal.annotations.GuardedBy; +import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.server.LocalServices; import com.android.server.Watchdog; @@ -1128,6 +1129,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; + IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); synchronized (mLock) { for (Rollback rollback : mRollbacks) { diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index b564502630c5..010446492d16 100644..100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -2888,6 +2888,16 @@ public class CarrierConfigManager { "always_show_primary_signal_bar_in_opportunistic_network_boolean"; /** + * Upon data switching between subscriptions within a carrier group, if switch depends on + * validation result, this value defines customized value of how long we wait for validation + * success before we fail and revoke the switch. + * Time out is in milliseconds. + * @hide + */ + public static final String KEY_DATA_SWITCH_VALIDATION_TIMEOUT_LONG = + "data_switch_validation_timeout_long"; + + /** * GPS configs. See android.hardware.gnss@1.0 IGnssConfiguration. * @hide */ @@ -3674,6 +3684,7 @@ public class CarrierConfigManager { sDefaults.putIntArray(KEY_DISCONNECT_CAUSE_PLAY_BUSYTONE_INT_ARRAY, new int[] {4 /* BUSY */}); sDefaults.putBoolean(KEY_PREVENT_CLIR_ACTIVATION_AND_DEACTIVATION_CODE_BOOL, false); + sDefaults.putLong(KEY_DATA_SWITCH_VALIDATION_TIMEOUT_LONG, 2000); } /** diff --git a/telephony/java/android/telephony/ims/ImsSsInfo.java b/telephony/java/android/telephony/ims/ImsSsInfo.java index be34f9db3e54..0510a0012426 100644 --- a/telephony/java/android/telephony/ims/ImsSsInfo.java +++ b/telephony/java/android/telephony/ims/ImsSsInfo.java @@ -336,4 +336,31 @@ public final class ImsSsInfo implements Parcelable { public @ClirInterrogationStatus int getClirInterrogationStatus() { return mClirInterrogationStatus; } + + /** + * Parts of telephony still use the old {m,n} 3GPP definition, so convert to that format. + * @hide + */ + public int[] getCompatArray(@ImsSsData.ServiceType int type) { + int[] result = new int[2]; + // Convert ImsSsInfo into a form that telephony can read (as per 3GPP 27.007) + // CLIR (section 7.7) + if (type == ImsSsData.SS_CLIR) { + // Assume there will only be one ImsSsInfo. + // contains {"n","m"} parameters + result[0] = getClirOutgoingState(); + result[1] = getClirInterrogationStatus(); + return result; + } + // COLR 7.31 + if (type == ImsSsData.SS_COLR) { + result[0] = getProvisionStatus(); + } + // Facility Lock CLCK 7.4 (for call barring), CLIP 7.6, COLP 7.8, as well as any + // other result, just return the status for the "n" parameter and provisioning status for + // "m" as the default. + result[0] = getStatus(); + result[1] = getProvisionStatus(); + return result; + } } diff --git a/telephony/java/android/telephony/ims/ImsUtListener.java b/telephony/java/android/telephony/ims/ImsUtListener.java index d50a0f738b25..1a21d0aa0c76 100644 --- a/telephony/java/android/telephony/ims/ImsUtListener.java +++ b/telephony/java/android/telephony/ims/ImsUtListener.java @@ -16,22 +16,53 @@ package android.telephony.ims; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Bundle; import android.os.RemoteException; +import android.telephony.ims.stub.ImsUtImplBase; import android.util.Log; import com.android.ims.internal.IImsUtListener; /** - * Base implementation of the IMS UT listener interface, which implements stubs. - * Override these methods to implement functionality. + * Listener interface used to receive network responses back from UT supplementary service queries + * made by the framework. * @hide */ // DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you // will break other implementations of ImsUt maintained by other ImsServices. @SystemApi public class ImsUtListener { + + /** + * The {@link Bundle} key for a Calling Line Identification Restriction (CLIR) response. The + * value will be an int[] with two values: + * int[0] contains the 'n' parameter from TS 27.007 7.7, which is the + * outgoing CLIR state. See {@link ImsSsInfo#CLIR_OUTGOING_DEFAULT}, + * {@link ImsSsInfo#CLIR_OUTGOING_INVOCATION}, and {@link ImsSsInfo#CLIR_OUTGOING_SUPPRESSION}; + * int[1] contains the 'm' parameter from TS 27.007 7.7, which is the CLIR interrogation status. + * See {@link ImsSsInfo#CLIR_STATUS_NOT_PROVISIONED}, + * {@link ImsSsInfo#CLIR_STATUS_PROVISIONED_PERMANENT}, {@link ImsSsInfo#CLIR_STATUS_UNKNOWN}, + * {@link ImsSsInfo#CLIR_STATUS_TEMPORARILY_RESTRICTED}, and + * {@link ImsSsInfo#CLIR_STATUS_TEMPORARILY_ALLOWED}. + * @deprecated Use {@link #onLineIdentificationSupplementaryServiceResponse(int, ImsSsInfo)} + * instead. + */ + @Deprecated + public static final String BUNDLE_KEY_CLIR = "queryClir"; + + /** + * The {@link Bundle} key for a Calling Line Identification Presentation (CLIP), Connected Line + * Identification Presentation (COLP), or Connected Line Identification Restriction (COLR) + * response. The value will be an instance of {@link ImsSsInfo}, which contains the response to + * the query. + * @deprecated Use {@link #onLineIdentificationSupplementaryServiceResponse(int, ImsSsInfo)} + * instead. + */ + @Deprecated + public static final String BUNDLE_KEY_SSINFO = "imsSsInfo"; + private IImsUtListener mServiceInterface; private static final String LOG_TAG = "ImsUtListener"; @@ -51,14 +82,54 @@ public class ImsUtListener { } } - public void onUtConfigurationQueried(int id, Bundle ssInfo) { + /** + * Notify the framework of a UT configuration response to a {@link ImsUtImplBase#queryClir()}, + * {@link ImsUtImplBase#queryClip()}, {@link ImsUtImplBase#queryColp()}, or + * {@link ImsUtImplBase#queryColr()} query for the transaction ID specified. If the query fails, + * {@link #onUtConfigurationQueryFailed(int, ImsReasonInfo)} should be called. + * @param id The ID associated with this UT configuration transaction from the framework. + * @param configuration A {@link Bundle} containing the result of querying the UT configuration. + * Must contain {@link #BUNDLE_KEY_CLIR} if it is a response to + * {@link ImsUtImplBase#queryClir()} or + * {@link #BUNDLE_KEY_SSINFO} if it is a response to + * {@link ImsUtImplBase#queryClip()}, {@link ImsUtImplBase#queryColp()}, or + * {@link ImsUtImplBase#queryColr()}. + * @deprecated Use {@link #onLineIdentificationSupplementaryServiceResponse(int, ImsSsInfo)} + * instead. + */ + @Deprecated + public void onUtConfigurationQueried(int id, Bundle configuration) { try { - mServiceInterface.utConfigurationQueried(null, id, ssInfo); + mServiceInterface.utConfigurationQueried(null, id, configuration); } catch (RemoteException e) { Log.w(LOG_TAG, "utConfigurationQueried: remote exception"); } } + /** + * Notify the framework of a UT configuration response to a {@link ImsUtImplBase#queryClir()}, + * {@link ImsUtImplBase#queryClip()}, {@link ImsUtImplBase#queryColp()}, or + * {@link ImsUtImplBase#queryColr()} query for the transaction ID specified. If the query fails, + * the framework should be notified via + * {@link #onUtConfigurationQueryFailed(int, ImsReasonInfo)}. + * @param id The ID associated with this UT configuration transaction from the framework. + * @param configuration An {@link ImsSsInfo} instance containing the configuration for the + * line identification supplementary service queried. + */ + public void onLineIdentificationSupplementaryServiceResponse(int id, + @NonNull ImsSsInfo configuration) { + try { + mServiceInterface.lineIdentificationSupplementaryServiceResponse(id, configuration); + } catch (RemoteException e) { + Log.w(LOG_TAG, "onLineIdentificationSupplementaryServicesResponse: remote exception"); + } + } + + /** + * Notify the Framework of the line identification query failure. + * @param id The ID associated with the UT query transaction. + * @param error The query failure reason. + */ public void onUtConfigurationQueryFailed(int id, ImsReasonInfo error) { try { mServiceInterface.utConfigurationQueryFailed(null, id, error); diff --git a/telephony/java/android/telephony/ims/compat/stub/ImsUtListenerImplBase.java b/telephony/java/android/telephony/ims/compat/stub/ImsUtListenerImplBase.java index 976c2be1a3fe..ae113f2f46c8 100644 --- a/telephony/java/android/telephony/ims/compat/stub/ImsUtListenerImplBase.java +++ b/telephony/java/android/telephony/ims/compat/stub/ImsUtListenerImplBase.java @@ -18,12 +18,11 @@ package android.telephony.ims.compat.stub; import android.os.Bundle; import android.os.RemoteException; - -import android.annotation.UnsupportedAppUsage; import android.telephony.ims.ImsCallForwardInfo; import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.ImsSsData; import android.telephony.ims.ImsSsInfo; + import com.android.ims.internal.IImsUt; import com.android.ims.internal.IImsUtListener; @@ -65,6 +64,13 @@ public class ImsUtListenerImplBase extends IImsUtListener.Stub { } /** + * Notifies the result of a line identification supplementary service query. + */ + @Override + public void lineIdentificationSupplementaryServiceResponse(int id, ImsSsInfo config) { + } + + /** * Notifies the status of the call barring supplementary service. */ @Override diff --git a/telephony/java/com/android/ims/internal/IImsUtListener.aidl b/telephony/java/com/android/ims/internal/IImsUtListener.aidl index fcb9fb1f8773..9a12ceee5212 100644 --- a/telephony/java/com/android/ims/internal/IImsUtListener.aidl +++ b/telephony/java/com/android/ims/internal/IImsUtListener.aidl @@ -44,6 +44,7 @@ oneway interface IImsUtListener { @UnsupportedAppUsage void utConfigurationQueryFailed(in IImsUt ut, int id, in ImsReasonInfo error); + void lineIdentificationSupplementaryServiceResponse(int id, in ImsSsInfo config); /** * Notifies the status of the call barring supplementary service. */ diff --git a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java index 56ad217e6d19..7d88161a2805 100644 --- a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java +++ b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java @@ -32,7 +32,7 @@ public class HierrarchicalDataClassBase implements Parcelable { - // Code below generated by codegen v1.0.11. + // Code below generated by codegen v1.0.12. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -98,8 +98,8 @@ public class HierrarchicalDataClassBase implements Parcelable { }; @DataClass.Generated( - time = 1572630437620L, - codegenVersion = "1.0.11", + time = 1572655992854L, + codegenVersion = "1.0.12", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java", inputSignatures = "private int mBaseData\nclass HierrarchicalDataClassBase extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genSetters=true)") @Deprecated diff --git a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java index 59e07c471d63..c930ce535ab6 100644 --- a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java +++ b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java @@ -46,7 +46,7 @@ public class HierrarchicalDataClassChild extends HierrarchicalDataClassBase { - // Code below generated by codegen v1.0.11. + // Code below generated by codegen v1.0.12. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -120,8 +120,8 @@ public class HierrarchicalDataClassChild extends HierrarchicalDataClassBase { }; @DataClass.Generated( - time = 1572630438646L, - codegenVersion = "1.0.11", + time = 1572655993858L, + codegenVersion = "1.0.12", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java", inputSignatures = "private @android.annotation.NonNull java.lang.String mChildData\nclass HierrarchicalDataClassChild extends com.android.codegentest.HierrarchicalDataClassBase implements []\n@com.android.internal.util.DataClass(genParcelable=true, genConstructor=false, genSetters=true)") @Deprecated diff --git a/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java b/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java index 3c00a3a63eca..368a5c3a81e8 100644 --- a/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java +++ b/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java @@ -52,7 +52,7 @@ public class ParcelAllTheThingsDataClass implements Parcelable { - // Code below generated by codegen v1.0.11. + // Code below generated by codegen v1.0.12. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -410,8 +410,8 @@ public class ParcelAllTheThingsDataClass implements Parcelable { } @DataClass.Generated( - time = 1572630436563L, - codegenVersion = "1.0.11", + time = 1572655991821L, + codegenVersion = "1.0.12", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java", inputSignatures = " @android.annotation.NonNull java.lang.String[] mStringArray\n @android.annotation.NonNull int[] mIntArray\n @android.annotation.NonNull java.util.List<java.lang.String> mStringList\n @android.annotation.NonNull java.util.Map<java.lang.String,com.android.codegentest.SampleWithCustomBuilder> mMap\n @android.annotation.NonNull java.util.Map<java.lang.String,java.lang.String> mStringMap\n @android.annotation.NonNull android.util.SparseArray<com.android.codegentest.SampleWithCustomBuilder> mSparseArray\n @android.annotation.NonNull android.util.SparseIntArray mSparseIntArray\n @java.lang.SuppressWarnings({\"WeakerAccess\"}) @android.annotation.Nullable java.lang.Boolean mNullableBoolean\nclass ParcelAllTheThingsDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genAidl=false, genToString=true)") @Deprecated diff --git a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java index 9765bdc261db..9d52287d631e 100644 --- a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java +++ b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java @@ -342,7 +342,7 @@ public final class SampleDataClass implements Parcelable { - // Code below generated by codegen v1.0.11. + // Code below generated by codegen v1.0.12. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -1872,8 +1872,8 @@ public final class SampleDataClass implements Parcelable { } @DataClass.Generated( - time = 1572630434434L, - codegenVersion = "1.0.11", + time = 1572655989589L, + codegenVersion = "1.0.12", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleDataClass.java", inputSignatures = "public static final java.lang.String STATE_NAME_UNDEFINED\npublic static final java.lang.String STATE_NAME_ON\npublic static final java.lang.String STATE_NAME_OFF\npublic static final int STATE_UNDEFINED\npublic static final int STATE_ON\npublic static final int STATE_OFF\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_AUGMENTED_REQUEST\nprivate int mNum\nprivate int mNum2\nprivate int mNum4\nprivate @android.annotation.Nullable java.lang.String mName\nprivate @android.annotation.NonNull java.lang.String mName2\nprivate @android.annotation.NonNull java.lang.String mName4\nprivate @android.annotation.Nullable android.view.accessibility.AccessibilityNodeInfo mOtherParcelable\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.codegentest.MyDateParcelling.class) @android.annotation.NonNull java.util.Date mDate\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForPattern.class) @android.annotation.NonNull java.util.regex.Pattern mPattern\nprivate @android.annotation.NonNull java.util.List<android.net.LinkAddress> mLinkAddresses2\nprivate @com.android.internal.util.DataClass.PluralOf(\"linkAddress\") @android.annotation.NonNull java.util.ArrayList<android.net.LinkAddress> mLinkAddresses\nprivate @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses4\nprivate @com.android.codegentest.SampleDataClass.StateName @android.annotation.NonNull java.lang.String mStateName\nprivate @com.android.codegentest.SampleDataClass.RequestFlags int mFlags\nprivate @com.android.codegentest.SampleDataClass.State int mState\npublic @android.annotation.NonNull java.lang.CharSequence charSeq\nprivate final @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses5\nprivate transient android.net.LinkAddress[] mLinkAddresses6\ntransient int[] mTmpStorage\nprivate @android.annotation.StringRes int mStringRes\nprivate @android.annotation.IntRange(from=0L, to=6L) int mDayOfWeek\nprivate @android.annotation.Size(2L) @android.annotation.NonNull @com.android.internal.util.DataClass.Each @android.annotation.FloatRange(from=0.0) float[] mCoords\nprivate static java.lang.String defaultName4()\nprivate int[] lazyInitTmpStorage()\npublic android.net.LinkAddress[] getLinkAddresses4()\nprivate boolean patternEquals(java.util.regex.Pattern)\nprivate int patternHashCode()\nprivate void onConstructed()\npublic void dump(java.io.PrintWriter)\nclass SampleDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genConstructor=true, genEqualsHashCode=true, genToString=true, genForEachField=true, genSetters=true)") @Deprecated diff --git a/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java b/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java index c62f2b8f6acb..cef32d1051df 100644 --- a/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java +++ b/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java @@ -85,7 +85,7 @@ public class SampleWithCustomBuilder implements Parcelable { - // Code below generated by codegen v1.0.11. + // Code below generated by codegen v1.0.12. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -253,8 +253,8 @@ public class SampleWithCustomBuilder implements Parcelable { } @DataClass.Generated( - time = 1572630435484L, - codegenVersion = "1.0.11", + time = 1572655990725L, + codegenVersion = "1.0.12", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java", inputSignatures = " long delayAmount\n @android.annotation.NonNull java.util.concurrent.TimeUnit delayUnit\n long creationTimestamp\nprivate static java.util.concurrent.TimeUnit unparcelDelayUnit(android.os.Parcel)\nprivate void parcelDelayUnit(android.os.Parcel,int)\nclass SampleWithCustomBuilder extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genAidl=false, genToString=true)\nabstract com.android.codegentest.SampleWithCustomBuilder.Builder setDelayAmount(long)\npublic abstract com.android.codegentest.SampleWithCustomBuilder.Builder setDelayUnit(java.util.concurrent.TimeUnit)\npublic com.android.codegentest.SampleWithCustomBuilder.Builder setDelay(long,java.util.concurrent.TimeUnit)\nclass BaseBuilder extends java.lang.Object implements []") @Deprecated diff --git a/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java b/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java index 5b93b38161e3..27055f6a4df8 100644 --- a/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java +++ b/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java @@ -36,7 +36,7 @@ public class SampleWithNestedDataClasses { - // Code below generated by codegen v1.0.11. + // Code below generated by codegen v1.0.12. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -135,8 +135,8 @@ public class SampleWithNestedDataClasses { }; @DataClass.Generated( - time = 1572630440713L, - codegenVersion = "1.0.11", + time = 1572655995915L, + codegenVersion = "1.0.12", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java", inputSignatures = " @android.annotation.NonNull java.lang.String mBar\nclass NestedDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true)") @Deprecated @@ -160,7 +160,7 @@ public class SampleWithNestedDataClasses { - // Code below generated by codegen v1.0.11. + // Code below generated by codegen v1.0.12. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -259,8 +259,8 @@ public class SampleWithNestedDataClasses { }; @DataClass.Generated( - time = 1572630440724L, - codegenVersion = "1.0.11", + time = 1572655995924L, + codegenVersion = "1.0.12", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java", inputSignatures = " @android.annotation.NonNull long mBaz2\nclass NestedDataClass3 extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true)") @Deprecated @@ -274,7 +274,7 @@ public class SampleWithNestedDataClasses { - // Code below generated by codegen v1.0.11. + // Code below generated by codegen v1.0.12. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -373,8 +373,8 @@ public class SampleWithNestedDataClasses { }; @DataClass.Generated( - time = 1572630440729L, - codegenVersion = "1.0.11", + time = 1572655995930L, + codegenVersion = "1.0.12", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java", inputSignatures = " @android.annotation.NonNull java.lang.String mBaz\nclass NestedDataClass2 extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true)") @Deprecated diff --git a/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java b/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java index 2964451225e4..4bfec895fdcb 100644 --- a/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java +++ b/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java @@ -51,7 +51,7 @@ public class StaleDataclassDetectorFalsePositivesTest { - // Code below generated by codegen v1.0.11. + // Code below generated by codegen v1.0.12. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -65,8 +65,8 @@ public class StaleDataclassDetectorFalsePositivesTest { @DataClass.Generated( - time = 1572630439617L, - codegenVersion = "1.0.11", + time = 1572655994865L, + codegenVersion = "1.0.12", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java", inputSignatures = "public @android.annotation.NonNull java.lang.String someMethod(int)\nclass StaleDataclassDetectorFalsePositivesTest extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false)") @Deprecated diff --git a/tools/codegen/src/com/android/codegen/FileInfo.kt b/tools/codegen/src/com/android/codegen/FileInfo.kt index 9c15fbf84223..909472640f29 100644 --- a/tools/codegen/src/com/android/codegen/FileInfo.kt +++ b/tools/codegen/src/com/android/codegen/FileInfo.kt @@ -164,7 +164,7 @@ class FileInfo( } if (endInclusive == -1) { // Legacy generated code doesn't have end markers - endInclusive = fileInfo.sourceLines.size - 2 + endInclusive = sourceNoPrefix.size - 2 } IntRange( range.start + start - fileInfo.generatedWarningNumPrecedingEmptyLines, diff --git a/tools/codegen/src/com/android/codegen/SharedConstants.kt b/tools/codegen/src/com/android/codegen/SharedConstants.kt index 270d34a01a64..339057f24833 100644 --- a/tools/codegen/src/com/android/codegen/SharedConstants.kt +++ b/tools/codegen/src/com/android/codegen/SharedConstants.kt @@ -1,7 +1,7 @@ package com.android.codegen const val CODEGEN_NAME = "codegen" -const val CODEGEN_VERSION = "1.0.11" +const val CODEGEN_VERSION = "1.0.12" const val CANONICAL_BUILDER_CLASS = "Builder" const val BASE_BUILDER_CLASS = "BaseBuilder" diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java index ac86778f068f..aa895a61df9b 100644 --- a/wifi/java/android/net/wifi/ScanResult.java +++ b/wifi/java/android/net/wifi/ScanResult.java @@ -16,11 +16,15 @@ package android.net.wifi; +import android.annotation.IntDef; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -223,11 +227,86 @@ public class ScanResult implements Parcelable { */ public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; - /** - * AP Channel bandwidth; one of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ}, - * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ} - * or {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}. - */ + /** + * Wi-Fi unknown standard + */ + public static final int WIFI_STANDARD_UNKNOWN = 0; + + /** + * Wi-Fi 802.11a/b/g + */ + public static final int WIFI_STANDARD_LEGACY = 1; + + /** + * Wi-Fi 802.11n + */ + public static final int WIFI_STANDARD_11N = 4; + + /** + * Wi-Fi 802.11ac + */ + public static final int WIFI_STANDARD_11AC = 5; + + /** + * Wi-Fi 802.11ax + */ + public static final int WIFI_STANDARD_11AX = 6; + + /** @hide */ + @IntDef(prefix = { "WIFI_STANDARD_" }, value = { + WIFI_STANDARD_UNKNOWN, + WIFI_STANDARD_LEGACY, + WIFI_STANDARD_11N, + WIFI_STANDARD_11AC, + WIFI_STANDARD_11AX + }) + @Retention(RetentionPolicy.SOURCE) + public @interface WifiStandard{} + + /** + * AP wifi standard. + */ + private @WifiStandard int mWifiStandard; + + /** + * return the AP wifi standard. + */ + public @WifiStandard int getWifiStandard() { + return mWifiStandard; + } + + /** + * sets the AP wifi standard. + * @hide + */ + public void setWifiStandard(@WifiStandard int standard) { + mWifiStandard = standard; + } + + /** + * Convert Wi-Fi standard to string + */ + private static @Nullable String wifiStandardToString(@WifiStandard int standard) { + switch(standard) { + case WIFI_STANDARD_LEGACY: + return "legacy"; + case WIFI_STANDARD_11N: + return "11n"; + case WIFI_STANDARD_11AC: + return "11ac"; + case WIFI_STANDARD_11AX: + return "11ax"; + case WIFI_STANDARD_UNKNOWN: + return "unknown"; + } + return null; + } + + /** + * AP Channel bandwidth; one of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ}, + * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ} + * or {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}. + */ public int channelWidth; /** @@ -549,6 +628,7 @@ public class ScanResult implements Parcelable { this.carrierApEapType = UNSPECIFIED; this.carrierName = null; this.radioChainInfos = null; + this.mWifiStandard = WIFI_STANDARD_UNKNOWN; } /** {@hide} */ @@ -571,6 +651,7 @@ public class ScanResult implements Parcelable { this.carrierApEapType = UNSPECIFIED; this.carrierName = null; this.radioChainInfos = null; + this.mWifiStandard = WIFI_STANDARD_UNKNOWN; } /** {@hide} */ @@ -600,6 +681,7 @@ public class ScanResult implements Parcelable { this.carrierApEapType = UNSPECIFIED; this.carrierName = null; this.radioChainInfos = null; + this.mWifiStandard = WIFI_STANDARD_UNKNOWN; } /** {@hide} */ @@ -641,6 +723,7 @@ public class ScanResult implements Parcelable { carrierApEapType = source.carrierApEapType; carrierName = source.carrierName; radioChainInfos = source.radioChainInfos; + this.mWifiStandard = source.mWifiStandard; } } @@ -679,6 +762,7 @@ public class ScanResult implements Parcelable { sb.append(", ChannelBandwidth: ").append(channelWidth); sb.append(", centerFreq0: ").append(centerFreq0); sb.append(", centerFreq1: ").append(centerFreq1); + sb.append(", standard: ").append(wifiStandardToString(mWifiStandard)); sb.append(", 80211mcResponder: "); sb.append(((flags & FLAG_80211mc_RESPONDER) != 0) ? "is supported" : "is not supported"); sb.append(", Carrier AP: ").append(isCarrierAp ? "yes" : "no"); @@ -714,6 +798,7 @@ public class ScanResult implements Parcelable { dest.writeInt(channelWidth); dest.writeInt(centerFreq0); dest.writeInt(centerFreq1); + dest.writeInt(mWifiStandard); dest.writeLong(seen); dest.writeInt(untrusted ? 1 : 0); dest.writeInt(numUsage); @@ -796,6 +881,7 @@ public class ScanResult implements Parcelable { fixed with flags below */ ); + sr.mWifiStandard = in.readInt(); sr.seen = in.readLong(); sr.untrusted = in.readInt() != 0; sr.numUsage = in.readInt(); diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java index 62ba95dc806b..86e51227575b 100644 --- a/wifi/java/android/net/wifi/WifiInfo.java +++ b/wifi/java/android/net/wifi/WifiInfo.java @@ -16,7 +16,6 @@ package android.net.wifi; -import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.Nullable; import android.annotation.SystemApi; @@ -28,8 +27,6 @@ import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.net.Inet4Address; import java.net.InetAddress; import java.net.UnknownHostException; @@ -99,45 +96,9 @@ public class WifiInfo implements Parcelable { private int mRssi; /** - * Wi-Fi unknown technology + * Wi-Fi standard for the connection */ - public static final int WIFI_TECHNOLOGY_UNKNOWN = 0; - - /** - * Wi-Fi 802.11a/b/g - */ - public static final int WIFI_TECHNOLOGY_LEGACY = 1; - - /** - * Wi-Fi 802.11n - */ - public static final int WIFI_TECHNOLOGY_11N = 4; - - /** - * Wi-Fi 802.11ac - */ - public static final int WIFI_TECHNOLOGY_11AC = 5; - - /** - * Wi-Fi 802.11ax - */ - public static final int WIFI_TECHNOLOGY_11AX = 6; - - /** @hide */ - @IntDef(prefix = { "WIFI_TECHNOLOGY_" }, value = { - WIFI_TECHNOLOGY_UNKNOWN, - WIFI_TECHNOLOGY_LEGACY, - WIFI_TECHNOLOGY_11N, - WIFI_TECHNOLOGY_11AC, - WIFI_TECHNOLOGY_11AX - }) - @Retention(RetentionPolicy.SOURCE) - public @interface WifiTechnology{} - - /** - * Wi-Fi technology for the connection - */ - private @WifiTechnology int mWifiTechnology; + private @ScanResult.WifiStandard int mWifiStandard; /** * The unit in which links speeds are expressed. @@ -330,7 +291,7 @@ public class WifiInfo implements Parcelable { txSuccessRate = source.txSuccessRate; rxSuccessRate = source.rxSuccessRate; score = source.score; - mWifiTechnology = source.mWifiTechnology; + mWifiStandard = source.mWifiStandard; } } @@ -419,19 +380,19 @@ public class WifiInfo implements Parcelable { } /** - * Sets the Wi-Fi technology + * Sets the Wi-Fi standard * @hide */ - public void setWifiTechnology(@WifiTechnology int wifiTechnology) { - mWifiTechnology = wifiTechnology; + public void setWifiStandard(@ScanResult.WifiStandard int wifiStandard) { + mWifiStandard = wifiStandard; } /** - * Get connection Wi-Fi technology - * @return the connection Wi-Fi technology + * Get connection Wi-Fi standard + * @return the connection Wi-Fi standard */ - public @WifiTechnology int getWifiTechnology() { - return mWifiTechnology; + public @ScanResult.WifiStandard int getWifiStandard() { + return mWifiStandard; } /** @@ -740,7 +701,7 @@ public class WifiInfo implements Parcelable { .append(", MAC: ").append(mMacAddress == null ? none : mMacAddress) .append(", Supplicant state: ") .append(mSupplicantState == null ? none : mSupplicantState) - .append(", Wi-Fi technology: ").append(mWifiTechnology) + .append(", Wi-Fi standard: ").append(mWifiStandard) .append(", RSSI: ").append(mRssi) .append(", Link speed: ").append(mLinkSpeed).append(LINK_SPEED_UNITS) .append(", Tx Link speed: ").append(mTxLinkSpeed).append(LINK_SPEED_UNITS) @@ -796,7 +757,7 @@ public class WifiInfo implements Parcelable { dest.writeString(mNetworkSuggestionOrSpecifierPackageName); dest.writeString(mFqdn); dest.writeString(mProviderFriendlyName); - dest.writeInt(mWifiTechnology); + dest.writeInt(mWifiStandard); } /** Implement the Parcelable interface {@hide} */ @@ -838,7 +799,7 @@ public class WifiInfo implements Parcelable { info.mNetworkSuggestionOrSpecifierPackageName = in.readString(); info.mFqdn = in.readString(); info.mProviderFriendlyName = in.readString(); - info.mWifiTechnology = in.readInt(); + info.mWifiStandard = in.readInt(); return info; } diff --git a/wifi/tests/src/android/net/wifi/ScanResultTest.java b/wifi/tests/src/android/net/wifi/ScanResultTest.java index 4973c4cd37fd..b5c74d1d01b1 100644 --- a/wifi/tests/src/android/net/wifi/ScanResultTest.java +++ b/wifi/tests/src/android/net/wifi/ScanResultTest.java @@ -42,6 +42,8 @@ public class ScanResultTest { public static final int TEST_LEVEL = -56; public static final int TEST_FREQUENCY = 2412; public static final long TEST_TSF = 04660l; + public static final @ScanResult.WifiStandard int TEST_WIFI_STANDARD = + ScanResult.WIFI_STANDARD_11AC; /** * Setup before tests. @@ -149,12 +151,14 @@ public class ScanResultTest { @Test public void verifyScanResultToStringWithoutRadioChainInfo() throws Exception { ScanResult scanResult = createScanResult(); - assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " + - "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), distanceSd: 0(cm), " + - "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " + - "80211mcResponder: is not supported, Carrier AP: no, " + - "Carrier AP EAP Type: 0, Carrier name: null, " + - "Radio Chain Infos: null", scanResult.toString()); + assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " + + "level: -56, frequency: 2412, timestamp: 2480, " + + "distance: 0(cm), distanceSd: 0(cm), " + + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " + + "standard: 11ac, " + + "80211mcResponder: is not supported, Carrier AP: no, " + + "Carrier AP EAP Type: 0, Carrier name: null, " + + "Radio Chain Infos: null", scanResult.toString()); } /** @@ -170,13 +174,15 @@ public class ScanResultTest { scanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo(); scanResult.radioChainInfos[1].id = 1; scanResult.radioChainInfos[1].level = -54; - assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " + - "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), distanceSd: 0(cm), " + - "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " + - "80211mcResponder: is not supported, Carrier AP: no, " + - "Carrier AP EAP Type: 0, Carrier name: null, " + - "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, " + - "RadioChainInfo: id=1, level=-54]", scanResult.toString()); + assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " + + "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), " + + "distanceSd: 0(cm), " + + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " + + "standard: 11ac, " + + "80211mcResponder: is not supported, Carrier AP: no, " + + "Carrier AP EAP Type: 0, Carrier name: null, " + + "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, " + + "RadioChainInfo: id=1, level=-54]", scanResult.toString()); } /** @@ -197,6 +203,7 @@ public class ScanResultTest { result.level = TEST_LEVEL; result.frequency = TEST_FREQUENCY; result.timestamp = TEST_TSF; + result.setWifiStandard(TEST_WIFI_STANDARD); return result; } @@ -207,6 +214,7 @@ public class ScanResultTest { assertEquals(expected.level, actual.level); assertEquals(expected.frequency, actual.frequency); assertEquals(expected.timestamp, actual.timestamp); + assertEquals(expected.getWifiStandard(), actual.getWifiStandard()); assertArrayEquals(expected.radioChainInfos, actual.radioChainInfos); assertArrayEquals(expected.informationElements, actual.informationElements); } diff --git a/wifi/tests/src/android/net/wifi/WifiInfoTest.java b/wifi/tests/src/android/net/wifi/WifiInfoTest.java index ea08ea8e8333..22a5faaac112 100644 --- a/wifi/tests/src/android/net/wifi/WifiInfoTest.java +++ b/wifi/tests/src/android/net/wifi/WifiInfoTest.java @@ -38,7 +38,7 @@ public class WifiInfoTest { private static final String TEST_PACKAGE_NAME = "com.test.example"; private static final String TEST_FQDN = "test.com"; private static final String TEST_PROVIDER_NAME = "test"; - private static final int TEST_WIFI_TECHNOLOGY = WifiInfo.WIFI_TECHNOLOGY_11AC; + private static final int TEST_WIFI_STANDARD = ScanResult.WIFI_STANDARD_11AC; /** * Verify parcel write/read with WifiInfo. @@ -55,7 +55,7 @@ public class WifiInfoTest { writeWifiInfo.setFQDN(TEST_FQDN); writeWifiInfo.setProviderFriendlyName(TEST_PROVIDER_NAME); writeWifiInfo.setNetworkSuggestionOrSpecifierPackageName(TEST_PACKAGE_NAME); - writeWifiInfo.setWifiTechnology(TEST_WIFI_TECHNOLOGY); + writeWifiInfo.setWifiStandard(TEST_WIFI_STANDARD); Parcel parcel = Parcel.obtain(); writeWifiInfo.writeToParcel(parcel, 0); @@ -74,6 +74,6 @@ public class WifiInfoTest { assertEquals(TEST_PACKAGE_NAME, readWifiInfo.getNetworkSuggestionOrSpecifierPackageName()); assertEquals(TEST_FQDN, readWifiInfo.getPasspointFqdn()); assertEquals(TEST_PROVIDER_NAME, readWifiInfo.getPasspointProviderFriendlyName()); - assertEquals(TEST_WIFI_TECHNOLOGY, readWifiInfo.getWifiTechnology()); + assertEquals(TEST_WIFI_STANDARD, readWifiInfo.getWifiStandard()); } } |