diff options
76 files changed, 2490 insertions, 2908 deletions
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java index 18665e7f4d22..f49cdbf403f0 100644 --- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java +++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java @@ -241,7 +241,7 @@ public class JobInfo implements Parcelable { /** * Default value for all regular jobs. As noted in {@link JobScheduler}, - * these jobs have a general maximum execution time of 10 minutes. + * these jobs have a general execution time of 10 minutes. * Receives the standard job management policy. */ public static final int PRIORITY_DEFAULT = 300; @@ -250,7 +250,7 @@ public class JobInfo implements Parcelable { * This task should be ordered ahead of most other tasks. It may be * deferred a little, but if it doesn't run at some point, the user may think * something is wrong. Assuming all constraints remain satisfied - * (including ideal system load conditions), these jobs will have a maximum + * (including ideal system load conditions), these jobs can have an * execution time of at least 4 minutes. Setting all of your jobs to high * priority will not be beneficial to your app and in fact may hurt its * performance in the long run. @@ -260,7 +260,7 @@ public class JobInfo implements Parcelable { /** * This task should be run ahead of all other tasks. Only Expedited Jobs * {@link Builder#setExpedited(boolean)} can have this priority and as such, - * are subject to the same maximum execution time details noted in + * are subject to the same execution time details noted in * {@link Builder#setExpedited(boolean)}. * A sample task of max priority: receiving a text message and processing it to * show a notification @@ -1414,6 +1414,15 @@ public class JobInfo implements Parcelable { * you also need to define the network traffic used by each work item * when constructing them. * + * <p class="note"> + * Prior to Android version {@link Build.VERSION_CODES#TIRAMISU}, JobScheduler used the + * estimated transfer numbers in a similar fashion to + * {@link #setMinimumNetworkChunkBytes(long)} (to estimate if the work would complete + * within the time available to job). In other words, JobScheduler treated the transfer as + * all-or-nothing. Starting from Android version {@link Build.VERSION_CODES#TIRAMISU}, + * JobScheduler will only use the estimated transfer numbers in this manner if minimum + * chunk sizes have not been provided via {@link #setMinimumNetworkChunkBytes(long)}. + * * @param downloadBytes The estimated size of network traffic that will * be downloaded by this job, in bytes. * @param uploadBytes The estimated size of network traffic that will be @@ -1756,14 +1765,19 @@ public class JobInfo implements Parcelable { * * <p> * Assuming all constraints remain satisfied (including ideal system load conditions), - * expedited jobs will have a maximum execution time of at least 1 minute. If your + * expedited jobs can have an execution time of at least 1 minute. If your * app has remaining expedited job quota, then the expedited job <i>may</i> potentially run * longer until remaining quota is used up. Just like with regular jobs, quota is not * consumed while the app is on top and visible to the user. * - * <p> + * <p class="note"> * Note: Even though expedited jobs are meant to run as soon as possible, they may be * deferred if the system is under heavy load or requested constraints are not satisfied. + * This delay may be true for expedited jobs of the foreground app on Android version + * {@link Build.VERSION_CODES#S}, but starting from Android version + * {@link Build.VERSION_CODES#TIRAMISU}, expedited jobs for the foreground app are + * guaranteed to be started before {@link JobScheduler#schedule(JobInfo)} returns (assuming + * all requested constraints are satisfied), similar to foreground services. * * @see JobInfo#isExpedited() */ @@ -1799,6 +1813,9 @@ public class JobInfo implements Parcelable { * and in the background, or the job failed due to unsatisfied constraints, * this job should be expected to behave like other jobs without this flag. * + * <p> + * Jobs marked as important-while-foreground are given {@link #PRIORITY_HIGH} by default. + * * @param importantWhileForeground whether to relax doze restrictions for this job when the * app is in the foreground. False by default. * @see JobInfo#isImportantWhileForeground() @@ -1831,8 +1848,9 @@ public class JobInfo implements Parcelable { * the specific user of this device. For example, fetching top headlines * of interest to the current user. * <p> - * Starting with Android version {@link Build.VERSION_CODES#TIRAMISU}, prefetch jobs are - * not allowed to have deadlines (set via {@link #setOverrideDeadline(long)}. + * Apps targeting Android version {@link Build.VERSION_CODES#TIRAMISU} or later are + * not allowed to have deadlines (set via {@link #setOverrideDeadline(long)} on their + * prefetch jobs. * <p> * The system may use this signal to relax the network constraints you * originally requested, such as allowing a diff --git a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java index 1429c45ef2d2..ed72530d8608 100644 --- a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java +++ b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java @@ -167,7 +167,7 @@ public class JobParameters implements Parcelable { /** * The job used up its maximum execution time and timed out. Each individual job has a maximum * execution time limit, regardless of how much total quota the app has. See the note on - * {@link JobScheduler} for the execution time limits. + * {@link JobScheduler} and {@link JobInfo} for the execution time limits. */ public static final int STOP_REASON_TIMEOUT = 3; /** diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java b/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java index c8ec89475050..c86353c84467 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java @@ -690,6 +690,12 @@ class JobConcurrencyManager { int projectedRunningCount = numRunningJobs; while ((nextPending = pendingJobQueue.next()) != null) { if (mRunningJobs.contains(nextPending)) { + // Should never happen. + Slog.wtf(TAG, "Pending queue contained a running job"); + if (DEBUG) { + Slog.e(TAG, "Pending+running job: " + nextPending); + } + pendingJobQueue.remove(nextPending); continue; } @@ -1137,7 +1143,8 @@ class JobConcurrencyManager { } } - if (mActiveServices.size() >= STANDARD_CONCURRENCY_LIMIT) { + final PendingJobQueue pendingJobQueue = mService.getPendingJobQueue(); + if (mActiveServices.size() >= STANDARD_CONCURRENCY_LIMIT || pendingJobQueue.size() == 0) { worker.clearPreferredUid(); // We're over the limit (because the TOP app scheduled a lot of EJs). Don't start // running anything new until we get back below the limit. @@ -1145,7 +1152,6 @@ class JobConcurrencyManager { return; } - final PendingJobQueue pendingJobQueue = mService.getPendingJobQueue(); if (worker.getPreferredUid() != JobServiceContext.NO_PREFERRED_UID) { updateCounterConfigLocked(); // Preemption case needs special care. @@ -1162,6 +1168,12 @@ class JobConcurrencyManager { pendingJobQueue.resetIterator(); while ((nextPending = pendingJobQueue.next()) != null) { if (mRunningJobs.contains(nextPending)) { + // Should never happen. + Slog.wtf(TAG, "Pending queue contained a running job"); + if (DEBUG) { + Slog.e(TAG, "Pending+running job: " + nextPending); + } + pendingJobQueue.remove(nextPending); continue; } @@ -1239,6 +1251,12 @@ class JobConcurrencyManager { while ((nextPending = pendingJobQueue.next()) != null) { if (mRunningJobs.contains(nextPending)) { + // Should never happen. + Slog.wtf(TAG, "Pending queue contained a running job"); + if (DEBUG) { + Slog.e(TAG, "Pending+running job: " + nextPending); + } + pendingJobQueue.remove(nextPending); continue; } diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java index 9e131339595f..358c32722b8b 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -1749,8 +1749,13 @@ public class JobSchedulerService extends com.android.server.SystemService if (!removed) { // We never create JobStatus objects for the express purpose of removing them, and this // method is only ever called for jobs that were saved in the JobStore at some point, - // so if we can't find it, something went seriously wrong. - Slog.wtfStack(TAG, "Job didn't exist in JobStore"); + // so if we can't find it, something may be wrong. As of Android T, there is a + // legitimate code path where removed is false --- when an actively running job is + // cancelled (eg. via JobScheduler.cancel() or the app scheduling a new job with the + // same job ID), we remove it from the JobStore and tell the JobServiceContext to stop + // running the job. Once the job stops running, we then call this method again. + // TODO: rework code so we don't intentionally call this method twice for the same job + Slog.w(TAG, "Job didn't exist in JobStore"); } if (mReadyToRock) { for (int i = 0; i < mControllers.size(); i++) { diff --git a/core/api/module-lib-lint-baseline.txt b/core/api/module-lib-lint-baseline.txt index 0c1ebb3b2208..27436ce35867 100644 --- a/core/api/module-lib-lint-baseline.txt +++ b/core/api/module-lib-lint-baseline.txt @@ -1,4 +1,6 @@ // Baseline format: 1.0 +SamShouldBeLast: android.app.Activity#convertToTranslucent(android.app.Activity.TranslucentConversionListener, android.app.ActivityOptions): + SAM-compatible parameters (such as parameter 1, "callback", in android.app.Activity.convertToTranslucent) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.app.ActivityManager#addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int): SAM-compatible parameters (such as parameter 1, "listener", in android.app.ActivityManager.addOnUidImportanceListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.app.PendingIntent#send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler): @@ -9,6 +11,24 @@ SamShouldBeLast: android.app.PendingIntent#send(android.content.Context, int, an SAM-compatible parameters (such as parameter 4, "onFinished", in android.app.PendingIntent.send) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.app.PendingIntent#send(int, android.app.PendingIntent.OnFinished, android.os.Handler): SAM-compatible parameters (such as parameter 2, "onFinished", in android.app.PendingIntent.send) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.content.pm.ApplicationInfo#dump(android.util.Printer, String): + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.ApplicationInfo.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.content.pm.PackageItemInfo#dumpBack(android.util.Printer, String): + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.PackageItemInfo.dumpBack) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.content.pm.PackageItemInfo#dumpFront(android.util.Printer, String): + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.PackageItemInfo.dumpFront) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler): + SAM-compatible parameters (such as parameter 1, "listener", in android.location.LocationManager.addNmeaListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(String, long, float, android.location.LocationListener, android.os.Looper): + SAM-compatible parameters (such as parameter 4, "listener", in android.location.LocationManager.requestLocationUpdates) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(android.location.LocationRequest, android.location.LocationListener, android.os.Looper): + SAM-compatible parameters (such as parameter 2, "listener", in android.location.LocationManager.requestLocationUpdates) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(long, float, android.location.Criteria, android.location.LocationListener, android.os.Looper): + SAM-compatible parameters (such as parameter 4, "listener", in android.location.LocationManager.requestLocationUpdates) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.location.LocationManager#requestSingleUpdate(String, android.location.LocationListener, android.os.Looper): + SAM-compatible parameters (such as parameter 2, "listener", in android.location.LocationManager.requestSingleUpdate) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.location.LocationManager#requestSingleUpdate(android.location.Criteria, android.location.LocationListener, android.os.Looper): + SAM-compatible parameters (such as parameter 2, "listener", in android.location.LocationManager.requestSingleUpdate) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioManager#abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes): SAM-compatible parameters (such as parameter 1, "l", in android.media.AudioManager.abandonAudioFocus) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioManager#requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int): diff --git a/core/api/system-lint-baseline.txt b/core/api/system-lint-baseline.txt index 1b45e88584fe..025e8629fc20 100644 --- a/core/api/system-lint-baseline.txt +++ b/core/api/system-lint-baseline.txt @@ -1,36 +1,20 @@ // Baseline format: 1.0 ArrayReturn: android.view.contentcapture.ViewNode#getAutofillOptions(): - -ExecutorRegistration: android.media.MediaPlayer#setOnRtpRxNoticeListener(android.content.Context, android.media.MediaPlayer.OnRtpRxNoticeListener, android.os.Handler): - Registration methods should have overload that accepts delivery Executor: `setOnRtpRxNoticeListener` + Method should return Collection<CharSequence> (or subclass) instead of raw array; was `java.lang.CharSequence[]` GenericException: android.app.prediction.AppPredictor#finalize(): - + Methods must not throw generic exceptions (`java.lang.Throwable`) GenericException: android.hardware.location.ContextHubClient#finalize(): - + Methods must not throw generic exceptions (`java.lang.Throwable`) GenericException: android.service.autofill.augmented.FillWindow#finalize(): - - - -IntentBuilderName: android.app.search.SearchAction#getIntent(): - -IntentBuilderName: android.app.smartspace.SmartspaceAction#getIntent(): - Methods creating an Intent should be named `create<Foo>Intent()`, was `getIntent` + Methods must not throw generic exceptions (`java.lang.Throwable`) KotlinKeyword: android.app.Notification#when: - + Avoid field names that are Kotlin hard keywords ("when"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords -MissingGetterMatchingBuilder: android.os.NewUserRequest.Builder#setAdmin(): - android.os.NewUserRequest does not declare a `getAdmin()` method matching method android.os.NewUserRequest.Builder.setAdmin() -MissingGetterMatchingBuilder: android.os.NewUserRequest.Builder#setEphemeral(): - android.os.NewUserRequest does not declare a `getEphemeral()` method matching method android.os.NewUserRequest.Builder.setEphemeral() -MissingGetterMatchingBuilder: android.security.keystore.KeyGenParameterSpec.Builder#setUid(int): - android.security.keystore.KeyGenParameterSpec does not declare a `getUid()` method matching method android.security.keystore.KeyGenParameterSpec.Builder.setUid(int) -MissingGetterMatchingBuilder: android.service.autofill.Dataset.Builder#setFieldInlinePresentation(android.view.autofill.AutofillId, android.view.autofill.AutofillValue, java.util.regex.Pattern, android.service.autofill.InlinePresentation): - android.service.autofill.Dataset does not declare a `getFieldInlinePresentation()` method matching method android.service.autofill.Dataset.Builder.setFieldInlinePresentation(android.view.autofill.AutofillId,android.view.autofill.AutofillValue,java.util.regex.Pattern,android.service.autofill.InlinePresentation) MissingGetterMatchingBuilder: android.telecom.CallScreeningService.CallResponse.Builder#setShouldScreenCallViaAudioProcessing(boolean): android.telecom.CallScreeningService.CallResponse does not declare a `shouldScreenCallViaAudioProcessing()` method matching method android.telecom.CallScreeningService.CallResponse.Builder.setShouldScreenCallViaAudioProcessing(boolean) MissingGetterMatchingBuilder: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String): @@ -38,175 +22,135 @@ MissingGetterMatchingBuilder: android.telephony.mbms.DownloadRequest.Builder#set MissingNullability: android.media.soundtrigger.SoundTriggerDetectionService#onUnbind(android.content.Intent) parameter #0: - + Missing nullability on parameter `intent` in method `onUnbind` MissingNullability: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle) parameter #0: - + Missing nullability on parameter `inputId` in method `onEvent` MissingNullability: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle) parameter #1: - + Missing nullability on parameter `eventType` in method `onEvent` MissingNullability: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle) parameter #2: - + Missing nullability on parameter `eventArgs` in method `onEvent` MissingNullability: android.printservice.recommendation.RecommendationService#attachBaseContext(android.content.Context) parameter #0: - + Missing nullability on parameter `base` in method `attachBaseContext` MissingNullability: android.provider.ContactsContract.MetadataSync#CONTENT_URI: - + Missing nullability on field `CONTENT_URI` in class `class android.provider.ContactsContract.MetadataSync` MissingNullability: android.provider.ContactsContract.MetadataSync#METADATA_AUTHORITY_URI: - + Missing nullability on field `METADATA_AUTHORITY_URI` in class `class android.provider.ContactsContract.MetadataSync` MissingNullability: android.provider.ContactsContract.MetadataSyncState#CONTENT_URI: - + Missing nullability on field `CONTENT_URI` in class `class android.provider.ContactsContract.MetadataSyncState` MissingNullability: android.provider.SearchIndexablesProvider#attachInfo(android.content.Context, android.content.pm.ProviderInfo) parameter #0: - + Missing nullability on parameter `context` in method `attachInfo` MissingNullability: android.provider.SearchIndexablesProvider#attachInfo(android.content.Context, android.content.pm.ProviderInfo) parameter #1: - + Missing nullability on parameter `info` in method `attachInfo` MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#onUnbind(android.content.Intent) parameter #0: - + Missing nullability on parameter `intent` in method `onUnbind` MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0: - + Missing nullability on parameter `fd` in method `dump` MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #1: - + Missing nullability on parameter `pw` in method `dump` MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #2: - + Missing nullability on parameter `args` in method `dump` MissingNullability: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context) parameter #0: - + Missing nullability on parameter `base` in method `attachBaseContext` MissingNullability: android.telephony.NetworkService#onUnbind(android.content.Intent) parameter #0: - -MissingNullability: android.telephony.SubscriptionPlan.Builder#createRecurringDaily(java.time.ZonedDateTime) parameter #0: - -MissingNullability: android.telephony.SubscriptionPlan.Builder#createRecurringMonthly(java.time.ZonedDateTime) parameter #0: - -MissingNullability: android.telephony.SubscriptionPlan.Builder#createRecurringWeekly(java.time.ZonedDateTime) parameter #0: - + Missing nullability on parameter `intent` in method `onUnbind` MissingNullability: android.telephony.data.DataService#onUnbind(android.content.Intent) parameter #0: - + Missing nullability on parameter `intent` in method `onUnbind` MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String): - + Missing nullability on method `setServiceId` return MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String) parameter #0: - - - -NoSettingsProvider: android.provider.Settings.Secure#FAST_PAIR_SCAN_ENABLED: - New setting keys are not allowed (Field: FAST_PAIR_SCAN_ENABLED); use getters/setters in relevant manager class - - -OnNameExpected: android.service.smartspace.SmartspaceService#notifySmartspaceEvent(android.app.smartspace.SmartspaceSessionId, android.app.smartspace.SmartspaceTargetEvent): - Methods implemented by developers should follow the on<Something> style, was `notifySmartspaceEvent` + Missing nullability on parameter `serviceId` in method `setServiceId` ProtectedMember: android.printservice.recommendation.RecommendationService#attachBaseContext(android.content.Context): - + Protected methods not allowed; must be public: method android.printservice.recommendation.RecommendationService.attachBaseContext(android.content.Context)} ProtectedMember: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]): - + Protected methods not allowed; must be public: method android.service.contentcapture.ContentCaptureService.dump(java.io.FileDescriptor,java.io.PrintWriter,String[])} ProtectedMember: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context): - - - -RethrowRemoteException: android.app.WallpaperManager#getWallpaperDimAmount(): - Methods calling system APIs should rethrow `RemoteException` as `RuntimeException` (but do not list it in the throws clause) -RethrowRemoteException: android.app.WallpaperManager#getWallpaperDimmingAmount(): - Methods calling system APIs should rethrow `RemoteException` as `RuntimeException` (but do not list it in the throws clause) -RethrowRemoteException: android.app.WallpaperManager#setWallpaperDimAmount(float): - Methods calling system APIs should rethrow `RemoteException` as `RuntimeException` (but do not list it in the throws clause) -RethrowRemoteException: android.app.WallpaperManager#setWallpaperDimmingAmount(float): - Methods calling system APIs should rethrow `RemoteException` as `RuntimeException` (but do not list it in the throws clause) + Protected methods not allowed; must be public: method android.service.notification.NotificationAssistantService.attachBaseContext(android.content.Context)} SamShouldBeLast: android.accounts.AccountManager#addAccount(String, String, String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 6, "callback", in android.accounts.AccountManager.addAccount) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean): - + SAM-compatible parameters (such as parameter 1, "listener", in android.accounts.AccountManager.addOnAccountsUpdatedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, String[]): - + SAM-compatible parameters (such as parameter 1, "listener", in android.accounts.AccountManager.addOnAccountsUpdatedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#confirmCredentials(android.accounts.Account, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 4, "callback", in android.accounts.AccountManager.confirmCredentials) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#editProperties(String, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 3, "callback", in android.accounts.AccountManager.editProperties) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#finishSession(android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 3, "callback", in android.accounts.AccountManager.finishSession) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#getAccountsByTypeAndFeatures(String, String[], android.accounts.AccountManagerCallback<android.accounts.Account[]>, android.os.Handler): - + SAM-compatible parameters (such as parameter 3, "callback", in android.accounts.AccountManager.getAccountsByTypeAndFeatures) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#getAuthToken(android.accounts.Account, String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 5, "callback", in android.accounts.AccountManager.getAuthToken) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#getAuthToken(android.accounts.Account, String, android.os.Bundle, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 5, "callback", in android.accounts.AccountManager.getAuthToken) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#getAuthToken(android.accounts.Account, String, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 4, "callback", in android.accounts.AccountManager.getAuthToken) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#getAuthTokenByFeatures(String, String, String[], android.app.Activity, android.os.Bundle, android.os.Bundle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 7, "callback", in android.accounts.AccountManager.getAuthTokenByFeatures) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#hasFeatures(android.accounts.Account, String[], android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler): - + SAM-compatible parameters (such as parameter 3, "callback", in android.accounts.AccountManager.hasFeatures) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#isCredentialsUpdateSuggested(android.accounts.Account, String, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler): - + SAM-compatible parameters (such as parameter 3, "callback", in android.accounts.AccountManager.isCredentialsUpdateSuggested) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#removeAccount(android.accounts.Account, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler): - + SAM-compatible parameters (such as parameter 2, "callback", in android.accounts.AccountManager.removeAccount) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#removeAccount(android.accounts.Account, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 3, "callback", in android.accounts.AccountManager.removeAccount) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#renameAccount(android.accounts.Account, String, android.accounts.AccountManagerCallback<android.accounts.Account>, android.os.Handler): - + SAM-compatible parameters (such as parameter 3, "callback", in android.accounts.AccountManager.renameAccount) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#startAddAccountSession(String, String, String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 6, "callback", in android.accounts.AccountManager.startAddAccountSession) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#startUpdateCredentialsSession(android.accounts.Account, String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 5, "callback", in android.accounts.AccountManager.startUpdateCredentialsSession) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.accounts.AccountManager#updateCredentials(android.accounts.Account, String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): - + SAM-compatible parameters (such as parameter 5, "callback", in android.accounts.AccountManager.updateCredentials) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.app.AlarmManager#set(int, long, String, android.app.AlarmManager.OnAlarmListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 4, "listener", in android.app.AlarmManager.set) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.app.AlarmManager#setExact(int, long, String, android.app.AlarmManager.OnAlarmListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 4, "listener", in android.app.AlarmManager.setExact) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.app.AlarmManager#setWindow(int, long, long, String, android.app.AlarmManager.OnAlarmListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 5, "listener", in android.app.AlarmManager.setWindow) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.app.WallpaperInfo#dump(android.util.Printer, String): - + SAM-compatible parameters (such as parameter 1, "pw", in android.app.WallpaperInfo.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.app.WallpaperManager#addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler): - -SamShouldBeLast: android.app.admin.DevicePolicyManager#installSystemUpdate(android.content.ComponentName, android.net.Uri, java.util.concurrent.Executor, android.app.admin.DevicePolicyManager.InstallSystemUpdateCallback): - + SAM-compatible parameters (such as parameter 1, "listener", in android.app.WallpaperManager.addOnColorsChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.content.IntentFilter#dump(android.util.Printer, String): - + SAM-compatible parameters (such as parameter 1, "du", in android.content.IntentFilter.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.content.pm.ApplicationInfo#dump(android.util.Printer, String): - + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.ApplicationInfo.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.content.pm.PackageItemInfo#dumpBack(android.util.Printer, String): - + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.PackageItemInfo.dumpBack) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.content.pm.PackageItemInfo#dumpFront(android.util.Printer, String): - + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.PackageItemInfo.dumpFront) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.content.pm.ResolveInfo#dump(android.util.Printer, String): - + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.ResolveInfo.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.location.Location#dump(android.util.Printer, String): - + SAM-compatible parameters (such as parameter 1, "pw", in android.location.Location.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler): - -SamShouldBeLast: android.location.LocationManager#registerGnssMeasurementsCallback(java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback): - -SamShouldBeLast: android.location.LocationManager#registerGnssNavigationMessageCallback(java.util.concurrent.Executor, android.location.GnssNavigationMessage.Callback): - -SamShouldBeLast: android.location.LocationManager#registerGnssStatusCallback(java.util.concurrent.Executor, android.location.GnssStatus.Callback): - + SAM-compatible parameters (such as parameter 1, "listener", in android.location.LocationManager.addNmeaListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(String, long, float, android.location.LocationListener, android.os.Looper): - -SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(String, long, float, java.util.concurrent.Executor, android.location.LocationListener): - -SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(android.location.LocationRequest, java.util.concurrent.Executor, android.location.LocationListener): - + SAM-compatible parameters (such as parameter 4, "listener", in android.location.LocationManager.requestLocationUpdates) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(long, float, android.location.Criteria, android.location.LocationListener, android.os.Looper): - -SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(long, float, android.location.Criteria, java.util.concurrent.Executor, android.location.LocationListener): - + SAM-compatible parameters (such as parameter 4, "listener", in android.location.LocationManager.requestLocationUpdates) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.location.LocationManager#requestSingleUpdate(String, android.location.LocationListener, android.os.Looper): - + SAM-compatible parameters (such as parameter 2, "listener", in android.location.LocationManager.requestSingleUpdate) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.location.LocationManager#requestSingleUpdate(android.location.Criteria, android.location.LocationListener, android.os.Looper): - + SAM-compatible parameters (such as parameter 2, "listener", in android.location.LocationManager.requestSingleUpdate) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioFocusRequest.Builder#setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioFocusRequest.Builder.setOnAudioFocusChangeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioManager#requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int): - + SAM-compatible parameters (such as parameter 1, "l", in android.media.AudioManager.requestAudioFocus) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioRecord#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): - -SamShouldBeLast: android.media.AudioRecord#registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback): - -SamShouldBeLast: android.media.AudioRecordingMonitor#registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback): - + SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioRecord.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioRouting#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioRouting.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioTrack#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioTrack.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.media.MediaCodec#setOnFrameRenderedListener(android.media.MediaCodec.OnFrameRenderedListener, android.os.Handler): + SAM-compatible parameters (such as parameter 1, "listener", in android.media.MediaCodec.setOnFrameRenderedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.MediaPlayer#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): SAM-compatible parameters (such as parameter 1, "listener", in android.media.MediaPlayer.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.MediaPlayer#setOnDrmInfoListener(android.media.MediaPlayer.OnDrmInfoListener, android.os.Handler): @@ -215,82 +159,65 @@ SamShouldBeLast: android.media.MediaPlayer#setOnDrmPreparedListener(android.medi SAM-compatible parameters (such as parameter 1, "listener", in android.media.MediaPlayer.setOnDrmPreparedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.MediaPlayer#setOnMediaTimeDiscontinuityListener(android.media.MediaPlayer.OnMediaTimeDiscontinuityListener, android.os.Handler): SAM-compatible parameters (such as parameter 1, "listener", in android.media.MediaPlayer.setOnMediaTimeDiscontinuityListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions -SamShouldBeLast: android.media.MediaPlayer#setOnRtpRxNoticeListener(android.content.Context, android.media.MediaPlayer.OnRtpRxNoticeListener, android.os.Handler): - SAM-compatible parameters (such as parameter 2, "listener", in android.media.MediaPlayer.setOnRtpRxNoticeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.MediaPlayer#setOnSubtitleDataListener(android.media.MediaPlayer.OnSubtitleDataListener, android.os.Handler): SAM-compatible parameters (such as parameter 1, "listener", in android.media.MediaPlayer.setOnSubtitleDataListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.MediaRecorder#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): - -SamShouldBeLast: android.media.MediaRecorder#registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback): - + SAM-compatible parameters (such as parameter 1, "listener", in android.media.MediaRecorder.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.session.MediaSessionManager#addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName): - + SAM-compatible parameters (such as parameter 1, "sessionListener", in android.media.session.MediaSessionManager.addOnActiveSessionsChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.session.MediaSessionManager#addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName, android.os.Handler): - + SAM-compatible parameters (such as parameter 1, "sessionListener", in android.media.session.MediaSessionManager.addOnActiveSessionsChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.session.MediaSessionManager#addOnSession2TokensChangedListener(android.media.session.MediaSessionManager.OnSession2TokensChangedListener, android.os.Handler): - -SamShouldBeLast: android.media.session.MediaSessionManager#registerCallback(java.util.concurrent.Executor, android.media.session.MediaSessionManager.Callback): - + SAM-compatible parameters (such as parameter 1, "listener", in android.media.session.MediaSessionManager.addOnSession2TokensChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.nfc.NfcAdapter#enableReaderMode(android.app.Activity, android.nfc.NfcAdapter.ReaderCallback, int, android.os.Bundle): - + SAM-compatible parameters (such as parameter 2, "callback", in android.nfc.NfcAdapter.enableReaderMode) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.nfc.NfcAdapter#ignore(android.nfc.Tag, int, android.nfc.NfcAdapter.OnTagRemovedListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 3, "tagRemovedListener", in android.nfc.NfcAdapter.ignore) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.nfc.NfcAdapter#setBeamPushUrisCallback(android.nfc.NfcAdapter.CreateBeamUrisCallback, android.app.Activity): - + SAM-compatible parameters (such as parameter 1, "callback", in android.nfc.NfcAdapter.setBeamPushUrisCallback) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.nfc.NfcAdapter#setNdefPushMessageCallback(android.nfc.NfcAdapter.CreateNdefMessageCallback, android.app.Activity, android.app.Activity...): - + SAM-compatible parameters (such as parameter 1, "callback", in android.nfc.NfcAdapter.setNdefPushMessageCallback) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.nfc.NfcAdapter#setOnNdefPushCompleteCallback(android.nfc.NfcAdapter.OnNdefPushCompleteCallback, android.app.Activity, android.app.Activity...): - + SAM-compatible parameters (such as parameter 1, "callback", in android.nfc.NfcAdapter.setOnNdefPushCompleteCallback) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.Binder#attachInterface(android.os.IInterface, String): - + SAM-compatible parameters (such as parameter 1, "owner", in android.os.Binder.attachInterface) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.Binder#linkToDeath(android.os.IBinder.DeathRecipient, int): - + SAM-compatible parameters (such as parameter 1, "recipient", in android.os.Binder.linkToDeath) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.Binder#unlinkToDeath(android.os.IBinder.DeathRecipient, int): - + SAM-compatible parameters (such as parameter 1, "recipient", in android.os.Binder.unlinkToDeath) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.Handler#dump(android.util.Printer, String): - + SAM-compatible parameters (such as parameter 1, "pw", in android.os.Handler.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.Handler#postAtTime(Runnable, Object, long): - + SAM-compatible parameters (such as parameter 1, "r", in android.os.Handler.postAtTime) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.Handler#postAtTime(Runnable, long): - + SAM-compatible parameters (such as parameter 1, "r", in android.os.Handler.postAtTime) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.Handler#postDelayed(Runnable, Object, long): - + SAM-compatible parameters (such as parameter 1, "r", in android.os.Handler.postDelayed) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.Handler#postDelayed(Runnable, long): - + SAM-compatible parameters (such as parameter 1, "r", in android.os.Handler.postDelayed) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.Handler#removeCallbacks(Runnable, Object): - + SAM-compatible parameters (such as parameter 1, "r", in android.os.Handler.removeCallbacks) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.IBinder#linkToDeath(android.os.IBinder.DeathRecipient, int): - + SAM-compatible parameters (such as parameter 1, "recipient", in android.os.IBinder.linkToDeath) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.IBinder#unlinkToDeath(android.os.IBinder.DeathRecipient, int): - + SAM-compatible parameters (such as parameter 1, "recipient", in android.os.IBinder.unlinkToDeath) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.RecoverySystem#verifyPackage(java.io.File, android.os.RecoverySystem.ProgressListener, java.io.File): - + SAM-compatible parameters (such as parameter 2, "listener", in android.os.RecoverySystem.verifyPackage) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity, android.security.KeyChainAliasCallback, String[], java.security.Principal[], String, int, String): SAM-compatible parameters (such as parameter 2, "response", in android.security.KeyChain.choosePrivateKeyAlias) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity, android.security.KeyChainAliasCallback, String[], java.security.Principal[], android.net.Uri, String): SAM-compatible parameters (such as parameter 2, "response", in android.security.KeyChain.choosePrivateKeyAlias) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.view.View#postDelayed(Runnable, long): - + SAM-compatible parameters (such as parameter 1, "action", in android.view.View.postDelayed) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.view.View#postOnAnimationDelayed(Runnable, long): - + SAM-compatible parameters (such as parameter 1, "action", in android.view.View.postOnAnimationDelayed) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.view.View#scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long): - + SAM-compatible parameters (such as parameter 2, "what", in android.view.View.scheduleDrawable) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.view.Window#addOnFrameMetricsAvailableListener(android.view.Window.OnFrameMetricsAvailableListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 1, "listener", in android.view.Window.addOnFrameMetricsAvailableListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.view.accessibility.AccessibilityManager#addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 1, "listener", in android.view.accessibility.AccessibilityManager.addAccessibilityStateChangeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.view.accessibility.AccessibilityManager#addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, android.os.Handler): - + SAM-compatible parameters (such as parameter 1, "listener", in android.view.accessibility.AccessibilityManager.addTouchExplorationStateChangeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.webkit.WebChromeClient#onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback<android.net.Uri[]>, android.webkit.WebChromeClient.FileChooserParams): - - - -ServiceName: android.content.Context#CLOUDSEARCH_SERVICE: - - -UserHandleName: android.app.search.SearchAction.Builder#setUserHandle(android.os.UserHandle): - Method taking UserHandle should be named `doFooAsUser` or `queryFooForUser`, was `setUserHandle` -UserHandleName: android.app.search.SearchTarget.Builder#setUserHandle(android.os.UserHandle): - -UserHandleName: android.app.smartspace.SmartspaceAction.Builder#setUserHandle(android.os.UserHandle): - Method taking UserHandle should be named `doFooAsUser` or `queryFooForUser`, was `setUserHandle` + SAM-compatible parameters (such as parameter 2, "filePathCallback", in android.webkit.WebChromeClient.onShowFileChooser) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions diff --git a/core/api/test-lint-baseline.txt b/core/api/test-lint-baseline.txt index 01604e6becf0..0a906bee6fad 100644 --- a/core/api/test-lint-baseline.txt +++ b/core/api/test-lint-baseline.txt @@ -1,920 +1,270 @@ // Baseline format: 1.0 AcronymName: android.app.NotificationChannel#isImportanceLockedByOEM(): - + Acronyms should not be capitalized in method names: was `isImportanceLockedByOEM`, should this be `isImportanceLockedByOem`? AcronymName: android.app.NotificationChannel#setImportanceLockedByOEM(boolean): - - - -ActionValue: android.location.Location#EXTRA_NO_GPS_LOCATION: - -ActionValue: android.net.TetheringManager#ACTION_TETHER_STATE_CHANGED: - -ActionValue: android.net.TetheringManager#EXTRA_ACTIVE_TETHER: - -ActionValue: android.net.TetheringManager#EXTRA_AVAILABLE_TETHER: - -ActionValue: android.net.TetheringManager#EXTRA_ERRORED_TETHER: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_ADDITIONAL_CALL_INFO: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_CALL_RAT_TYPE: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_CHILD_NUMBER: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_CNA: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_CNAP: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_CODEC: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_DIALSTRING: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_DISPLAY_TEXT: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_EMERGENCY_CALL: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_IS_CALL_PULL: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_OI: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_OIR: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_REMOTE_URI: - -ActionValue: android.telephony.ims.ImsCallProfile#EXTRA_USSD: - -ActionValue: android.telephony.ims.ImsReasonInfo#EXTRA_MSG_SERVICE_NOT_AUTHORIZED: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#ACTION_CLEANUP: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#ACTION_DOWNLOAD_RESULT_INTERNAL: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#ACTION_FILE_DESCRIPTOR_REQUEST: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_FD_COUNT: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_FINAL_URI: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_FREE_URI_LIST: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_PAUSED_LIST: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_PAUSED_URI_LIST: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_SERVICE_ID: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_TEMP_FILES_IN_USE: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_TEMP_FILE_ROOT: - -ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_TEMP_LIST: - - - -AllUpper: android.media.audiopolicy.AudioProductStrategy#sDefaultAttributes: - Constant field names must be named with only upper case characters: `android.media.audiopolicy.AudioProductStrategy#sDefaultAttributes`, should be `S_DEFAULT_ATTRIBUTES`? - - -ArrayReturn: android.app.UiAutomation#executeShellCommandRw(String): - -ArrayReturn: android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel#KeyphraseSoundModel(java.util.UUID, java.util.UUID, byte[], android.hardware.soundtrigger.SoundTrigger.Keyphrase[]) parameter #3: - -ArrayReturn: android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel#KeyphraseSoundModel(java.util.UUID, java.util.UUID, byte[], android.hardware.soundtrigger.SoundTrigger.Keyphrase[], int) parameter #3: - -ArrayReturn: android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel#getKeyphrases(): - -ArrayReturn: android.location.GnssMeasurementsEvent#GnssMeasurementsEvent(android.location.GnssClock, android.location.GnssMeasurement[]) parameter #1: - + Acronyms should not be capitalized in method names: was `setImportanceLockedByOEM`, should this be `setImportanceLockedByOem`? + + ArrayReturn: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #10: - + Method parameter should be Collection<Descriptor> (or subclass) instead of raw array; was `android.media.audiofx.AudioEffect.Descriptor[]` ArrayReturn: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #11: - -ArrayReturn: android.metrics.LogMaker#LogMaker(Object[]) parameter #0: - -ArrayReturn: android.metrics.LogMaker#deserialize(Object[]) parameter #0: - -ArrayReturn: android.metrics.LogMaker#serialize(): - -ArrayReturn: android.net.TestNetworkManager#createTunInterface(android.net.LinkAddress[]) parameter #0: - -ArrayReturn: android.os.HwBlob#wrapArray(boolean[]): - -ArrayReturn: android.os.HwBlob#wrapArray(byte[]): - -ArrayReturn: android.os.HwBlob#wrapArray(double[]): - -ArrayReturn: android.os.HwBlob#wrapArray(float[]): - -ArrayReturn: android.os.HwBlob#wrapArray(int[]): - -ArrayReturn: android.os.HwBlob#wrapArray(long[]): - -ArrayReturn: android.os.HwBlob#wrapArray(short[]): - -ArrayReturn: android.os.NativeHandle#NativeHandle(java.io.FileDescriptor[], int[], boolean) parameter #0: - -ArrayReturn: android.os.NativeHandle#getFileDescriptors(): - -ArrayReturn: android.security.keystore.AttestationUtils#attestDeviceIds(android.content.Context, int[], byte[]): - -ArrayReturn: android.telephony.ims.ImsUtListener#onUtConfigurationCallBarringQueried(int, android.telephony.ims.ImsSsInfo[]) parameter #1: - -ArrayReturn: android.telephony.ims.ImsUtListener#onUtConfigurationCallForwardQueried(int, android.telephony.ims.ImsCallForwardInfo[]) parameter #1: - -ArrayReturn: android.telephony.ims.ImsUtListener#onUtConfigurationCallWaitingQueried(int, android.telephony.ims.ImsSsInfo[]) parameter #1: - -ArrayReturn: android.telephony.ims.stub.ImsRegistrationImplBase#onSubscriberAssociatedUriChanged(android.net.Uri[]) parameter #0: - + Method parameter should be Collection<Descriptor> (or subclass) instead of raw array; was `android.media.audiofx.AudioEffect.Descriptor[]` ArrayReturn: android.view.Display#getSupportedWideColorGamut(): - + Method should return Collection<ColorSpace> (or subclass) instead of raw array; was `android.graphics.ColorSpace[]` ArrayReturn: android.view.FocusFinder#sort(android.view.View[], int, int, android.view.ViewGroup, boolean) parameter #0: - -ArrayReturn: android.view.contentcapture.ViewNode#getAutofillOptions(): - + Method parameter should be Collection<View> (or subclass) instead of raw array; was `android.view.View[]` ArrayReturn: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillOptions(CharSequence[]) parameter #0: - -ArrayReturn: android.view.inspector.InspectableProperty#enumMapping(): - -ArrayReturn: android.view.inspector.InspectableProperty#flagMapping(): - - - -AutoBoxing: android.os.HwBlob#wrapArray(byte[]): - -AutoBoxing: android.os.HwBlob#wrapArray(double[]): - -AutoBoxing: android.os.HwBlob#wrapArray(float[]): - -AutoBoxing: android.os.HwBlob#wrapArray(int[]): - -AutoBoxing: android.os.HwBlob#wrapArray(long[]): - -AutoBoxing: android.os.HwBlob#wrapArray(short[]): - -AutoBoxing: android.os.VintfObject#getTargetFrameworkCompatibilityMatrixVersion(): - - - -BannedThrow: android.app.ActivityTaskManager#removeStacksInWindowingModes(int[]): - -BannedThrow: android.app.ActivityTaskManager#removeStacksWithActivityTypes(int[]): - -BannedThrow: android.app.ActivityTaskManager#setTaskWindowingMode(int, int, boolean): - -BannedThrow: android.app.ActivityTaskManager#setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean): - -BannedThrow: android.media.audiofx.AudioEffect#getParameter(byte[], byte[]): - -BannedThrow: android.media.audiofx.AudioEffect#getParameter(int, byte[]): - -BannedThrow: android.media.audiofx.AudioEffect#getParameter(int, int[]): - -BannedThrow: android.media.audiofx.AudioEffect#getParameter(int, short[]): - -BannedThrow: android.media.audiofx.AudioEffect#getParameter(int[], short[]): - -BannedThrow: android.media.audiofx.AudioEffect#setParameter(byte[], byte[]): - -BannedThrow: android.media.audiofx.AudioEffect#setParameter(int, byte[]): - -BannedThrow: android.media.audiofx.AudioEffect#setParameter(int, int): - -BannedThrow: android.media.audiofx.AudioEffect#setParameter(int, short): - -BannedThrow: android.media.audiofx.AudioEffect#setParameter(int[], byte[]): - -BannedThrow: android.media.audiofx.AudioEffect#setParameter(int[], int[]): - -BannedThrow: android.media.audiopolicy.AudioMix.Builder#Builder(android.media.audiopolicy.AudioMixingRule): - -BannedThrow: android.media.audiopolicy.AudioMix.Builder#build(): - -BannedThrow: android.media.audiopolicy.AudioMix.Builder#setDevice(android.media.AudioDeviceInfo): - -BannedThrow: android.media.audiopolicy.AudioMix.Builder#setFormat(android.media.AudioFormat): - -BannedThrow: android.media.audiopolicy.AudioMix.Builder#setRouteFlags(int): - -BannedThrow: android.media.audiopolicy.AudioMixingRule.Builder#addMixRule(int, Object): - -BannedThrow: android.media.audiopolicy.AudioMixingRule.Builder#addRule(android.media.AudioAttributes, int): - -BannedThrow: android.media.audiopolicy.AudioMixingRule.Builder#excludeMixRule(int, Object): - -BannedThrow: android.media.audiopolicy.AudioMixingRule.Builder#excludeRule(android.media.AudioAttributes, int): - -BannedThrow: android.media.audiopolicy.AudioPolicy#createAudioRecordSink(android.media.audiopolicy.AudioMix): - -BannedThrow: android.media.audiopolicy.AudioPolicy#createAudioTrackSource(android.media.audiopolicy.AudioMix): - -BannedThrow: android.media.audiopolicy.AudioPolicy#setFocusDuckingBehavior(int): - -BannedThrow: android.media.audiopolicy.AudioPolicy.Builder#addMix(android.media.audiopolicy.AudioMix): - -BannedThrow: android.media.audiopolicy.AudioPolicy.Builder#setLooper(android.os.Looper): - -BannedThrow: android.os.HwBinder#getService(String, String): - -BannedThrow: android.os.HwBinder#getService(String, String, boolean): - -BannedThrow: android.os.Process#getThreadScheduler(int): - - - -BuilderSetStyle: android.media.audiopolicy.AudioMixingRule.Builder#allowPrivilegedPlaybackCapture(boolean): - -BuilderSetStyle: android.media.audiopolicy.AudioMixingRule.Builder#excludeMixRule(int, Object): - -BuilderSetStyle: android.media.audiopolicy.AudioMixingRule.Builder#excludeRule(android.media.AudioAttributes, int): - -BuilderSetStyle: android.net.NetworkCapabilities.Builder#removeCapability(int): - -BuilderSetStyle: android.net.NetworkCapabilities.Builder#removeTransportType(int): - -BuilderSetStyle: android.net.metrics.RaEvent.Builder#updateDnsslLifetime(long): - -BuilderSetStyle: android.net.metrics.RaEvent.Builder#updatePrefixPreferredLifetime(long): - -BuilderSetStyle: android.net.metrics.RaEvent.Builder#updatePrefixValidLifetime(long): - -BuilderSetStyle: android.net.metrics.RaEvent.Builder#updateRdnssLifetime(long): - -BuilderSetStyle: android.net.metrics.RaEvent.Builder#updateRouteInfoLifetime(long): - -BuilderSetStyle: android.net.metrics.RaEvent.Builder#updateRouterLifetime(long): - -BuilderSetStyle: android.os.StrictMode.ThreadPolicy.Builder#detectExplicitGc(): - -BuilderSetStyle: android.os.StrictMode.VmPolicy.Builder#detectIncorrectContextUse(): - -BuilderSetStyle: android.os.StrictMode.VmPolicy.Builder#permitIncorrectContextUse(): - + Method parameter should be Collection<CharSequence> (or subclass) instead of raw array; was `java.lang.CharSequence[]` -CallbackInterface: android.app.prediction.AppPredictor.Callback: - -CallbackInterface: android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback: - -CallbackInterface: android.widget.Magnifier.Callback: - +AutoBoxing: android.os.VintfObject#getTargetFrameworkCompatibilityMatrixVersion(): + Must avoid boxed primitives (`java.lang.Long`) -CallbackMethodName: android.os.RemoteCallback: - +BuilderSetStyle: android.os.StrictMode.ThreadPolicy.Builder#detectExplicitGc(): + Builder methods names should use setFoo() / addFoo() / clearFoo() style: method android.os.StrictMode.ThreadPolicy.Builder.detectExplicitGc() +BuilderSetStyle: android.os.StrictMode.VmPolicy.Builder#permitIncorrectContextUse(): + Builder methods names should use setFoo() / addFoo() / clearFoo() style: method android.os.StrictMode.VmPolicy.Builder.permitIncorrectContextUse() ConcreteCollection: android.content.AutofillOptions#disabledActivities: - + Field type is concrete collection (`android.util.ArrayMap`); must be higher-level interface ConcreteCollection: android.content.AutofillOptions#whitelistedActivitiesForAugmentedAutofill: - + Field type is concrete collection (`android.util.ArraySet`); must be higher-level interface ConcreteCollection: android.content.ContentCaptureOptions#ContentCaptureOptions(int, int, int, int, int, android.util.ArraySet<android.content.ComponentName>) parameter #5: - + Parameter type is concrete collection (`android.util.ArraySet`); must be higher-level interface ConcreteCollection: android.content.ContentCaptureOptions#whitelistedComponents: - + Field type is concrete collection (`android.util.ArraySet`); must be higher-level interface ConcreteCollection: android.database.sqlite.SQLiteDebug.PagerStats#dbStats: - -ConcreteCollection: android.os.HwParcel#readBoolVector(): - -ConcreteCollection: android.os.HwParcel#readDoubleVector(): - -ConcreteCollection: android.os.HwParcel#readFloatVector(): - -ConcreteCollection: android.os.HwParcel#readInt16Vector(): - -ConcreteCollection: android.os.HwParcel#readInt32Vector(): - -ConcreteCollection: android.os.HwParcel#readInt64Vector(): - -ConcreteCollection: android.os.HwParcel#readInt8Vector(): - -ConcreteCollection: android.os.HwParcel#readNativeHandleVector(): - -ConcreteCollection: android.os.HwParcel#readStringVector(): - -ConcreteCollection: android.os.HwParcel#writeBoolVector(java.util.ArrayList<java.lang.Boolean>) parameter #0: - -ConcreteCollection: android.os.HwParcel#writeDoubleVector(java.util.ArrayList<java.lang.Double>) parameter #0: - -ConcreteCollection: android.os.HwParcel#writeFloatVector(java.util.ArrayList<java.lang.Float>) parameter #0: - -ConcreteCollection: android.os.HwParcel#writeInt16Vector(java.util.ArrayList<java.lang.Short>) parameter #0: - -ConcreteCollection: android.os.HwParcel#writeInt32Vector(java.util.ArrayList<java.lang.Integer>) parameter #0: - -ConcreteCollection: android.os.HwParcel#writeInt64Vector(java.util.ArrayList<java.lang.Long>) parameter #0: - -ConcreteCollection: android.os.HwParcel#writeInt8Vector(java.util.ArrayList<java.lang.Byte>) parameter #0: - -ConcreteCollection: android.os.HwParcel#writeNativeHandleVector(java.util.ArrayList<android.os.NativeHandle>) parameter #0: - -ConcreteCollection: android.os.HwParcel#writeStringVector(java.util.ArrayList<java.lang.String>) parameter #0: - + Field type is concrete collection (`java.util.ArrayList`); must be higher-level interface ConcreteCollection: android.service.autofill.CompositeUserData#getFieldClassificationAlgorithms(): - + Return type is concrete collection (`android.util.ArrayMap`); must be higher-level interface ConcreteCollection: android.service.autofill.CompositeUserData#getFieldClassificationArgs(): - + Return type is concrete collection (`android.util.ArrayMap`); must be higher-level interface ConcreteCollection: android.service.autofill.InternalTransformation#batchApply(android.service.autofill.ValueFinder, android.widget.RemoteViews, java.util.ArrayList<android.util.Pair<java.lang.Integer,android.service.autofill.InternalTransformation>>) parameter #2: - + Parameter type is concrete collection (`java.util.ArrayList`); must be higher-level interface ConcreteCollection: android.service.autofill.UserData#getFieldClassificationAlgorithms(): - -ConcreteCollection: android.telephony.ims.ImsConferenceState#mParticipants: - + Return type is concrete collection (`android.util.ArrayMap`); must be higher-level interface ContextFirst: android.os.VibrationEffect#get(android.net.Uri, android.content.Context) parameter #1: - - - -ContextNameSuffix: android.telephony.mbms.vendor.MbmsGroupCallServiceBase: - + Context is distinct, so it must be the first argument (method `get`) EndsWithImpl: android.view.contentcapture.ViewNode.ViewStructureImpl: - + Don't expose your implementation details: `ViewStructureImpl` ends with `Impl` Enum: android.view.inspector.InspectableProperty.ValueType: - - - -EqualsAndHashCode: android.app.prediction.AppPredictionContext#equals(Object): - -EqualsAndHashCode: android.app.prediction.AppTarget#equals(Object): - -EqualsAndHashCode: android.app.prediction.AppTargetEvent#equals(Object): - -EqualsAndHashCode: android.net.apf.ApfCapabilities#equals(Object): - -EqualsAndHashCode: android.net.metrics.ApfProgramEvent#equals(Object): - -EqualsAndHashCode: android.net.metrics.ApfStats#equals(Object): - -EqualsAndHashCode: android.net.metrics.DhcpClientEvent#equals(Object): - -EqualsAndHashCode: android.net.metrics.IpManagerEvent#equals(Object): - -EqualsAndHashCode: android.net.metrics.IpReachabilityEvent#equals(Object): - -EqualsAndHashCode: android.net.metrics.NetworkEvent#equals(Object): - -EqualsAndHashCode: android.net.metrics.RaEvent#equals(Object): - -EqualsAndHashCode: android.net.metrics.ValidationProbeEvent#equals(Object): - -EqualsAndHashCode: android.os.IncidentManager.PendingReport#equals(Object): - + Enums are discouraged in Android APIs + + EqualsAndHashCode: android.os.StrictMode.ViolationInfo#hashCode(): - + Must override both equals and hashCode; missing one in android.os.StrictMode.ViolationInfo -ExecutorRegistration: android.content.pm.PackageManager#addOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener): - -ExecutorRegistration: android.hardware.camera2.CameraDevice#createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler): - ExecutorRegistration: android.media.audiofx.AudioEffect#setParameterListener(android.media.audiofx.AudioEffect.OnParameterChangeListener): - -ExecutorRegistration: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener): - -ExecutorRegistration: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener): - -ExecutorRegistration: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyVolumeCallback(android.media.audiopolicy.AudioPolicy.AudioPolicyVolumeCallback): - -ExecutorRegistration: android.os.IncidentManager#cancelAuthorization(android.os.IncidentManager.AuthListener): - -ExecutorRegistration: android.os.IncidentManager#requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener): - -ExecutorRegistration: android.os.RemoteCallback#RemoteCallback(android.os.RemoteCallback.OnResultListener, android.os.Handler): - + Registration methods should have overload that accepts delivery Executor: `setParameterListener` ExecutorRegistration: android.permission.PermissionControllerManager#countPermissionApps(java.util.List<java.lang.String>, int, android.permission.PermissionControllerManager.OnCountPermissionAppsResultCallback, android.os.Handler): - + Registration methods should have overload that accepts delivery Executor: `countPermissionApps` ExecutorRegistration: android.permission.PermissionControllerManager#getAppPermissions(String, android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, android.os.Handler): - + Registration methods should have overload that accepts delivery Executor: `getAppPermissions` ExecutorRegistration: android.service.watchdog.ExplicitHealthCheckService#setCallback(android.os.RemoteCallback): - -ExecutorRegistration: android.telephony.ims.stub.ImsCallSessionImplBase#setListener(android.telephony.ims.ImsCallSessionListener): - -ExecutorRegistration: android.telephony.ims.stub.ImsUtImplBase#setListener(android.telephony.ims.ImsUtListener): - -ExecutorRegistration: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener): - -ExecutorRegistration: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener): - -ExecutorRegistration: android.telephony.mbms.vendor.MbmsDownloadServiceBase#initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback): - -ExecutorRegistration: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int): - -ExecutorRegistration: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#startGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, android.telephony.mbms.GroupCallCallback): - -ExecutorRegistration: android.telephony.mbms.vendor.MbmsStreamingServiceBase#initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int): - -ExecutorRegistration: android.telephony.mbms.vendor.MbmsStreamingServiceBase#startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback): - + Registration methods should have overload that accepts delivery Executor: `setCallback` ExecutorRegistration: android.window.WindowOrganizer#applySyncTransaction(android.window.WindowContainerTransaction, android.window.WindowContainerTransactionCallback): - + Registration methods should have overload that accepts delivery Executor: `applySyncTransaction` ForbiddenSuperClass: android.app.AppDetailsActivity: - + AppDetailsActivity should not extend `Activity`. Activity subclasses are impossible to compose. Expose a composable API instead. -GenericException: android.app.prediction.AppPredictor#finalize(): - GenericException: android.service.autofill.CharSequenceTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int): - + Methods must not throw generic exceptions (`java.lang.Exception`) GenericException: android.service.autofill.DateTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int): - + Methods must not throw generic exceptions (`java.lang.Exception`) GenericException: android.service.autofill.ImageTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int): - -GenericException: android.service.autofill.augmented.FillWindow#finalize(): - - - -GetterOnBuilder: android.hardware.display.BrightnessConfiguration.Builder#getMaxCorrectionsByCategory(): - -GetterOnBuilder: android.hardware.display.BrightnessConfiguration.Builder#getMaxCorrectionsByPackageName(): - + Methods must not throw generic exceptions (`java.lang.Exception`) -GetterSetterNames: android.app.NotificationChannel#isBlockableSystem(): - -GetterSetterNames: android.app.NotificationChannel#isImportanceLockedByCriticalDeviceFunction(): - -GetterSetterNames: android.app.NotificationChannel#isImportanceLockedByOEM(): - GetterSetterNames: android.location.GnssClock#setBiasNanos(double): - + Symmetric method for `hasBiasNanos` must be named `setHasBiasNanos`; was `setBiasNanos` GetterSetterNames: android.location.GnssClock#setBiasUncertaintyNanos(double): - + Symmetric method for `hasBiasUncertaintyNanos` must be named `setHasBiasUncertaintyNanos`; was `setBiasUncertaintyNanos` GetterSetterNames: android.location.GnssClock#setDriftNanosPerSecond(double): - + Symmetric method for `hasDriftNanosPerSecond` must be named `setHasDriftNanosPerSecond`; was `setDriftNanosPerSecond` GetterSetterNames: android.location.GnssClock#setDriftUncertaintyNanosPerSecond(double): - + Symmetric method for `hasDriftUncertaintyNanosPerSecond` must be named `setHasDriftUncertaintyNanosPerSecond`; was `setDriftUncertaintyNanosPerSecond` GetterSetterNames: android.location.GnssClock#setElapsedRealtimeNanos(long): - + Symmetric method for `hasElapsedRealtimeNanos` must be named `setHasElapsedRealtimeNanos`; was `setElapsedRealtimeNanos` GetterSetterNames: android.location.GnssClock#setElapsedRealtimeUncertaintyNanos(double): - + Symmetric method for `hasElapsedRealtimeUncertaintyNanos` must be named `setHasElapsedRealtimeUncertaintyNanos`; was `setElapsedRealtimeUncertaintyNanos` GetterSetterNames: android.location.GnssClock#setFullBiasNanos(long): - + Symmetric method for `hasFullBiasNanos` must be named `setHasFullBiasNanos`; was `setFullBiasNanos` GetterSetterNames: android.location.GnssClock#setLeapSecond(int): - + Symmetric method for `hasLeapSecond` must be named `setHasLeapSecond`; was `setLeapSecond` GetterSetterNames: android.location.GnssClock#setReferenceCarrierFrequencyHzForIsb(double): - + Symmetric method for `hasReferenceCarrierFrequencyHzForIsb` must be named `setHasReferenceCarrierFrequencyHzForIsb`; was `setReferenceCarrierFrequencyHzForIsb` GetterSetterNames: android.location.GnssClock#setReferenceCodeTypeForIsb(String): - + Symmetric method for `hasReferenceCodeTypeForIsb` must be named `setHasReferenceCodeTypeForIsb`; was `setReferenceCodeTypeForIsb` GetterSetterNames: android.location.GnssClock#setReferenceConstellationTypeForIsb(int): - + Symmetric method for `hasReferenceConstellationTypeForIsb` must be named `setHasReferenceConstellationTypeForIsb`; was `setReferenceConstellationTypeForIsb` GetterSetterNames: android.location.GnssClock#setTimeUncertaintyNanos(double): - + Symmetric method for `hasTimeUncertaintyNanos` must be named `setHasTimeUncertaintyNanos`; was `setTimeUncertaintyNanos` GetterSetterNames: android.location.GnssMeasurement#setBasebandCn0DbHz(double): - + Symmetric method for `hasBasebandCn0DbHz` must be named `setHasBasebandCn0DbHz`; was `setBasebandCn0DbHz` GetterSetterNames: android.location.GnssMeasurement#setCarrierFrequencyHz(float): - + Symmetric method for `hasCarrierFrequencyHz` must be named `setHasCarrierFrequencyHz`; was `setCarrierFrequencyHz` GetterSetterNames: android.location.GnssMeasurement#setCodeType(String): - + Symmetric method for `hasCodeType` must be named `setHasCodeType`; was `setCodeType` GetterSetterNames: android.location.GnssMeasurement#setCorrelationVectors(java.util.Collection<android.location.CorrelationVector>): - + Symmetric method for `hasCorrelationVectors` must be named `setHasCorrelationVectors`; was `setCorrelationVectors` GetterSetterNames: android.location.GnssMeasurement#setFullInterSignalBiasNanos(double): - + Symmetric method for `hasFullInterSignalBiasNanos` must be named `setHasFullInterSignalBiasNanos`; was `setFullInterSignalBiasNanos` GetterSetterNames: android.location.GnssMeasurement#setFullInterSignalBiasUncertaintyNanos(double): - + Symmetric method for `hasFullInterSignalBiasUncertaintyNanos` must be named `setHasFullInterSignalBiasUncertaintyNanos`; was `setFullInterSignalBiasUncertaintyNanos` GetterSetterNames: android.location.GnssMeasurement#setSatelliteInterSignalBiasNanos(double): - + Symmetric method for `hasSatelliteInterSignalBiasNanos` must be named `setHasSatelliteInterSignalBiasNanos`; was `setSatelliteInterSignalBiasNanos` GetterSetterNames: android.location.GnssMeasurement#setSatelliteInterSignalBiasUncertaintyNanos(double): - + Symmetric method for `hasSatelliteInterSignalBiasUncertaintyNanos` must be named `setHasSatelliteInterSignalBiasUncertaintyNanos`; was `setSatelliteInterSignalBiasUncertaintyNanos` GetterSetterNames: android.location.GnssMeasurement#setSatellitePvt(android.location.SatellitePvt): - + Symmetric method for `hasSatellitePvt` must be named `setHasSatellitePvt`; was `setSatellitePvt` GetterSetterNames: android.location.GnssMeasurement#setSnrInDb(double): - -GetterSetterNames: android.location.LocationRequest#isLocationSettingsIgnored(): - -GetterSetterNames: android.location.LocationRequest#isLowPowerMode(): - + Symmetric method for `hasSnrInDb` must be named `setHasSnrInDb`; was `setSnrInDb` GetterSetterNames: android.net.NetworkPolicyManager#getRestrictBackground(): Symmetric method for `setRestrictBackground` must be named `isRestrictBackground`; was `getRestrictBackground` -GetterSetterNames: android.os.IncidentReportArgs#isAll(): - -GetterSetterNames: android.service.notification.NotificationStats#setDirectReplied(): - -GetterSetterNames: android.service.notification.NotificationStats#setExpanded(): - -GetterSetterNames: android.service.notification.NotificationStats#setSeen(): - -GetterSetterNames: android.service.notification.NotificationStats#setSnoozed(): - -GetterSetterNames: android.service.notification.NotificationStats#setViewedSettings(): - -GetterSetterNames: android.view.View#isAutofilled(): - -GetterSetterNames: android.view.View#isDefaultFocusHighlightEnabled(): - - - -IllegalStateException: android.media.audiopolicy.AudioMix.Builder#build(): - - - -IntentBuilderName: android.app.backup.BackupManager#getConfigurationIntent(String): - -IntentBuilderName: android.app.backup.BackupManager#getDataManagementIntent(String): - + + IntentBuilderName: android.hardware.soundtrigger.KeyphraseEnrollmentInfo#getManageKeyphraseIntent(int, String, java.util.Locale): - + Methods creating an Intent should be named `create<Foo>Intent()`, was `getManageKeyphraseIntent` IntentName: android.provider.Settings.Secure#VOICE_INTERACTION_SERVICE: - + Intent action constant name must be ACTION_FOO: VOICE_INTERACTION_SERVICE IntentName: android.provider.Telephony.Sms.Intents#SMS_CARRIER_PROVISION_ACTION: - -IntentName: android.service.notification.Adjustment#KEY_CONTEXTUAL_ACTIONS: - + Intent action constant name must be ACTION_FOO: SMS_CARRIER_PROVISION_ACTION -InterfaceConstant: android.service.autofill.AutofillFieldClassificationService#SERVICE_INTERFACE: - -InterfaceConstant: android.service.autofill.augmented.AugmentedAutofillService#SERVICE_INTERFACE: - -InterfaceConstant: android.service.contentcapture.ContentCaptureService#SERVICE_INTERFACE: - -InterfaceConstant: android.service.notification.NotificationAssistantService#SERVICE_INTERFACE: - -InterfaceConstant: android.telecom.PhoneAccountSuggestionService#SERVICE_INTERFACE: - - - -InternalField: android.media.audiopolicy.AudioProductStrategy#sDefaultAttributes: - Internal field sDefaultAttributes must not be exposed -InternalField: android.telephony.ims.ImsConferenceState#mParticipants: - +KotlinOperator: android.os.PackageTagsList#contains(android.os.PackageTagsList): + Method can be invoked as a "in" operator from Kotlin: `contains` (this is usually desirable; just make sure it makes sense for this type of object) +KotlinOperator: android.util.SparseArrayMap#get(int, K): + Method can be invoked with an indexing operator from Kotlin: `get` (this is usually desirable; just make sure it makes sense for this type of object) -KotlinOperator: android.os.WorkSource#get(int): - -KotlinOperator: android.util.SparseArrayMap#get(int, K): - -KotlinOperator: android.util.SparseArrayMap#get(int, String): - - - -ListenerInterface: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener: - -ListenerInterface: android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener: - -ListenerInterface: android.os.IncidentManager.AuthListener: - -ListenerInterface: android.telephony.ims.ImsCallSessionListener: - -ListenerInterface: android.telephony.ims.ImsUtListener: - - - -ListenerLast: android.hardware.camera2.CameraDevice#createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) parameter #4: - -ListenerLast: android.location.LocationManager#requestLocationUpdates(android.location.LocationRequest, android.location.LocationListener, android.os.Looper) parameter #2: - ListenerLast: android.permission.PermissionControllerManager#countPermissionApps(java.util.List<java.lang.String>, int, android.permission.PermissionControllerManager.OnCountPermissionAppsResultCallback, android.os.Handler) parameter #3: - + Listeners should always be at end of argument list (method `countPermissionApps`) ListenerLast: android.permission.PermissionControllerManager#getAppPermissions(String, android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, android.os.Handler) parameter #2: - -ListenerLast: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int) parameter #1: - -ListenerLast: android.telephony.mbms.vendor.MbmsStreamingServiceBase#initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) parameter #1: - + Listeners should always be at end of argument list (method `getAppPermissions`) ManagerConstructor: android.content.pm.ShortcutManager#ShortcutManager(android.content.Context): - - - -ManagerLookup: android.telephony.ims.ImsMmTelManager#createForSubscriptionId(int): - -ManagerLookup: android.telephony.ims.ProvisioningManager#createForSubscriptionId(int): - - - -MethodNameTense: android.telephony.ims.feature.CapabilityChangeRequest#getCapabilitiesToEnable(): - - - -MethodNameUnits: android.telephony.ims.ImsCallForwardInfo#getTimeSeconds(): - + Managers must always be obtained from Context; no direct constructors MinMaxConstant: android.os.UserHandle#MIN_SECONDARY_USER_ID: - + If min/max could change in future, make them dynamic methods: android.os.UserHandle#MIN_SECONDARY_USER_ID MinMaxConstant: android.view.autofill.AutofillManager#MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS: - - - -MissingGetterMatchingBuilder: android.app.AppOpsManager.HistoricalOpsRequest.Builder#setFlags(int): - -MissingGetterMatchingBuilder: android.app.AppOpsManager.HistoricalOpsRequest.Builder#setOpNames(java.util.List<java.lang.String>): - -MissingGetterMatchingBuilder: android.app.AppOpsManager.HistoricalOpsRequest.Builder#setPackageName(String): - -MissingGetterMatchingBuilder: android.app.AppOpsManager.HistoricalOpsRequest.Builder#setUid(int): - -MissingGetterMatchingBuilder: android.content.integrity.RuleSet.Builder#addRules(java.util.List<android.content.integrity.Rule>): - -MissingGetterMatchingBuilder: android.hardware.display.BrightnessConfiguration.Builder#addCorrectionByCategory(int, android.hardware.display.BrightnessCorrection): - -MissingGetterMatchingBuilder: android.hardware.display.BrightnessConfiguration.Builder#addCorrectionByPackageName(String, android.hardware.display.BrightnessCorrection): - -MissingGetterMatchingBuilder: android.hardware.display.BrightnessConfiguration.Builder#setDescription(String): - -MissingGetterMatchingBuilder: android.hardware.lights.LightsRequest.Builder#setLight(android.hardware.lights.Light, android.hardware.lights.LightState): - + If min/max could change in future, make them dynamic methods: android.view.autofill.AutofillManager#MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS + + MissingGetterMatchingBuilder: android.media.VolumeShaper.Configuration.Builder#setOptionFlags(int): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioMix.Builder#setDevice(android.media.AudioDeviceInfo): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioMix.Builder#setFormat(android.media.AudioFormat): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioMix.Builder#setRouteFlags(int): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioMixingRule.Builder#addMixRule(int, Object): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioMixingRule.Builder#addRule(android.media.AudioAttributes, int): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioPolicy.Builder#addMix(android.media.audiopolicy.AudioMix): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyVolumeCallback(android.media.audiopolicy.AudioPolicy.AudioPolicyVolumeCallback): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioPolicy.Builder#setIsAudioFocusPolicy(boolean): - + android.media.VolumeShaper.Configuration does not declare a `getOptionFlags()` method matching method android.media.VolumeShaper.Configuration.Builder.setOptionFlags(int) MissingGetterMatchingBuilder: android.media.audiopolicy.AudioPolicy.Builder#setIsTestFocusPolicy(boolean): - -MissingGetterMatchingBuilder: android.media.audiopolicy.AudioPolicy.Builder#setLooper(android.os.Looper): - -MissingGetterMatchingBuilder: android.net.CaptivePortalData.Builder#setBytesRemaining(long): - -MissingGetterMatchingBuilder: android.net.CaptivePortalData.Builder#setExpiryTime(long): - -MissingGetterMatchingBuilder: android.net.CaptivePortalData.Builder#setRefreshTime(long): - -MissingGetterMatchingBuilder: android.net.NetworkCapabilities.Builder#addCapability(int): - -MissingGetterMatchingBuilder: android.net.NetworkCapabilities.Builder#setRequestorPackageName(String): - -MissingGetterMatchingBuilder: android.net.NetworkCapabilities.Builder#setRequestorUid(int): - -MissingGetterMatchingBuilder: android.net.TetheringManager.TetheringRequest.Builder#setShouldShowEntitlementUi(boolean): - -MissingGetterMatchingBuilder: android.net.TetheringManager.TetheringRequest.Builder#setStaticIpv4Addresses(android.net.LinkAddress, android.net.LinkAddress): - -MissingGetterMatchingBuilder: android.net.metrics.ApfProgramEvent.Builder#setActualLifetime(long): - -MissingGetterMatchingBuilder: android.net.metrics.ApfProgramEvent.Builder#setCurrentRas(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfProgramEvent.Builder#setFilteredRas(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfProgramEvent.Builder#setFlags(boolean, boolean): - -MissingGetterMatchingBuilder: android.net.metrics.ApfProgramEvent.Builder#setLifetime(long): - -MissingGetterMatchingBuilder: android.net.metrics.ApfProgramEvent.Builder#setProgramLength(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setDroppedRas(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setDurationMs(long): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setMatchingRas(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setMaxProgramSize(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setParseErrors(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setProgramUpdates(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setProgramUpdatesAll(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setProgramUpdatesAllowingMulticast(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setReceivedRas(int): - -MissingGetterMatchingBuilder: android.net.metrics.ApfStats.Builder#setZeroLifetimeRas(int): - -MissingGetterMatchingBuilder: android.net.metrics.DhcpClientEvent.Builder#setDurationMs(int): - -MissingGetterMatchingBuilder: android.net.metrics.DhcpClientEvent.Builder#setMsg(String): - -MissingGetterMatchingBuilder: android.net.metrics.ValidationProbeEvent.Builder#setDurationMs(long): - -MissingGetterMatchingBuilder: android.net.metrics.ValidationProbeEvent.Builder#setProbeType(int, boolean): - -MissingGetterMatchingBuilder: android.net.metrics.ValidationProbeEvent.Builder#setReturnCode(int): - + android.media.audiopolicy.AudioPolicy does not declare a `isIsTestFocusPolicy()` method matching method android.media.audiopolicy.AudioPolicy.Builder.setIsTestFocusPolicy(boolean) MissingGetterMatchingBuilder: android.security.keystore.KeyGenParameterSpec.Builder#setUniqueIdIncluded(boolean): - -MissingGetterMatchingBuilder: android.service.autofill.Dataset.Builder#setFieldInlinePresentation(android.view.autofill.AutofillId, android.view.autofill.AutofillValue, java.util.regex.Pattern, android.service.autofill.InlinePresentation): - -MissingGetterMatchingBuilder: android.service.autofill.augmented.FillResponse.Builder#setClientState(android.os.Bundle): - -MissingGetterMatchingBuilder: android.service.autofill.augmented.FillResponse.Builder#setFillWindow(android.service.autofill.augmented.FillWindow): - -MissingGetterMatchingBuilder: android.service.autofill.augmented.FillResponse.Builder#setInlineSuggestions(java.util.List<android.service.autofill.Dataset>): - -MissingGetterMatchingBuilder: android.telecom.CallScreeningService.CallResponse.Builder#setShouldScreenCallViaAudioProcessing(boolean): - + android.security.keystore.KeyGenParameterSpec does not declare a `isUniqueIdIncluded()` method matching method android.security.keystore.KeyGenParameterSpec.Builder.setUniqueIdIncluded(boolean) MissingGetterMatchingBuilder: android.telecom.ConnectionRequest.Builder#setIsAdhocConferenceCall(boolean): - + android.telecom.ConnectionRequest does not declare a `isIsAdhocConferenceCall()` method matching method android.telecom.ConnectionRequest.Builder.setIsAdhocConferenceCall(boolean) MissingGetterMatchingBuilder: android.telecom.ConnectionRequest.Builder#setRttPipeFromInCall(android.os.ParcelFileDescriptor): - + android.telecom.ConnectionRequest does not declare a `getRttPipeFromInCall()` method matching method android.telecom.ConnectionRequest.Builder.setRttPipeFromInCall(android.os.ParcelFileDescriptor) MissingGetterMatchingBuilder: android.telecom.ConnectionRequest.Builder#setRttPipeToInCall(android.os.ParcelFileDescriptor): - + android.telecom.ConnectionRequest does not declare a `getRttPipeToInCall()` method matching method android.telecom.ConnectionRequest.Builder.setRttPipeToInCall(android.os.ParcelFileDescriptor) MissingGetterMatchingBuilder: android.telecom.ConnectionRequest.Builder#setShouldShowIncomingCallUi(boolean): - -MissingGetterMatchingBuilder: android.telecom.PhoneAccount.Builder#setGroupId(String): - -MissingGetterMatchingBuilder: android.telephony.NetworkRegistrationInfo.Builder#setEmergencyOnly(boolean): - -MissingGetterMatchingBuilder: android.telephony.ims.ImsSsData.Builder#setCallForwardingInfo(java.util.List<android.telephony.ims.ImsCallForwardInfo>): - -MissingGetterMatchingBuilder: android.telephony.ims.stub.ImsFeatureConfiguration.Builder#addFeature(int, int): - -MissingGetterMatchingBuilder: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String): - + android.telecom.ConnectionRequest does not declare a `shouldShowIncomingCallUi()` method matching method android.telecom.ConnectionRequest.Builder.setShouldShowIncomingCallUi(boolean) MissingGetterMatchingBuilder: android.view.Display.Mode.Builder#setResolution(int, int): android.view.Display.Mode does not declare a `getResolution()` method matching method android.view.Display.Mode.Builder.setResolution(int,int) MissingNullability: android.app.Activity#onMovedToDisplay(int, android.content.res.Configuration) parameter #1: - -MissingNullability: android.app.ActivityManager#addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int) parameter #0: - + Missing nullability on parameter `config` in method `onMovedToDisplay` MissingNullability: android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName) parameter #0: - -MissingNullability: android.app.ActivityManager#forceStopPackage(String) parameter #0: - -MissingNullability: android.app.ActivityManager#getPackageImportance(String) parameter #0: - + Missing nullability on parameter `activity` in method `alwaysShowUnsupportedCompileSdkWarning` MissingNullability: android.app.ActivityManager#holdLock(android.os.IBinder, int) parameter #0: - -MissingNullability: android.app.ActivityManager#removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener) parameter #0: - + Missing nullability on parameter `token` in method `holdLock` MissingNullability: android.app.ActivityManager#scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int) parameter #0: - + Missing nullability on parameter `packages` in method `scheduleApplicationInfoChanged` MissingNullability: android.app.ActivityManager.TaskDescription#getIconFilename(): - + Missing nullability on method `getIconFilename` return MissingNullability: android.app.ActivityTaskManager#clearLaunchParamsForPackages(java.util.List<java.lang.String>) parameter #0: - -MissingNullability: android.app.ActivityTaskManager#listAllStacks(): - -MissingNullability: android.app.ActivityTaskManager#moveTopActivityToPinnedStack(int, android.graphics.Rect) parameter #1: - -MissingNullability: android.app.ActivityTaskManager#removeStacksInWindowingModes(int[]) parameter #0: - -MissingNullability: android.app.ActivityTaskManager#removeStacksWithActivityTypes(int[]) parameter #0: - -MissingNullability: android.app.ActivityTaskManager#resizeDockedStack(android.graphics.Rect, android.graphics.Rect) parameter #0: - -MissingNullability: android.app.ActivityTaskManager#resizeDockedStack(android.graphics.Rect, android.graphics.Rect) parameter #1: - -MissingNullability: android.app.ActivityTaskManager#resizePinnedStack(int, android.graphics.Rect, boolean) parameter #1: - + Missing nullability on parameter `packageNames` in method `clearLaunchParamsForPackages` MissingNullability: android.app.ActivityTaskManager#resizeTask(int, android.graphics.Rect) parameter #1: - -MissingNullability: android.app.ActivityTaskManager#setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean) parameter #4: - + Missing nullability on parameter `bounds` in method `resizeTask` MissingNullability: android.app.ActivityTaskManager#supportsMultiWindow(android.content.Context) parameter #0: - + Missing nullability on parameter `context` in method `supportsMultiWindow` MissingNullability: android.app.ActivityTaskManager#supportsSplitScreenMultiWindow(android.content.Context) parameter #0: - + Missing nullability on parameter `context` in method `supportsSplitScreenMultiWindow` MissingNullability: android.app.AppDetailsActivity#onCreate(android.os.Bundle) parameter #0: - -MissingNullability: android.app.AppOpsManager#getOpStrs(): - + Missing nullability on parameter `savedInstanceState` in method `onCreate` MissingNullability: android.app.AppOpsManager#isOperationActive(int, int, String) parameter #2: - + Missing nullability on parameter `packageName` in method `isOperationActive` MissingNullability: android.app.AppOpsManager#opToPermission(int): - + Missing nullability on method `opToPermission` return MissingNullability: android.app.AppOpsManager#permissionToOpCode(String) parameter #0: - -MissingNullability: android.app.AppOpsManager#setMode(String, int, String, int) parameter #0: - -MissingNullability: android.app.AppOpsManager#setMode(String, int, String, int) parameter #2: - + Missing nullability on parameter `permission` in method `permissionToOpCode` MissingNullability: android.app.AppOpsManager#setMode(int, int, String, int) parameter #2: - -MissingNullability: android.app.AppOpsManager#setUidMode(String, int, int) parameter #0: - -MissingNullability: android.app.AppOpsManager.HistoricalOp#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.app.AppOpsManager.HistoricalOps#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.app.AppOpsManager.HistoricalUidOps#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.app.AppOpsManager.OpEntry#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `packageName` in method `setMode` MissingNullability: android.app.NotificationManager#allowAssistantAdjustment(String) parameter #0: - + Missing nullability on parameter `capability` in method `allowAssistantAdjustment` MissingNullability: android.app.NotificationManager#disallowAssistantAdjustment(String) parameter #0: - + Missing nullability on parameter `capability` in method `disallowAssistantAdjustment` MissingNullability: android.app.NotificationManager#getEffectsSuppressor(): - -MissingNullability: android.app.NotificationManager#matchesCallFilter(android.os.Bundle) parameter #0: - -MissingNullability: android.app.PictureInPictureParams#getActions(): - -MissingNullability: android.app.PictureInPictureParams#getSourceRectHint(): - + Missing nullability on method `getEffectsSuppressor` return MissingNullability: android.app.TimePickerDialog#getTimePicker(): - -MissingNullability: android.app.UiAutomation#executeShellCommandRw(String): - -MissingNullability: android.app.UiAutomation#executeShellCommandRw(String) parameter #0: - -MissingNullability: android.app.UiAutomation#grantRuntimePermission(String, String, android.os.UserHandle) parameter #0: - -MissingNullability: android.app.UiAutomation#grantRuntimePermission(String, String, android.os.UserHandle) parameter #1: - -MissingNullability: android.app.UiAutomation#grantRuntimePermission(String, String, android.os.UserHandle) parameter #2: - -MissingNullability: android.app.UiAutomation#revokeRuntimePermission(String, String, android.os.UserHandle) parameter #0: - -MissingNullability: android.app.UiAutomation#revokeRuntimePermission(String, String, android.os.UserHandle) parameter #1: - -MissingNullability: android.app.UiAutomation#revokeRuntimePermission(String, String, android.os.UserHandle) parameter #2: - -MissingNullability: android.app.WallpaperManager#setWallpaperComponent(android.content.ComponentName) parameter #0: - + Missing nullability on method `getTimePicker` return MissingNullability: android.app.WindowConfiguration#compareTo(android.app.WindowConfiguration) parameter #0: - + Missing nullability on parameter `that` in method `compareTo` MissingNullability: android.app.WindowConfiguration#getAppBounds(): - + Missing nullability on method `getAppBounds` return MissingNullability: android.app.WindowConfiguration#getBounds(): - + Missing nullability on method `getBounds` return MissingNullability: android.app.WindowConfiguration#setAppBounds(android.graphics.Rect) parameter #0: - + Missing nullability on parameter `rect` in method `setAppBounds` MissingNullability: android.app.WindowConfiguration#setBounds(android.graphics.Rect) parameter #0: - + Missing nullability on parameter `rect` in method `setBounds` MissingNullability: android.app.WindowConfiguration#setTo(android.app.WindowConfiguration) parameter #0: - + Missing nullability on parameter `other` in method `setTo` MissingNullability: android.app.WindowConfiguration#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `dest` in method `writeToParcel` MissingNullability: android.app.admin.DevicePolicyManager#getOwnerInstalledCaCerts(android.os.UserHandle): - + Missing nullability on method `getOwnerInstalledCaCerts` return MissingNullability: android.app.admin.SecurityLog.SecurityEvent#SecurityEvent(long, byte[]) parameter #1: - -MissingNullability: android.app.backup.BackupManager#getConfigurationIntent(String): - -MissingNullability: android.app.backup.BackupManager#getConfigurationIntent(String) parameter #0: - -MissingNullability: android.app.backup.BackupManager#getDataManagementIntent(String): - -MissingNullability: android.app.backup.BackupManager#getDataManagementIntent(String) parameter #0: - -MissingNullability: android.app.backup.BackupManager#getDestinationString(String): - -MissingNullability: android.app.backup.BackupManager#getDestinationString(String) parameter #0: - -MissingNullability: android.app.prediction.AppPredictionSessionId#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `data` in method `SecurityEvent` MissingNullability: android.app.prediction.AppPredictor#getSessionId(): - -MissingNullability: android.app.prediction.AppTarget#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.app.prediction.AppTargetEvent#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.app.prediction.AppTargetId#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on method `getSessionId` return MissingNullability: android.content.AutofillOptions#forWhitelistingItself(): - + Missing nullability on method `forWhitelistingItself` return MissingNullability: android.content.AutofillOptions#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `parcel` in method `writeToParcel` MissingNullability: android.content.ContentCaptureOptions#forWhitelistingItself(): - + Missing nullability on method `forWhitelistingItself` return MissingNullability: android.content.ContentCaptureOptions#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `parcel` in method `writeToParcel` MissingNullability: android.content.ContentResolver#getSyncAdapterPackagesForAuthorityAsUser(String, int): - + Missing nullability on method `getSyncAdapterPackagesForAuthorityAsUser` return MissingNullability: android.content.ContentResolver#getSyncAdapterPackagesForAuthorityAsUser(String, int) parameter #0: - -MissingNullability: android.content.Context#getDisplay(): - -MissingNullability: android.content.Context#getUser(): - -MissingNullability: android.content.ContextWrapper#getDisplay(): - -MissingNullability: android.content.ContextWrapper#setContentCaptureOptions(android.content.ContentCaptureOptions) parameter #0: - + Missing nullability on parameter `authority` in method `getSyncAdapterPackagesForAuthorityAsUser` MissingNullability: android.content.pm.ActivityInfo#isTranslucentOrFloating(android.content.res.TypedArray) parameter #0: - + Missing nullability on parameter `attributes` in method `isTranslucentOrFloating` MissingNullability: android.content.pm.LauncherApps#LauncherApps(android.content.Context) parameter #0: - -MissingNullability: android.content.pm.PackageInstaller.SessionParams#setGrantedRuntimePermissions(String[]) parameter #0: - + Missing nullability on parameter `context` in method `LauncherApps` MissingNullability: android.content.pm.PackageManager#getHoldLockToken(): - Missing nullability on method `BINDER` return + Missing nullability on method `getHoldLockToken` return MissingNullability: android.content.pm.PackageManager#getNamesForUids(int[]) parameter #0: - + Missing nullability on parameter `uids` in method `getNamesForUids` MissingNullability: android.content.pm.PackageManager#holdLock(android.os.IBinder, int) parameter #0: - + Missing nullability on parameter `token` in method `holdLock` MissingNullability: android.content.pm.ShortcutManager#ShortcutManager(android.content.Context) parameter #0: - + Missing nullability on parameter `context` in method `ShortcutManager` MissingNullability: android.content.pm.UserInfo#UserInfo(android.content.pm.UserInfo) parameter #0: Missing nullability on parameter `orig` in method `UserInfo` MissingNullability: android.content.pm.UserInfo#UserInfo(int, String, String, int) parameter #1: @@ -942,1469 +292,477 @@ MissingNullability: android.content.pm.UserInfo#userType: MissingNullability: android.content.pm.UserInfo#writeToParcel(android.os.Parcel, int) parameter #0: Missing nullability on parameter `dest` in method `writeToParcel` MissingNullability: android.content.res.AssetManager#getOverlayablesToString(String) parameter #0: - + Missing nullability on parameter `packageName` in method `getOverlayablesToString` MissingNullability: android.content.res.Configuration#windowConfiguration: - -MissingNullability: android.content.rollback.PackageRollbackInfo#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.content.rollback.RollbackInfo#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on field `windowConfiguration` in class `class android.content.res.Configuration` MissingNullability: android.database.sqlite.SQLiteDebug#dump(android.util.Printer, String[]) parameter #0: - + Missing nullability on parameter `printer` in method `dump` MissingNullability: android.database.sqlite.SQLiteDebug#dump(android.util.Printer, String[]) parameter #1: - + Missing nullability on parameter `args` in method `dump` MissingNullability: android.database.sqlite.SQLiteDebug#getDatabaseInfo(): - + Missing nullability on method `getDatabaseInfo` return MissingNullability: android.database.sqlite.SQLiteDebug.DbStats#DbStats(String, long, long, int, int, int, int) parameter #0: - + Missing nullability on parameter `dbName` in method `DbStats` MissingNullability: android.database.sqlite.SQLiteDebug.DbStats#cache: - + Missing nullability on field `cache` in class `class android.database.sqlite.SQLiteDebug.DbStats` MissingNullability: android.database.sqlite.SQLiteDebug.DbStats#dbName: - + Missing nullability on field `dbName` in class `class android.database.sqlite.SQLiteDebug.DbStats` MissingNullability: android.database.sqlite.SQLiteDebug.PagerStats#dbStats: - + Missing nullability on field `dbStats` in class `class android.database.sqlite.SQLiteDebug.PagerStats` MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, String, String, android.os.CancellationSignal) parameter #0: - + Missing nullability on parameter `db` in method `SQLiteDirectCursorDriver` MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, String, String, android.os.CancellationSignal) parameter #1: - + Missing nullability on parameter `sql` in method `SQLiteDirectCursorDriver` MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, String, String, android.os.CancellationSignal) parameter #2: - + Missing nullability on parameter `editTable` in method `SQLiteDirectCursorDriver` MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, String, String, android.os.CancellationSignal) parameter #3: - + Missing nullability on parameter `cancellationSignal` in method `SQLiteDirectCursorDriver` MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#cursorRequeried(android.database.Cursor) parameter #0: - + Missing nullability on parameter `cursor` in method `cursorRequeried` MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]): - + Missing nullability on method `query` return MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]) parameter #0: - + Missing nullability on parameter `factory` in method `query` MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]) parameter #1: - + Missing nullability on parameter `selectionArgs` in method `query` MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#setBindArguments(String[]) parameter #0: - + Missing nullability on parameter `bindArgs` in method `setBindArguments` MissingNullability: android.database.sqlite.SQLiteGlobal#getDefaultJournalMode(): - + Missing nullability on method `getDefaultJournalMode` return MissingNullability: android.database.sqlite.SQLiteGlobal#getDefaultSyncMode(): - + Missing nullability on method `getDefaultSyncMode` return MissingNullability: android.database.sqlite.SQLiteGlobal#getWALSyncMode(): - + Missing nullability on method `getWALSyncMode` return MissingNullability: android.graphics.ImageDecoder#createSource(android.content.res.Resources, java.io.InputStream, int) parameter #0: - -MissingNullability: android.graphics.ImageDecoder#createSource(android.content.res.Resources, java.io.InputStream, int) parameter #1: - + Missing nullability on parameter `res` in method `createSource` MissingNullability: android.graphics.drawable.AdaptiveIconDrawable#getSafeZone(): - + Missing nullability on method `getSafeZone` return MissingNullability: android.graphics.drawable.ColorDrawable#getXfermode(): - -MissingNullability: android.hardware.camera2.CameraDevice#createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) parameter #0: - + Missing nullability on method `getXfermode` return MissingNullability: android.hardware.camera2.CameraManager#getCameraIdListNoLazy(): - -MissingNullability: android.hardware.display.AmbientBrightnessDayStats#getBucketBoundaries(): - -MissingNullability: android.hardware.display.AmbientBrightnessDayStats#getLocalDate(): - -MissingNullability: android.hardware.display.AmbientBrightnessDayStats#getStats(): - -MissingNullability: android.hardware.display.AmbientBrightnessDayStats#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on method `getCameraIdListNoLazy` return MissingNullability: android.hardware.display.AmbientDisplayConfiguration#AmbientDisplayConfiguration(android.content.Context) parameter #0: - -MissingNullability: android.hardware.display.BrightnessChangeEvent#luxTimestamps: - -MissingNullability: android.hardware.display.BrightnessChangeEvent#luxValues: - -MissingNullability: android.hardware.display.BrightnessChangeEvent#packageName: - -MissingNullability: android.hardware.display.BrightnessChangeEvent#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.hardware.display.BrightnessConfiguration#getCurve(): - -MissingNullability: android.hardware.display.BrightnessConfiguration#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.hardware.display.BrightnessConfiguration.Builder#Builder(float[], float[]) parameter #0: - -MissingNullability: android.hardware.display.BrightnessConfiguration.Builder#Builder(float[], float[]) parameter #1: - -MissingNullability: android.hardware.display.BrightnessCorrection#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.hardware.display.DisplayManager#getAmbientBrightnessStats(): - -MissingNullability: android.hardware.display.DisplayManager#getBrightnessConfiguration(): - -MissingNullability: android.hardware.display.DisplayManager#getBrightnessEvents(): - -MissingNullability: android.hardware.display.DisplayManager#getStableDisplaySize(): - -MissingNullability: android.hardware.display.DisplayManager#setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration) parameter #0: - + Missing nullability on parameter `context` in method `AmbientDisplayConfiguration` MissingNullability: android.location.GnssClock#set(android.location.GnssClock) parameter #0: - + Missing nullability on parameter `clock` in method `set` MissingNullability: android.location.GnssMeasurement#set(android.location.GnssMeasurement) parameter #0: - -MissingNullability: android.location.GnssMeasurementsEvent#GnssMeasurementsEvent(android.location.GnssClock, android.location.GnssMeasurement[]) parameter #0: - -MissingNullability: android.location.GnssMeasurementsEvent#GnssMeasurementsEvent(android.location.GnssClock, android.location.GnssMeasurement[]) parameter #1: - + Missing nullability on parameter `measurement` in method `set` MissingNullability: android.location.GnssNavigationMessage#set(android.location.GnssNavigationMessage) parameter #0: - + Missing nullability on parameter `navigationMessage` in method `set` MissingNullability: android.location.GnssNavigationMessage#setData(byte[]) parameter #0: - -MissingNullability: android.location.LocationManager#getTestProviderCurrentRequests(String) parameter #0: - -MissingNullability: android.location.LocationRequest#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.media.AudioAttributes#SDK_USAGES: - Missing nullability on field `SDK_USAGES` in class `class android.media.AudioAttributes` + Missing nullability on parameter `value` in method `setData` MissingNullability: android.media.AudioAttributes#getSdkUsages(): Missing nullability on method `getSdkUsages` return -MissingNullability: android.media.AudioFocusInfo#writeToParcel(android.os.Parcel, int) parameter #0: - MissingNullability: android.media.AudioManager#getPublicStreamTypes(): Missing nullability on method `getPublicStreamTypes` return MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String) parameter #3: - + Missing nullability on parameter `clientFormat` in method `AudioRecordingConfiguration` MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String) parameter #4: - + Missing nullability on parameter `devFormat` in method `AudioRecordingConfiguration` MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String) parameter #6: - + Missing nullability on parameter `packageName` in method `AudioRecordingConfiguration` MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #10: - + Missing nullability on parameter `clientEffects` in method `AudioRecordingConfiguration` MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #11: - + Missing nullability on parameter `deviceEffects` in method `AudioRecordingConfiguration` MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #3: - + Missing nullability on parameter `clientFormat` in method `AudioRecordingConfiguration` MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #4: - + Missing nullability on parameter `devFormat` in method `AudioRecordingConfiguration` MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #6: - -MissingNullability: android.media.AudioSystem#streamToString(int): - Missing nullability on method `streamToString` return + Missing nullability on parameter `packageName` in method `AudioRecordingConfiguration` MissingNullability: android.media.PlaybackParams#setAudioStretchMode(int): - + Missing nullability on method `setAudioStretchMode` return MissingNullability: android.media.audiofx.AudioEffect#EFFECT_TYPE_NULL: - + Missing nullability on field `EFFECT_TYPE_NULL` in class `class android.media.audiofx.AudioEffect` MissingNullability: android.media.audiofx.AudioEffect#byteArrayToInt(byte[]) parameter #0: - + Missing nullability on parameter `valueBuf` in method `byteArrayToInt` MissingNullability: android.media.audiofx.AudioEffect#byteArrayToShort(byte[]) parameter #0: - + Missing nullability on parameter `valueBuf` in method `byteArrayToShort` MissingNullability: android.media.audiofx.AudioEffect#getParameter(byte[], byte[]) parameter #0: - + Missing nullability on parameter `param` in method `getParameter` MissingNullability: android.media.audiofx.AudioEffect#getParameter(byte[], byte[]) parameter #1: - + Missing nullability on parameter `value` in method `getParameter` MissingNullability: android.media.audiofx.AudioEffect#getParameter(int, byte[]) parameter #1: - + Missing nullability on parameter `value` in method `getParameter` MissingNullability: android.media.audiofx.AudioEffect#getParameter(int, int[]) parameter #1: - + Missing nullability on parameter `value` in method `getParameter` MissingNullability: android.media.audiofx.AudioEffect#getParameter(int, short[]) parameter #1: - + Missing nullability on parameter `value` in method `getParameter` MissingNullability: android.media.audiofx.AudioEffect#getParameter(int[], short[]) parameter #0: - + Missing nullability on parameter `param` in method `getParameter` MissingNullability: android.media.audiofx.AudioEffect#getParameter(int[], short[]) parameter #1: - + Missing nullability on parameter `value` in method `getParameter` MissingNullability: android.media.audiofx.AudioEffect#intToByteArray(int): - + Missing nullability on method `intToByteArray` return MissingNullability: android.media.audiofx.AudioEffect#isEffectTypeAvailable(java.util.UUID) parameter #0: - + Missing nullability on parameter `type` in method `isEffectTypeAvailable` MissingNullability: android.media.audiofx.AudioEffect#setParameter(byte[], byte[]) parameter #0: - + Missing nullability on parameter `param` in method `setParameter` MissingNullability: android.media.audiofx.AudioEffect#setParameter(byte[], byte[]) parameter #1: - + Missing nullability on parameter `value` in method `setParameter` MissingNullability: android.media.audiofx.AudioEffect#setParameter(int, byte[]) parameter #1: - + Missing nullability on parameter `value` in method `setParameter` MissingNullability: android.media.audiofx.AudioEffect#setParameter(int[], byte[]) parameter #0: - + Missing nullability on parameter `param` in method `setParameter` MissingNullability: android.media.audiofx.AudioEffect#setParameter(int[], byte[]) parameter #1: - + Missing nullability on parameter `value` in method `setParameter` MissingNullability: android.media.audiofx.AudioEffect#setParameter(int[], int[]) parameter #0: - + Missing nullability on parameter `param` in method `setParameter` MissingNullability: android.media.audiofx.AudioEffect#setParameter(int[], int[]) parameter #1: - + Missing nullability on parameter `value` in method `setParameter` MissingNullability: android.media.audiofx.AudioEffect#setParameterListener(android.media.audiofx.AudioEffect.OnParameterChangeListener) parameter #0: - + Missing nullability on parameter `listener` in method `setParameterListener` MissingNullability: android.media.audiofx.AudioEffect#shortToByteArray(short): - + Missing nullability on method `shortToByteArray` return MissingNullability: android.media.audiofx.AudioEffect.Descriptor#Descriptor(android.os.Parcel) parameter #0: - + Missing nullability on parameter `in` in method `Descriptor` MissingNullability: android.media.audiofx.AudioEffect.Descriptor#writeToParcel(android.os.Parcel) parameter #0: - + Missing nullability on parameter `dest` in method `writeToParcel` MissingNullability: android.media.audiofx.AudioEffect.OnParameterChangeListener#onParameterChange(android.media.audiofx.AudioEffect, int, byte[], byte[]) parameter #0: - + Missing nullability on parameter `effect` in method `onParameterChange` MissingNullability: android.media.audiofx.AudioEffect.OnParameterChangeListener#onParameterChange(android.media.audiofx.AudioEffect, int, byte[], byte[]) parameter #2: - + Missing nullability on parameter `param` in method `onParameterChange` MissingNullability: android.media.audiofx.AudioEffect.OnParameterChangeListener#onParameterChange(android.media.audiofx.AudioEffect, int, byte[], byte[]) parameter #3: - -MissingNullability: android.media.audiopolicy.AudioMix.Builder#Builder(android.media.audiopolicy.AudioMixingRule) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioMix.Builder#build(): - -MissingNullability: android.media.audiopolicy.AudioMix.Builder#setDevice(android.media.AudioDeviceInfo): - -MissingNullability: android.media.audiopolicy.AudioMix.Builder#setFormat(android.media.AudioFormat): - -MissingNullability: android.media.audiopolicy.AudioMix.Builder#setFormat(android.media.AudioFormat) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioMix.Builder#setRouteFlags(int): - -MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#addMixRule(int, Object): - -MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#addMixRule(int, Object) parameter #1: - -MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#addRule(android.media.AudioAttributes, int): - -MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#addRule(android.media.AudioAttributes, int) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#build(): - -MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#excludeMixRule(int, Object): - -MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#excludeMixRule(int, Object) parameter #1: - -MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#excludeRule(android.media.AudioAttributes, int): - -MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#excludeRule(android.media.AudioAttributes, int) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy#createAudioRecordSink(android.media.audiopolicy.AudioMix): - -MissingNullability: android.media.audiopolicy.AudioPolicy#createAudioRecordSink(android.media.audiopolicy.AudioMix) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy#createAudioTrackSource(android.media.audiopolicy.AudioMix): - -MissingNullability: android.media.audiopolicy.AudioPolicy#createAudioTrackSource(android.media.audiopolicy.AudioMix) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy#setRegistration(String) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy#toLogFriendlyString(): - -MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener#onAudioFocusAbandon(android.media.AudioFocusInfo) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener#onAudioFocusGrant(android.media.AudioFocusInfo, int) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener#onAudioFocusLoss(android.media.AudioFocusInfo, boolean) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener#onAudioFocusRequest(android.media.AudioFocusInfo, int) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener#onMixStateUpdate(android.media.audiopolicy.AudioMix) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy.Builder#Builder(android.content.Context) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener) parameter #0: - -MissingNullability: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener) parameter #0: - -MissingNullability: android.metrics.LogMaker#LogMaker(Object[]) parameter #0: - -MissingNullability: android.metrics.LogMaker#addTaggedData(int, Object): - -MissingNullability: android.metrics.LogMaker#addTaggedData(int, Object) parameter #1: - -MissingNullability: android.metrics.LogMaker#clearCategory(): - -MissingNullability: android.metrics.LogMaker#clearPackageName(): - -MissingNullability: android.metrics.LogMaker#clearSubtype(): - -MissingNullability: android.metrics.LogMaker#clearTaggedData(int): - -MissingNullability: android.metrics.LogMaker#clearType(): - -MissingNullability: android.metrics.LogMaker#deserialize(Object[]) parameter #0: - -MissingNullability: android.metrics.LogMaker#getCounterName(): - -MissingNullability: android.metrics.LogMaker#getPackageName(): - -MissingNullability: android.metrics.LogMaker#getTaggedData(int): - -MissingNullability: android.metrics.LogMaker#isSubsetOf(android.metrics.LogMaker) parameter #0: - -MissingNullability: android.metrics.LogMaker#isValidValue(Object) parameter #0: - -MissingNullability: android.metrics.LogMaker#serialize(): - -MissingNullability: android.metrics.LogMaker#setCategory(int): - -MissingNullability: android.metrics.LogMaker#setPackageName(String): - -MissingNullability: android.metrics.LogMaker#setPackageName(String) parameter #0: - -MissingNullability: android.metrics.LogMaker#setSubtype(int): - -MissingNullability: android.metrics.LogMaker#setType(int): - -MissingNullability: android.metrics.MetricsReader#next(): - -MissingNullability: android.net.NetworkCapabilities#getCapabilities(): - -MissingNullability: android.net.StaticIpConfiguration#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.net.TestNetworkInterface#CREATOR: - -MissingNullability: android.net.TestNetworkInterface#TestNetworkInterface(android.os.ParcelFileDescriptor, String) parameter #0: - -MissingNullability: android.net.TestNetworkInterface#TestNetworkInterface(android.os.ParcelFileDescriptor, String) parameter #1: - -MissingNullability: android.net.TestNetworkInterface#getFileDescriptor(): - -MissingNullability: android.net.TestNetworkInterface#getInterfaceName(): - -MissingNullability: android.net.TestNetworkInterface#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.net.TestNetworkManager#createTapInterface(): - -MissingNullability: android.net.TestNetworkManager#createTunInterface(android.net.LinkAddress[]): - -MissingNullability: android.net.apf.ApfCapabilities#CREATOR: - -MissingNullability: android.net.apf.ApfCapabilities#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.net.metrics.DhcpClientEvent.Builder#setMsg(String) parameter #0: - + Missing nullability on parameter `value` in method `onParameterChange` MissingNullability: android.os.Build#is64BitAbi(String) parameter #0: - + Missing nullability on parameter `abi` in method `is64BitAbi` MissingNullability: android.os.Build.VERSION#ACTIVE_CODENAMES: - + Missing nullability on field `ACTIVE_CODENAMES` in class `class android.os.Build.VERSION` MissingNullability: android.os.Environment#buildPath(java.io.File, java.lang.String...): - + Missing nullability on method `buildPath` return MissingNullability: android.os.Environment#buildPath(java.io.File, java.lang.String...) parameter #0: - + Missing nullability on parameter `base` in method `buildPath` MissingNullability: android.os.Environment#buildPath(java.io.File, java.lang.String...) parameter #1: - + Missing nullability on parameter `segments` in method `buildPath` MissingNullability: android.os.FileUtils#contains(java.io.File, java.io.File) parameter #0: - + Missing nullability on parameter `dir` in method `contains` MissingNullability: android.os.FileUtils#contains(java.io.File, java.io.File) parameter #1: - -MissingNullability: android.os.HwBinder#getService(String, String): - -MissingNullability: android.os.HwBinder#getService(String, String) parameter #0: - -MissingNullability: android.os.HwBinder#getService(String, String) parameter #1: - -MissingNullability: android.os.HwBinder#getService(String, String, boolean): - -MissingNullability: android.os.HwBinder#getService(String, String, boolean) parameter #0: - -MissingNullability: android.os.HwBinder#getService(String, String, boolean) parameter #1: - -MissingNullability: android.os.HwBinder#onTransact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #1: - -MissingNullability: android.os.HwBinder#onTransact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #2: - -MissingNullability: android.os.HwBinder#registerService(String) parameter #0: - -MissingNullability: android.os.HwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #1: - -MissingNullability: android.os.HwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #2: - -MissingNullability: android.os.HwBlob#copyToBoolArray(long, boolean[], int) parameter #1: - -MissingNullability: android.os.HwBlob#copyToDoubleArray(long, double[], int) parameter #1: - -MissingNullability: android.os.HwBlob#copyToFloatArray(long, float[], int) parameter #1: - -MissingNullability: android.os.HwBlob#copyToInt16Array(long, short[], int) parameter #1: - -MissingNullability: android.os.HwBlob#copyToInt32Array(long, int[], int) parameter #1: - -MissingNullability: android.os.HwBlob#copyToInt64Array(long, long[], int) parameter #1: - -MissingNullability: android.os.HwBlob#copyToInt8Array(long, byte[], int) parameter #1: - -MissingNullability: android.os.HwBlob#getString(long): - -MissingNullability: android.os.HwBlob#putBlob(long, android.os.HwBlob) parameter #1: - -MissingNullability: android.os.HwBlob#putBoolArray(long, boolean[]) parameter #1: - -MissingNullability: android.os.HwBlob#putDoubleArray(long, double[]) parameter #1: - -MissingNullability: android.os.HwBlob#putFloatArray(long, float[]) parameter #1: - -MissingNullability: android.os.HwBlob#putInt16Array(long, short[]) parameter #1: - -MissingNullability: android.os.HwBlob#putInt32Array(long, int[]) parameter #1: - -MissingNullability: android.os.HwBlob#putInt64Array(long, long[]) parameter #1: - -MissingNullability: android.os.HwBlob#putInt8Array(long, byte[]) parameter #1: - -MissingNullability: android.os.HwBlob#putString(long, String) parameter #1: - -MissingNullability: android.os.HwBlob#wrapArray(boolean[]): - -MissingNullability: android.os.HwBlob#wrapArray(byte[]): - -MissingNullability: android.os.HwBlob#wrapArray(double[]): - -MissingNullability: android.os.HwBlob#wrapArray(float[]): - -MissingNullability: android.os.HwBlob#wrapArray(int[]): - -MissingNullability: android.os.HwBlob#wrapArray(long[]): - -MissingNullability: android.os.HwBlob#wrapArray(short[]): - -MissingNullability: android.os.HwParcel#enforceInterface(String) parameter #0: - -MissingNullability: android.os.HwParcel#readBoolVector(): - -MissingNullability: android.os.HwParcel#readBuffer(long): - -MissingNullability: android.os.HwParcel#readDoubleVector(): - -MissingNullability: android.os.HwParcel#readEmbeddedBuffer(long, long, long, boolean): - -MissingNullability: android.os.HwParcel#readFloatVector(): - -MissingNullability: android.os.HwParcel#readInt16Vector(): - -MissingNullability: android.os.HwParcel#readInt32Vector(): - -MissingNullability: android.os.HwParcel#readInt64Vector(): - -MissingNullability: android.os.HwParcel#readInt8Vector(): - -MissingNullability: android.os.HwParcel#readString(): - -MissingNullability: android.os.HwParcel#readStringVector(): - -MissingNullability: android.os.HwParcel#readStrongBinder(): - -MissingNullability: android.os.HwParcel#writeBoolVector(java.util.ArrayList<java.lang.Boolean>) parameter #0: - -MissingNullability: android.os.HwParcel#writeBuffer(android.os.HwBlob) parameter #0: - -MissingNullability: android.os.HwParcel#writeDoubleVector(java.util.ArrayList<java.lang.Double>) parameter #0: - -MissingNullability: android.os.HwParcel#writeFloatVector(java.util.ArrayList<java.lang.Float>) parameter #0: - -MissingNullability: android.os.HwParcel#writeInt16Vector(java.util.ArrayList<java.lang.Short>) parameter #0: - -MissingNullability: android.os.HwParcel#writeInt32Vector(java.util.ArrayList<java.lang.Integer>) parameter #0: - -MissingNullability: android.os.HwParcel#writeInt64Vector(java.util.ArrayList<java.lang.Long>) parameter #0: - -MissingNullability: android.os.HwParcel#writeInt8Vector(java.util.ArrayList<java.lang.Byte>) parameter #0: - -MissingNullability: android.os.HwParcel#writeInterfaceToken(String) parameter #0: - -MissingNullability: android.os.HwParcel#writeString(String) parameter #0: - -MissingNullability: android.os.HwParcel#writeStringVector(java.util.ArrayList<java.lang.String>) parameter #0: - -MissingNullability: android.os.HwParcel#writeStrongBinder(android.os.IHwBinder) parameter #0: - -MissingNullability: android.os.IHwBinder#linkToDeath(android.os.IHwBinder.DeathRecipient, long) parameter #0: - -MissingNullability: android.os.IHwBinder#queryLocalInterface(String): - -MissingNullability: android.os.IHwBinder#queryLocalInterface(String) parameter #0: - -MissingNullability: android.os.IHwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #1: - -MissingNullability: android.os.IHwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #2: - -MissingNullability: android.os.IHwBinder#unlinkToDeath(android.os.IHwBinder.DeathRecipient) parameter #0: - -MissingNullability: android.os.IHwInterface#asBinder(): - -MissingNullability: android.os.IncidentManager#approveReport(android.net.Uri) parameter #0: - -MissingNullability: android.os.IncidentManager#cancelAuthorization(android.os.IncidentManager.AuthListener) parameter #0: - -MissingNullability: android.os.IncidentManager#deleteIncidentReports(android.net.Uri) parameter #0: - -MissingNullability: android.os.IncidentManager#denyReport(android.net.Uri) parameter #0: - -MissingNullability: android.os.IncidentManager#getIncidentReport(android.net.Uri) parameter #0: - -MissingNullability: android.os.IncidentManager#getIncidentReportList(String) parameter #0: - -MissingNullability: android.os.IncidentManager#getPendingReports(): - -MissingNullability: android.os.IncidentManager#reportIncident(android.os.IncidentReportArgs) parameter #0: - -MissingNullability: android.os.IncidentManager#requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener) parameter #1: - -MissingNullability: android.os.IncidentManager#requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener) parameter #3: - -MissingNullability: android.os.IncidentManager.IncidentReport#IncidentReport(android.os.Parcel) parameter #0: - -MissingNullability: android.os.IncidentManager.IncidentReport#getInputStream(): - -MissingNullability: android.os.IncidentManager.IncidentReport#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.os.IncidentReportArgs#IncidentReportArgs(android.os.Parcel) parameter #0: - -MissingNullability: android.os.IncidentReportArgs#addHeader(byte[]) parameter #0: - -MissingNullability: android.os.IncidentReportArgs#readFromParcel(android.os.Parcel) parameter #0: - -MissingNullability: android.os.IncidentReportArgs#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `file` in method `contains` MissingNullability: android.os.ParcelFileDescriptor#getFile(java.io.FileDescriptor): - + Missing nullability on method `getFile` return MissingNullability: android.os.ParcelFileDescriptor#getFile(java.io.FileDescriptor) parameter #0: - -MissingNullability: android.os.RemoteCallback#RemoteCallback(android.os.RemoteCallback.OnResultListener) parameter #0: - -MissingNullability: android.os.RemoteCallback#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `fd` in method `getFile` MissingNullability: android.os.StrictMode#setViolationLogger(android.os.StrictMode.ViolationLogger) parameter #0: - + Missing nullability on parameter `listener` in method `setViolationLogger` MissingNullability: android.os.StrictMode.ViolationInfo#ViolationInfo(android.os.Parcel) parameter #0: - + Missing nullability on parameter `in` in method `ViolationInfo` MissingNullability: android.os.StrictMode.ViolationInfo#ViolationInfo(android.os.Parcel, boolean) parameter #0: - + Missing nullability on parameter `in` in method `ViolationInfo` MissingNullability: android.os.StrictMode.ViolationInfo#broadcastIntentAction: - + Missing nullability on field `broadcastIntentAction` in class `class android.os.StrictMode.ViolationInfo` MissingNullability: android.os.StrictMode.ViolationInfo#dump(android.util.Printer, String) parameter #0: - + Missing nullability on parameter `pw` in method `dump` MissingNullability: android.os.StrictMode.ViolationInfo#dump(android.util.Printer, String) parameter #1: - + Missing nullability on parameter `prefix` in method `dump` MissingNullability: android.os.StrictMode.ViolationInfo#getStackTrace(): - + Missing nullability on method `getStackTrace` return MissingNullability: android.os.StrictMode.ViolationInfo#getViolationClass(): - + Missing nullability on method `getViolationClass` return MissingNullability: android.os.StrictMode.ViolationInfo#getViolationDetails(): - + Missing nullability on method `getViolationDetails` return MissingNullability: android.os.StrictMode.ViolationInfo#tags: - + Missing nullability on field `tags` in class `class android.os.StrictMode.ViolationInfo` MissingNullability: android.os.StrictMode.ViolationInfo#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `dest` in method `writeToParcel` MissingNullability: android.os.StrictMode.ViolationLogger#log(android.os.StrictMode.ViolationInfo) parameter #0: - -MissingNullability: android.os.UserHandle#of(int): - + Missing nullability on parameter `info` in method `log` MissingNullability: android.os.VibrationEffect#RINGTONES: - + Missing nullability on field `RINGTONES` in class `class android.os.VibrationEffect` MissingNullability: android.os.VibrationEffect#get(android.net.Uri, android.content.Context) parameter #0: - + Missing nullability on parameter `uri` in method `get` MissingNullability: android.os.VibrationEffect#get(android.net.Uri, android.content.Context) parameter #1: - + Missing nullability on parameter `context` in method `get` MissingNullability: android.os.VibrationEffect#get(int): - + Missing nullability on method `get` return MissingNullability: android.os.VibrationEffect#get(int, boolean): - + Missing nullability on method `get` return MissingNullability: android.os.VintfObject#getHalNamesAndVersions(): - + Missing nullability on method `getHalNamesAndVersions` return MissingNullability: android.os.VintfObject#getSepolicyVersion(): - + Missing nullability on method `getSepolicyVersion` return MissingNullability: android.os.VintfObject#getTargetFrameworkCompatibilityMatrixVersion(): - + Missing nullability on method `getTargetFrameworkCompatibilityMatrixVersion` return MissingNullability: android.os.VintfObject#getVndkSnapshots(): - + Missing nullability on method `getVndkSnapshots` return MissingNullability: android.os.VintfObject#report(): - + Missing nullability on method `report` return MissingNullability: android.os.VintfRuntimeInfo#getCpuInfo(): - + Missing nullability on method `getCpuInfo` return MissingNullability: android.os.VintfRuntimeInfo#getHardwareId(): - + Missing nullability on method `getHardwareId` return MissingNullability: android.os.VintfRuntimeInfo#getKernelVersion(): - + Missing nullability on method `getKernelVersion` return MissingNullability: android.os.VintfRuntimeInfo#getNodeName(): - + Missing nullability on method `getNodeName` return MissingNullability: android.os.VintfRuntimeInfo#getOsName(): - + Missing nullability on method `getOsName` return MissingNullability: android.os.VintfRuntimeInfo#getOsRelease(): - + Missing nullability on method `getOsRelease` return MissingNullability: android.os.VintfRuntimeInfo#getOsVersion(): - + Missing nullability on method `getOsVersion` return MissingNullability: android.os.WorkSource#add(int, String) parameter #1: - -MissingNullability: android.os.WorkSource#addReturningNewbs(android.os.WorkSource) parameter #0: - -MissingNullability: android.os.WorkSource#getName(int): - -MissingNullability: android.os.WorkSource#setReturningDiffs(android.os.WorkSource) parameter #0: - + Missing nullability on parameter `name` in method `add` MissingNullability: android.os.health.HealthKeys.Constants#Constants(Class) parameter #0: - + Missing nullability on parameter `clazz` in method `Constants` MissingNullability: android.os.health.HealthKeys.Constants#getDataType(): - + Missing nullability on method `getDataType` return MissingNullability: android.os.health.HealthKeys.Constants#getKeys(int): - + Missing nullability on method `getKeys` return MissingNullability: android.os.health.HealthStats#HealthStats(android.os.Parcel) parameter #0: - + Missing nullability on parameter `in` in method `HealthStats` MissingNullability: android.os.health.HealthStatsParceler#HealthStatsParceler(android.os.Parcel) parameter #0: - + Missing nullability on parameter `in` in method `HealthStatsParceler` MissingNullability: android.os.health.HealthStatsParceler#HealthStatsParceler(android.os.health.HealthStatsWriter) parameter #0: - + Missing nullability on parameter `writer` in method `HealthStatsParceler` MissingNullability: android.os.health.HealthStatsParceler#getHealthStats(): - + Missing nullability on method `getHealthStats` return MissingNullability: android.os.health.HealthStatsParceler#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `out` in method `writeToParcel` MissingNullability: android.os.health.HealthStatsWriter#HealthStatsWriter(android.os.health.HealthKeys.Constants) parameter #0: - + Missing nullability on parameter `constants` in method `HealthStatsWriter` MissingNullability: android.os.health.HealthStatsWriter#addMeasurements(int, String, long) parameter #1: - + Missing nullability on parameter `name` in method `addMeasurements` MissingNullability: android.os.health.HealthStatsWriter#addStats(int, String, android.os.health.HealthStatsWriter) parameter #1: - + Missing nullability on parameter `name` in method `addStats` MissingNullability: android.os.health.HealthStatsWriter#addStats(int, String, android.os.health.HealthStatsWriter) parameter #2: - + Missing nullability on parameter `value` in method `addStats` MissingNullability: android.os.health.HealthStatsWriter#addTimers(int, String, android.os.health.TimerStat) parameter #1: - + Missing nullability on parameter `name` in method `addTimers` MissingNullability: android.os.health.HealthStatsWriter#addTimers(int, String, android.os.health.TimerStat) parameter #2: - + Missing nullability on parameter `value` in method `addTimers` MissingNullability: android.os.health.HealthStatsWriter#flattenToParcel(android.os.Parcel) parameter #0: - + Missing nullability on parameter `out` in method `flattenToParcel` MissingNullability: android.os.storage.StorageVolume#getPath(): - -MissingNullability: android.permission.RuntimePermissionPresentationInfo#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on method `getPath` return MissingNullability: android.provider.CalendarContract.Calendars#SYNC_WRITABLE_COLUMNS: - + Missing nullability on field `SYNC_WRITABLE_COLUMNS` in class `class android.provider.CalendarContract.Calendars` MissingNullability: android.provider.CalendarContract.Events#SYNC_WRITABLE_COLUMNS: - -MissingNullability: android.provider.ContactsContract.CommonDataKinds.Phone#ENTERPRISE_CONTENT_URI: - + Missing nullability on field `SYNC_WRITABLE_COLUMNS` in class `class android.provider.CalendarContract.Events` MissingNullability: android.provider.ContactsContract.RawContactsEntity#CORP_CONTENT_URI: - -MissingNullability: android.provider.DeviceConfig#getProperty(String, String): - -MissingNullability: android.provider.DeviceConfig#getString(String, String, String): - -MissingNullability: android.provider.MediaStore#deleteContributedMedia(android.content.Context, String, android.os.UserHandle) parameter #0: - -MissingNullability: android.provider.MediaStore#deleteContributedMedia(android.content.Context, String, android.os.UserHandle) parameter #1: - -MissingNullability: android.provider.MediaStore#deleteContributedMedia(android.content.Context, String, android.os.UserHandle) parameter #2: - -MissingNullability: android.provider.MediaStore#getContributedMediaSize(android.content.Context, String, android.os.UserHandle) parameter #0: - -MissingNullability: android.provider.MediaStore#getContributedMediaSize(android.content.Context, String, android.os.UserHandle) parameter #1: - -MissingNullability: android.provider.MediaStore#getContributedMediaSize(android.content.Context, String, android.os.UserHandle) parameter #2: - -MissingNullability: android.provider.MediaStore#scanFile(android.content.Context, java.io.File): - -MissingNullability: android.provider.MediaStore#scanFile(android.content.Context, java.io.File) parameter #0: - -MissingNullability: android.provider.MediaStore#scanFile(android.content.Context, java.io.File) parameter #1: - -MissingNullability: android.provider.MediaStore#scanFileFromShell(android.content.Context, java.io.File): - -MissingNullability: android.provider.MediaStore#scanFileFromShell(android.content.Context, java.io.File) parameter #0: - -MissingNullability: android.provider.MediaStore#scanFileFromShell(android.content.Context, java.io.File) parameter #1: - -MissingNullability: android.provider.MediaStore#scanVolume(android.content.Context, java.io.File) parameter #0: - -MissingNullability: android.provider.MediaStore#scanVolume(android.content.Context, java.io.File) parameter #1: - -MissingNullability: android.provider.MediaStore#waitForIdle(android.content.Context) parameter #0: - -MissingNullability: android.security.KeyStoreException#KeyStoreException(int, String) parameter #1: - -MissingNullability: android.security.keystore.AttestationUtils#attestDeviceIds(android.content.Context, int[], byte[]) parameter #0: - + Missing nullability on field `CORP_CONTENT_URI` in class `class android.provider.ContactsContract.RawContactsEntity` MissingNullability: android.security.keystore.KeyProtection.Builder#setBoundToSpecificSecureUserId(long): - -MissingNullability: android.service.autofill.AutofillFieldClassificationService#onBind(android.content.Intent): - -MissingNullability: android.service.autofill.AutofillFieldClassificationService#onBind(android.content.Intent) parameter #0: - + Missing nullability on method `setBoundToSpecificSecureUserId` return MissingNullability: android.service.autofill.CompositeUserData#getCategoryIds(): - + Missing nullability on method `getCategoryIds` return MissingNullability: android.service.autofill.CompositeUserData#getDefaultFieldClassificationArgs(): - + Missing nullability on method `getDefaultFieldClassificationArgs` return MissingNullability: android.service.autofill.CompositeUserData#getFieldClassificationAlgorithms(): - + Missing nullability on method `getFieldClassificationAlgorithms` return MissingNullability: android.service.autofill.CompositeUserData#getFieldClassificationArgs(): - + Missing nullability on method `getFieldClassificationArgs` return MissingNullability: android.service.autofill.CompositeUserData#getValues(): - + Missing nullability on method `getValues` return MissingNullability: android.service.autofill.CompositeUserData#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `parcel` in method `writeToParcel` MissingNullability: android.service.autofill.UserData#getFieldClassificationAlgorithms(): - -MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0: - -MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #1: - -MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #2: - -MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#onUnbind(android.content.Intent) parameter #0: - -MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0: - -MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #1: - -MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #2: - -MissingNullability: android.service.notification.Adjustment#Adjustment(String, String, android.os.Bundle, CharSequence, int) parameter #0: - -MissingNullability: android.service.notification.Adjustment#Adjustment(String, String, android.os.Bundle, CharSequence, int) parameter #1: - -MissingNullability: android.service.notification.Adjustment#Adjustment(String, String, android.os.Bundle, CharSequence, int) parameter #2: - -MissingNullability: android.service.notification.Adjustment#Adjustment(String, String, android.os.Bundle, CharSequence, int) parameter #3: - -MissingNullability: android.service.notification.Adjustment#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context) parameter #0: - -MissingNullability: android.service.notification.NotificationStats#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.service.notification.SnoozeCriterion#SnoozeCriterion(String, CharSequence, CharSequence) parameter #0: - -MissingNullability: android.service.notification.SnoozeCriterion#SnoozeCriterion(String, CharSequence, CharSequence) parameter #1: - -MissingNullability: android.service.notification.SnoozeCriterion#SnoozeCriterion(String, CharSequence, CharSequence) parameter #2: - -MissingNullability: android.service.notification.SnoozeCriterion#SnoozeCriterion(android.os.Parcel) parameter #0: - -MissingNullability: android.service.notification.SnoozeCriterion#getConfirmation(): - -MissingNullability: android.service.notification.SnoozeCriterion#getExplanation(): - -MissingNullability: android.service.notification.SnoozeCriterion#getId(): - -MissingNullability: android.service.notification.SnoozeCriterion#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on method `getFieldClassificationAlgorithms` return MissingNullability: android.telecom.Call.Details#getTelecomCallId(): - -MissingNullability: android.telecom.CallScreeningService.CallResponse.Builder#setShouldScreenCallFurther(boolean): - -MissingNullability: android.telecom.Conference#getPrimaryConnection(): - -MissingNullability: android.telecom.PhoneAccountSuggestionService#onBind(android.content.Intent): - -MissingNullability: android.telecom.PhoneAccountSuggestionService#onBind(android.content.Intent) parameter #0: - -MissingNullability: android.telephony.CallQuality#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.DataSpecificRegistrationInfo#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.LteVopsSupportInfo#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.NetworkRegistrationInfo#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on method `getTelecomCallId` return MissingNullability: android.telephony.ServiceState#addNetworkRegistrationInfo(android.telephony.NetworkRegistrationInfo) parameter #0: - + Missing nullability on parameter `nri` in method `addNetworkRegistrationInfo` MissingNullability: android.telephony.ServiceState#setCellBandwidths(int[]) parameter #0: - + Missing nullability on parameter `bandwidths` in method `setCellBandwidths` MissingNullability: android.telephony.SmsManager#checkSmsShortCodeDestination(String, String) parameter #0: - + Missing nullability on parameter `destAddress` in method `checkSmsShortCodeDestination` MissingNullability: android.telephony.SmsManager#checkSmsShortCodeDestination(String, String) parameter #1: - -MissingNullability: android.telephony.TelephonyManager#checkCarrierPrivilegesForPackage(String) parameter #0: - -MissingNullability: android.telephony.TelephonyManager#getCarrierPackageNamesForIntent(android.content.Intent): - -MissingNullability: android.telephony.TelephonyManager#getCarrierPackageNamesForIntent(android.content.Intent) parameter #0: - + Missing nullability on parameter `countryIso` in method `checkSmsShortCodeDestination` MissingNullability: android.telephony.TelephonyManager#getLine1AlphaTag(): - + Missing nullability on method `getLine1AlphaTag` return MissingNullability: android.telephony.TelephonyManager#getRadioHalVersion(): - -MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #0: - -MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #1: - -MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #2: - -MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #3: - -MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #4: - -MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #5: - -MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #6: - + Missing nullability on method `getRadioHalVersion` return MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #0: - + Missing nullability on parameter `mccmnc` in method `setCarrierTestOverride` MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #1: - + Missing nullability on parameter `imsi` in method `setCarrierTestOverride` MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #2: - + Missing nullability on parameter `iccid` in method `setCarrierTestOverride` MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #3: - + Missing nullability on parameter `gid1` in method `setCarrierTestOverride` MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #4: - + Missing nullability on parameter `gid2` in method `setCarrierTestOverride` MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #5: - + Missing nullability on parameter `plmn` in method `setCarrierTestOverride` MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #6: - + Missing nullability on parameter `spn` in method `setCarrierTestOverride` MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #7: - + Missing nullability on parameter `carrierPriviledgeRules` in method `setCarrierTestOverride` MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #8: - -MissingNullability: android.telephony.ims.ImsCallForwardInfo#getNumber(): - -MissingNullability: android.telephony.ims.ImsCallForwardInfo#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile) parameter #2: - -MissingNullability: android.telephony.ims.ImsCallProfile#ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile) parameter #3: - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtra(String): - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtra(String) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtra(String, String): - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtra(String, String) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtra(String, String) parameter #1: - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtraBoolean(String) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtraBoolean(String, boolean) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtraInt(String) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtraInt(String, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#getCallExtras(): - -MissingNullability: android.telephony.ims.ImsCallProfile#getMediaProfile(): - -MissingNullability: android.telephony.ims.ImsCallProfile#getVideoStateFromImsCallProfile(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#setCallExtra(String, String) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#setCallExtra(String, String) parameter #1: - -MissingNullability: android.telephony.ims.ImsCallProfile#setCallExtraBoolean(String, boolean) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#setCallExtraInt(String, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#updateCallExtras(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#updateCallType(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#updateMediaProfile(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallProfile#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionConferenceExtendFailed(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile) parameter #1: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile) parameter #1: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo) parameter #2: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo) parameter #2: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionHeld(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionHoldFailed(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionHoldReceived(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionInitiated(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionInitiatedFailed(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionInviteParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionMergeComplete(android.telephony.ims.stub.ImsCallSessionImplBase) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionMergeFailed(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionMergeStarted(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionMergeStarted(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile) parameter #1: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionProgressing(android.telephony.ims.ImsStreamMediaProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionRemoveParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionResumeFailed(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionResumeReceived(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionResumed(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionRttMessageReceived(String) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionSuppServiceReceived(android.telephony.ims.ImsSuppServiceNotification) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionTerminated(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionUpdateFailed(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionUpdateReceived(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionUpdated(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsCallSessionListener#callSessionUssdMessageReceived(int, String) parameter #1: - -MissingNullability: android.telephony.ims.ImsConferenceState#getConnectionStateForStatus(String) parameter #0: - -MissingNullability: android.telephony.ims.ImsConferenceState#mParticipants: - -MissingNullability: android.telephony.ims.ImsConferenceState#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsExternalCallState#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsReasonInfo#ImsReasonInfo(int, int, String) parameter #2: - -MissingNullability: android.telephony.ims.ImsReasonInfo#getExtraMessage(): - -MissingNullability: android.telephony.ims.ImsReasonInfo#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsService#createMmTelFeature(int): - -MissingNullability: android.telephony.ims.ImsService#createRcsFeature(int): - -MissingNullability: android.telephony.ims.ImsService#getConfig(int): - -MissingNullability: android.telephony.ims.ImsService#getRegistration(int): - -MissingNullability: android.telephony.ims.ImsService#onUpdateSupportedImsFeatures(android.telephony.ims.stub.ImsFeatureConfiguration) parameter #0: - -MissingNullability: android.telephony.ims.ImsService#querySupportedImsFeatures(): - -MissingNullability: android.telephony.ims.ImsSsData#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsSsInfo#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsStreamMediaProfile#copyFrom(android.telephony.ims.ImsStreamMediaProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsStreamMediaProfile#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsSuppServiceNotification#ImsSuppServiceNotification(int, int, int, int, String, String[]) parameter #4: - -MissingNullability: android.telephony.ims.ImsSuppServiceNotification#ImsSuppServiceNotification(int, int, int, int, String, String[]) parameter #5: - -MissingNullability: android.telephony.ims.ImsSuppServiceNotification#history: - -MissingNullability: android.telephony.ims.ImsSuppServiceNotification#number: - -MissingNullability: android.telephony.ims.ImsSuppServiceNotification#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsUtListener#onSupplementaryServiceIndication(android.telephony.ims.ImsSsData) parameter #0: - -MissingNullability: android.telephony.ims.ImsUtListener#onUtConfigurationCallBarringQueried(int, android.telephony.ims.ImsSsInfo[]) parameter #1: - -MissingNullability: android.telephony.ims.ImsUtListener#onUtConfigurationCallForwardQueried(int, android.telephony.ims.ImsCallForwardInfo[]) parameter #1: - -MissingNullability: android.telephony.ims.ImsUtListener#onUtConfigurationCallWaitingQueried(int, android.telephony.ims.ImsSsInfo[]) parameter #1: - -MissingNullability: android.telephony.ims.ImsUtListener#onUtConfigurationQueried(int, android.os.Bundle) parameter #1: - -MissingNullability: android.telephony.ims.ImsUtListener#onUtConfigurationQueryFailed(int, android.telephony.ims.ImsReasonInfo) parameter #1: - -MissingNullability: android.telephony.ims.ImsUtListener#onUtConfigurationUpdateFailed(int, android.telephony.ims.ImsReasonInfo) parameter #1: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#changeCameraCapabilities(android.telecom.VideoProfile.CameraCapabilities) parameter #0: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#onSendSessionModifyRequest(android.telecom.VideoProfile, android.telecom.VideoProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#onSendSessionModifyRequest(android.telecom.VideoProfile, android.telecom.VideoProfile) parameter #1: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#onSendSessionModifyResponse(android.telecom.VideoProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#onSetCamera(String) parameter #0: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#onSetCamera(String, int) parameter #0: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#onSetDisplaySurface(android.view.Surface) parameter #0: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#onSetPauseImage(android.net.Uri) parameter #0: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#onSetPreviewSurface(android.view.Surface) parameter #0: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#receiveSessionModifyRequest(android.telecom.VideoProfile) parameter #0: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#receiveSessionModifyResponse(int, android.telecom.VideoProfile, android.telecom.VideoProfile) parameter #1: - -MissingNullability: android.telephony.ims.ImsVideoCallProvider#receiveSessionModifyResponse(int, android.telecom.VideoProfile, android.telecom.VideoProfile) parameter #2: - -MissingNullability: android.telephony.ims.feature.CapabilityChangeRequest#getCapabilitiesToDisable(): - -MissingNullability: android.telephony.ims.feature.CapabilityChangeRequest#getCapabilitiesToEnable(): - -MissingNullability: android.telephony.ims.feature.CapabilityChangeRequest#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.feature.ImsFeature#changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy) parameter #0: - -MissingNullability: android.telephony.ims.feature.ImsFeature#changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy) parameter #1: - -MissingNullability: android.telephony.ims.feature.MmTelFeature#queryCapabilityStatus(): - -MissingNullability: android.telephony.ims.feature.MmTelFeature.MmTelCapabilities#MmTelCapabilities(android.telephony.ims.feature.ImsFeature.Capabilities) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#accept(int, android.telephony.ims.ImsStreamMediaProfile) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#deflect(String) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#extendToConference(String[]) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#getCallId(): - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#getCallProfile(): - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#getImsVideoCallProvider(): - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#getLocalCallProfile(): - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#getProperty(String): - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#getProperty(String) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#getRemoteCallProfile(): - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#hold(android.telephony.ims.ImsStreamMediaProfile) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#inviteParticipants(String[]) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#removeParticipants(String[]) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#resume(android.telephony.ims.ImsStreamMediaProfile) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#sendDtmf(char, android.os.Message) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#sendRttMessage(String) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#sendRttModifyRequest(android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#sendUssd(String) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#setListener(android.telephony.ims.ImsCallSessionListener) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#start(String, android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#start(String, android.telephony.ims.ImsCallProfile) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#startConference(String[], android.telephony.ims.ImsCallProfile) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#startConference(String[], android.telephony.ims.ImsCallProfile) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase#update(int, android.telephony.ims.ImsStreamMediaProfile) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsCallSessionImplBase.State#toString(int): - -MissingNullability: android.telephony.ims.stub.ImsConfigImplBase#getConfigString(int): - -MissingNullability: android.telephony.ims.stub.ImsConfigImplBase#notifyProvisionedValueChanged(int, String) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsConfigImplBase#setConfig(int, String) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsFeatureConfiguration#getServiceFeatures(): - -MissingNullability: android.telephony.ims.stub.ImsFeatureConfiguration#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsFeatureConfiguration.Builder#addFeature(int, int): - -MissingNullability: android.telephony.ims.stub.ImsFeatureConfiguration.Builder#build(): - -MissingNullability: android.telephony.ims.stub.ImsMultiEndpointImplBase#onImsExternalCallStateUpdate(java.util.List<android.telephony.ims.ImsExternalCallState>) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsRegistrationImplBase#onDeregistered(android.telephony.ims.ImsReasonInfo) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsRegistrationImplBase#onSubscriberAssociatedUriChanged(android.net.Uri[]) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsRegistrationImplBase#onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#getSmsFormat(): - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#onSmsReceived(int, String, byte[]) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#onSmsReceived(int, String, byte[]) parameter #2: - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#onSmsStatusReportReceived(int, String, byte[]) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#onSmsStatusReportReceived(int, String, byte[]) parameter #2: - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#onSmsStatusReportReceived(int, int, String, byte[]) parameter #2: - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#onSmsStatusReportReceived(int, int, String, byte[]) parameter #3: - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#sendSms(int, int, String, String, boolean, byte[]) parameter #2: - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#sendSms(int, int, String, String, boolean, byte[]) parameter #3: - -MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#sendSms(int, int, String, String, boolean, byte[]) parameter #5: - -MissingNullability: android.telephony.ims.stub.ImsUtImplBase#queryCallForward(int, String) parameter #1: - -MissingNullability: android.telephony.ims.stub.ImsUtImplBase#setListener(android.telephony.ims.ImsUtListener) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsUtImplBase#transact(android.os.Bundle) parameter #0: - -MissingNullability: android.telephony.ims.stub.ImsUtImplBase#updateCallBarring(int, int, String[]) parameter #2: - -MissingNullability: android.telephony.ims.stub.ImsUtImplBase#updateCallBarringForServiceClass(int, int, String[], int) parameter #2: - -MissingNullability: android.telephony.ims.stub.ImsUtImplBase#updateCallForward(int, int, String, int, int) parameter #2: - -MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String): - -MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String) parameter #0: - -MissingNullability: android.telephony.mbms.FileInfo#FileInfo(android.net.Uri, String) parameter #0: - -MissingNullability: android.telephony.mbms.FileInfo#FileInfo(android.net.Uri, String) parameter #1: - -MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #0: - -MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #1: - -MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #2: - -MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #3: - -MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #4: - -MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #5: - -MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #6: - -MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #0: - -MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #1: - -MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #2: - -MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #3: - -MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #4: - -MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #5: - -MissingNullability: android.telephony.mbms.UriPathPair#getContentUri(): - -MissingNullability: android.telephony.mbms.UriPathPair#getFilePathUri(): - -MissingNullability: android.telephony.mbms.UriPathPair#writeToParcel(android.os.Parcel, int) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#asBinder(): - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#cancelDownload(android.telephony.mbms.DownloadRequest) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#download(android.telephony.mbms.DownloadRequest) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int) parameter #2: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestUpdateFileServices(int, java.util.List<java.lang.String>) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#setTempFileRootDirectory(int, String) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#onBind(android.content.Intent): - -MissingNullability: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#onBind(android.content.Intent) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#asBinder(): - -MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#getPlaybackUri(int, String) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int) parameter #2: - -MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#requestUpdateStreamingServices(int, java.util.List<java.lang.String>) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) parameter #2: - -MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#stopStreaming(int, String) parameter #1: - -MissingNullability: android.telephony.mbms.vendor.VendorUtils#getAppReceiverFromPackageName(android.content.Context, String): - -MissingNullability: android.telephony.mbms.vendor.VendorUtils#getAppReceiverFromPackageName(android.content.Context, String) parameter #0: - -MissingNullability: android.telephony.mbms.vendor.VendorUtils#getAppReceiverFromPackageName(android.content.Context, String) parameter #1: - + Missing nullability on parameter `apn` in method `setCarrierTestOverride` MissingNullability: android.text.Selection.MemoryTextWatcher#afterTextChanged(android.text.Editable) parameter #0: - + Missing nullability on parameter `s` in method `afterTextChanged` MissingNullability: android.text.Selection.MemoryTextWatcher#beforeTextChanged(CharSequence, int, int, int) parameter #0: - + Missing nullability on parameter `s` in method `beforeTextChanged` MissingNullability: android.text.Selection.MemoryTextWatcher#onTextChanged(CharSequence, int, int, int) parameter #0: - + Missing nullability on parameter `s` in method `onTextChanged` MissingNullability: android.transition.TransitionManager#getTransition(android.transition.Scene): - + Missing nullability on method `getTransition` return MissingNullability: android.transition.TransitionManager#getTransition(android.transition.Scene) parameter #0: - + Missing nullability on parameter `scene` in method `getTransition` MissingNullability: android.util.FeatureFlagUtils#getAllFeatureFlags(): - + Missing nullability on method `getAllFeatureFlags` return MissingNullability: android.util.FeatureFlagUtils#isEnabled(android.content.Context, String) parameter #0: - + Missing nullability on parameter `context` in method `isEnabled` MissingNullability: android.util.FeatureFlagUtils#isEnabled(android.content.Context, String) parameter #1: - + Missing nullability on parameter `feature` in method `isEnabled` MissingNullability: android.util.FeatureFlagUtils#setEnabled(android.content.Context, String, boolean) parameter #0: - + Missing nullability on parameter `context` in method `setEnabled` MissingNullability: android.util.FeatureFlagUtils#setEnabled(android.content.Context, String, boolean) parameter #1: - + Missing nullability on parameter `feature` in method `setEnabled` MissingNullability: android.util.TimeUtils#formatDuration(long): - + Missing nullability on method `formatDuration` return MissingNullability: android.util.proto.EncodedBuffer#dumpBuffers(String) parameter #0: - + Missing nullability on parameter `tag` in method `dumpBuffers` MissingNullability: android.util.proto.EncodedBuffer#dumpByteString(String, String, byte[]) parameter #0: - + Missing nullability on parameter `tag` in method `dumpByteString` MissingNullability: android.util.proto.EncodedBuffer#dumpByteString(String, String, byte[]) parameter #1: - + Missing nullability on parameter `prefix` in method `dumpByteString` MissingNullability: android.util.proto.EncodedBuffer#dumpByteString(String, String, byte[]) parameter #2: - + Missing nullability on parameter `buf` in method `dumpByteString` MissingNullability: android.util.proto.EncodedBuffer#getBytes(int): - + Missing nullability on method `getBytes` return MissingNullability: android.util.proto.EncodedBuffer#getDebugString(): - + Missing nullability on method `getDebugString` return MissingNullability: android.util.proto.EncodedBuffer#writeRawBuffer(byte[]) parameter #0: - + Missing nullability on parameter `val` in method `writeRawBuffer` MissingNullability: android.util.proto.EncodedBuffer#writeRawBuffer(byte[], int, int) parameter #0: - -MissingNullability: android.util.proto.ProtoOutputStream#ProtoOutputStream(java.io.FileDescriptor) parameter #0: - -MissingNullability: android.util.proto.ProtoOutputStream#ProtoOutputStream(java.io.OutputStream) parameter #0: - -MissingNullability: android.util.proto.ProtoOutputStream#dump(String) parameter #0: - -MissingNullability: android.util.proto.ProtoOutputStream#getBytes(): - -MissingNullability: android.util.proto.ProtoOutputStream#write(long, String) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#write(long, byte[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writeBytes(long, byte[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writeObject(long, byte[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedBool(long, boolean[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedDouble(long, double[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedEnum(long, int[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedFixed32(long, int[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedFixed64(long, long[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedFloat(long, float[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedInt32(long, int[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedInt64(long, long[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedSFixed32(long, int[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedSFixed64(long, long[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedSInt32(long, int[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedSInt64(long, long[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedUInt32(long, int[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writePackedUInt64(long, long[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writeRepeatedBytes(long, byte[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writeRepeatedObject(long, byte[]) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writeRepeatedString(long, String) parameter #1: - -MissingNullability: android.util.proto.ProtoOutputStream#writeString(long, String) parameter #1: - + Missing nullability on parameter `val` in method `writeRawBuffer` MissingNullability: android.util.proto.ProtoParseException#ProtoParseException(String) parameter #0: - -MissingNullability: android.util.proto.ProtoStream#FIELD_TYPE_NAMES: - -MissingNullability: android.util.proto.ProtoStream#getFieldCountString(long): - -MissingNullability: android.util.proto.ProtoStream#getFieldIdString(long): - -MissingNullability: android.util.proto.ProtoStream#getFieldTypeString(long): - -MissingNullability: android.util.proto.ProtoStream#getWireTypeString(int): - -MissingNullability: android.util.proto.ProtoStream#token2String(long): - + Missing nullability on parameter `msg` in method `ProtoParseException` MissingNullability: android.util.proto.WireTypeMismatchException#WireTypeMismatchException(String) parameter #0: - + Missing nullability on parameter `msg` in method `WireTypeMismatchException` MissingNullability: android.view.Choreographer#postCallback(int, Runnable, Object) parameter #1: - + Missing nullability on parameter `action` in method `postCallback` MissingNullability: android.view.Choreographer#postCallback(int, Runnable, Object) parameter #2: - + Missing nullability on parameter `token` in method `postCallback` MissingNullability: android.view.Choreographer#postCallbackDelayed(int, Runnable, Object, long) parameter #1: - + Missing nullability on parameter `action` in method `postCallbackDelayed` MissingNullability: android.view.Choreographer#postCallbackDelayed(int, Runnable, Object, long) parameter #2: - + Missing nullability on parameter `token` in method `postCallbackDelayed` MissingNullability: android.view.Choreographer#removeCallbacks(int, Runnable, Object) parameter #1: - + Missing nullability on parameter `action` in method `removeCallbacks` MissingNullability: android.view.Choreographer#removeCallbacks(int, Runnable, Object) parameter #2: - + Missing nullability on parameter `token` in method `removeCallbacks` MissingNullability: android.view.FocusFinder#sort(android.view.View[], int, int, android.view.ViewGroup, boolean) parameter #0: - + Missing nullability on parameter `views` in method `sort` MissingNullability: android.view.FocusFinder#sort(android.view.View[], int, int, android.view.ViewGroup, boolean) parameter #3: - + Missing nullability on parameter `root` in method `sort` MissingNullability: android.view.KeyEvent#actionToString(int): - -MissingNullability: android.view.SurfaceControlViewHost#SurfaceControlViewHost(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #0: - -MissingNullability: android.view.SurfaceControlViewHost#SurfaceControlViewHost(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #1: - -MissingNullability: android.view.SurfaceControlViewHost#SurfaceControlViewHost(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #2: - -MissingNullability: android.view.SurfaceControlViewHost#addView(android.view.View, android.view.WindowManager.LayoutParams) parameter #0: - -MissingNullability: android.view.SurfaceControlViewHost#addView(android.view.View, android.view.WindowManager.LayoutParams) parameter #1: - + Missing nullability on method `actionToString` return MissingNullability: android.view.SurfaceControlViewHost#relayout(android.view.WindowManager.LayoutParams) parameter #0: - + Missing nullability on parameter `attrs` in method `relayout` MissingNullability: android.view.View#getTooltipView(): - + Missing nullability on method `getTooltipView` return MissingNullability: android.view.View#isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable) parameter #0: - + Missing nullability on parameter `background` in method `isDefaultFocusHighlightNeeded` MissingNullability: android.view.View#isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable) parameter #1: - + Missing nullability on parameter `foreground` in method `isDefaultFocusHighlightNeeded` MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.concurrent.Callable<java.io.OutputStream>) parameter #0: - + Missing nullability on parameter `tree` in method `startRenderingCommandsCapture` MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.concurrent.Callable<java.io.OutputStream>) parameter #1: - + Missing nullability on parameter `executor` in method `startRenderingCommandsCapture` MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.concurrent.Callable<java.io.OutputStream>) parameter #2: - -MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.function.Function<android.graphics.Picture,java.lang.Boolean>) parameter #0: - -MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.function.Function<android.graphics.Picture,java.lang.Boolean>) parameter #1: - -MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.function.Function<android.graphics.Picture,java.lang.Boolean>) parameter #2: - + Missing nullability on parameter `callback` in method `startRenderingCommandsCapture` MissingNullability: android.view.WindowManager#holdLock(android.os.IBinder, int) parameter #0: - + Missing nullability on parameter `token` in method `holdLock` MissingNullability: android.view.WindowManager.LayoutParams#accessibilityTitle: - -MissingNullability: android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener#onAccessibilityServicesStateChanged(android.view.accessibility.AccessibilityManager) parameter #0: - -MissingNullability: android.view.accessibility.AccessibilityNodeInfo#setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger) parameter #0: - + Missing nullability on field `accessibilityTitle` in class `class android.view.WindowManager.LayoutParams` MissingNullability: android.view.accessibility.AccessibilityNodeInfo#writeToParcelNoRecycle(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `parcel` in method `writeToParcelNoRecycle` MissingNullability: android.view.accessibility.AccessibilityWindowInfo#setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger) parameter #0: - -MissingNullability: android.view.contentcapture.ContentCaptureEvent#writeToParcel(android.os.Parcel, int) parameter #0: - + Missing nullability on parameter `counter` in method `setNumInstancesInUseCounter` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#asyncNewChild(int): - + Missing nullability on method `asyncNewChild` return MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getAutofillId(): - + Missing nullability on method `getAutofillId` return MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getExtras(): - + Missing nullability on method `getExtras` return MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getHint(): - + Missing nullability on method `getHint` return MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getNode(): - + Missing nullability on method `getNode` return MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getTempRect(): - + Missing nullability on method `getTempRect` return MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getText(): - + Missing nullability on method `getText` return MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#newChild(int): - + Missing nullability on method `newChild` return MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#newHtmlInfoBuilder(String): - + Missing nullability on method `newHtmlInfoBuilder` return MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#newHtmlInfoBuilder(String) parameter #0: - + Missing nullability on parameter `tagName` in method `newHtmlInfoBuilder` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillHints(String[]) parameter #0: - + Missing nullability on parameter `hints` in method `setAutofillHints` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillId(android.view.autofill.AutofillId) parameter #0: - + Missing nullability on parameter `id` in method `setAutofillId` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillId(android.view.autofill.AutofillId, int) parameter #0: - + Missing nullability on parameter `parentId` in method `setAutofillId` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillOptions(CharSequence[]) parameter #0: - + Missing nullability on parameter `options` in method `setAutofillOptions` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillValue(android.view.autofill.AutofillValue) parameter #0: - + Missing nullability on parameter `value` in method `setAutofillValue` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setClassName(String) parameter #0: - + Missing nullability on parameter `className` in method `setClassName` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setContentDescription(CharSequence) parameter #0: - + Missing nullability on parameter `contentDescription` in method `setContentDescription` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setHint(CharSequence) parameter #0: - + Missing nullability on parameter `hint` in method `setHint` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setHintIdEntry(String) parameter #0: - + Missing nullability on parameter `entryName` in method `setHintIdEntry` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setHtmlInfo(android.view.ViewStructure.HtmlInfo) parameter #0: - + Missing nullability on parameter `htmlInfo` in method `setHtmlInfo` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setId(int, String, String, String) parameter #1: - + Missing nullability on parameter `packageName` in method `setId` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setId(int, String, String, String) parameter #2: - + Missing nullability on parameter `typeName` in method `setId` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setId(int, String, String, String) parameter #3: - + Missing nullability on parameter `entryName` in method `setId` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setLocaleList(android.os.LocaleList) parameter #0: - + Missing nullability on parameter `localeList` in method `setLocaleList` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setText(CharSequence) parameter #0: - + Missing nullability on parameter `text` in method `setText` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setText(CharSequence, int, int) parameter #0: - + Missing nullability on parameter `text` in method `setText` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setTextLines(int[], int[]) parameter #0: - + Missing nullability on parameter `charOffsets` in method `setTextLines` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setTextLines(int[], int[]) parameter #1: - + Missing nullability on parameter `baselines` in method `setTextLines` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setTransformation(android.graphics.Matrix) parameter #0: - + Missing nullability on parameter `matrix` in method `setTransformation` MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setWebDomain(String) parameter #0: - + Missing nullability on parameter `domain` in method `setWebDomain` MissingNullability: android.widget.CalendarView#getBoundsForDate(long, android.graphics.Rect) parameter #1: - + Missing nullability on parameter `outBounds` in method `getBoundsForDate` MissingNullability: android.widget.ImageView#isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable) parameter #0: - + Missing nullability on parameter `background` in method `isDefaultFocusHighlightNeeded` MissingNullability: android.widget.ImageView#isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable) parameter #1: - + Missing nullability on parameter `foreground` in method `isDefaultFocusHighlightNeeded` MissingNullability: android.widget.Magnifier#getMagnifierDefaultSize(): - + Missing nullability on method `getMagnifierDefaultSize` return MissingNullability: android.widget.Magnifier#setOnOperationCompleteCallback(android.widget.Magnifier.Callback) parameter #0: - + Missing nullability on parameter `callback` in method `setOnOperationCompleteCallback` MissingNullability: android.widget.NumberPicker#getDisplayedValueForCurrentSelection(): - + Missing nullability on method `getDisplayedValueForCurrentSelection` return MissingNullability: android.widget.PopupMenu#getMenuListView(): - + Missing nullability on method `getMenuListView` return MissingNullability: android.widget.TimePicker#getAmView(): - + Missing nullability on method `getAmView` return MissingNullability: android.widget.TimePicker#getHourView(): - + Missing nullability on method `getHourView` return MissingNullability: android.widget.TimePicker#getMinuteView(): - + Missing nullability on method `getMinuteView` return MissingNullability: android.widget.TimePicker#getPmView(): - + Missing nullability on method `getPmView` return MutableBareField: android.content.AutofillOptions#appDisabledExpiration: - + Bare field appDisabledExpiration must be marked final, or moved behind accessors if mutable MutableBareField: android.content.AutofillOptions#augmentedAutofillEnabled: - + Bare field augmentedAutofillEnabled must be marked final, or moved behind accessors if mutable MutableBareField: android.content.AutofillOptions#disabledActivities: - + Bare field disabledActivities must be marked final, or moved behind accessors if mutable MutableBareField: android.content.AutofillOptions#whitelistedActivitiesForAugmentedAutofill: - + Bare field whitelistedActivitiesForAugmentedAutofill must be marked final, or moved behind accessors if mutable MutableBareField: android.content.pm.UserInfo#convertedFromPreCreated: Bare field convertedFromPreCreated must be marked final, or moved behind accessors if mutable MutableBareField: android.content.pm.UserInfo#creationTime: @@ -2438,588 +796,230 @@ MutableBareField: android.content.pm.UserInfo#serialNumber: MutableBareField: android.content.pm.UserInfo#userType: Bare field userType must be marked final, or moved behind accessors if mutable MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#cache: - + Bare field cache must be marked final, or moved behind accessors if mutable MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#dbName: - + Bare field dbName must be marked final, or moved behind accessors if mutable MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#dbSize: - + Bare field dbSize must be marked final, or moved behind accessors if mutable MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#lookaside: - + Bare field lookaside must be marked final, or moved behind accessors if mutable MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#pageSize: - + Bare field pageSize must be marked final, or moved behind accessors if mutable MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#dbStats: - + Bare field dbStats must be marked final, or moved behind accessors if mutable MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#largestMemAlloc: - + Bare field largestMemAlloc must be marked final, or moved behind accessors if mutable MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#memoryUsed: - + Bare field memoryUsed must be marked final, or moved behind accessors if mutable MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#pageCacheOverflow: - + Bare field pageCacheOverflow must be marked final, or moved behind accessors if mutable MutableBareField: android.os.StrictMode.ViolationInfo#broadcastIntentAction: - + Bare field broadcastIntentAction must be marked final, or moved behind accessors if mutable MutableBareField: android.os.StrictMode.ViolationInfo#durationMillis: - + Bare field durationMillis must be marked final, or moved behind accessors if mutable MutableBareField: android.os.StrictMode.ViolationInfo#numAnimationsRunning: - + Bare field numAnimationsRunning must be marked final, or moved behind accessors if mutable MutableBareField: android.os.StrictMode.ViolationInfo#numInstances: - + Bare field numInstances must be marked final, or moved behind accessors if mutable MutableBareField: android.os.StrictMode.ViolationInfo#tags: - + Bare field tags must be marked final, or moved behind accessors if mutable MutableBareField: android.os.StrictMode.ViolationInfo#violationNumThisLoop: - + Bare field violationNumThisLoop must be marked final, or moved behind accessors if mutable MutableBareField: android.os.StrictMode.ViolationInfo#violationUptimeMillis: - + Bare field violationUptimeMillis must be marked final, or moved behind accessors if mutable NoByteOrShort: android.media.audiofx.AudioEffect#byteArrayToShort(byte[]): - + Should avoid odd sized primitives; use `int` instead of `short` in method android.media.audiofx.AudioEffect.byteArrayToShort(byte[]) NoByteOrShort: android.media.audiofx.AudioEffect#setParameter(int, short) parameter #1: - + Should avoid odd sized primitives; use `int` instead of `short` in parameter value in android.media.audiofx.AudioEffect.setParameter(int param, short value) NoByteOrShort: android.media.audiofx.AudioEffect#shortToByteArray(short) parameter #0: - -NoByteOrShort: android.os.HwBlob#getInt16(long): - -NoByteOrShort: android.os.HwBlob#getInt8(long): - -NoByteOrShort: android.os.HwBlob#putInt16(long, short) parameter #1: - -NoByteOrShort: android.os.HwBlob#putInt8(long, byte) parameter #1: - -NoByteOrShort: android.os.HwParcel#readInt16(): - -NoByteOrShort: android.os.HwParcel#readInt8(): - -NoByteOrShort: android.os.HwParcel#writeInt16(short) parameter #0: - -NoByteOrShort: android.os.HwParcel#writeInt8(byte) parameter #0: - + Should avoid odd sized primitives; use `int` instead of `short` in parameter value in android.media.audiofx.AudioEffect.shortToByteArray(short value) NoByteOrShort: android.util.proto.EncodedBuffer#readRawByte(): - + Should avoid odd sized primitives; use `int` instead of `byte` in method android.util.proto.EncodedBuffer.readRawByte() NoByteOrShort: android.util.proto.EncodedBuffer#writeRawByte(byte) parameter #0: - - - -NoClone: android.net.util.SocketUtils#bindSocketToInterface(java.io.FileDescriptor, String) parameter #0: - -NoClone: android.net.util.SocketUtils#closeSocket(java.io.FileDescriptor) parameter #0: - -NoClone: android.os.NativeHandle#NativeHandle(java.io.FileDescriptor, boolean) parameter #0: - -NoClone: android.os.NativeHandle#getFileDescriptor(): - -NoClone: android.os.ParcelFileDescriptor#getFile(java.io.FileDescriptor) parameter #0: - -NoClone: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0: - -NoClone: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0: - -NoClone: android.util.proto.ProtoOutputStream#ProtoOutputStream(java.io.FileDescriptor) parameter #0: - + Should avoid odd sized primitives; use `int` instead of `byte` in parameter val in android.util.proto.EncodedBuffer.writeRawByte(byte val) NoSettingsProvider: android.provider.Settings.Global#APP_OPS_CONSTANTS: - -NoSettingsProvider: android.provider.Settings.Global#AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES: - + New setting keys are not allowed (Field: APP_OPS_CONSTANTS); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#AUTOMATIC_POWER_SAVE_MODE: - + New setting keys are not allowed (Field: AUTOMATIC_POWER_SAVE_MODE); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#BATTERY_SAVER_CONSTANTS: - + New setting keys are not allowed (Field: BATTERY_SAVER_CONSTANTS); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD: - + New setting keys are not allowed (Field: DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#DYNAMIC_POWER_SAVINGS_ENABLED: - + New setting keys are not allowed (Field: DYNAMIC_POWER_SAVINGS_ENABLED); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#HIDDEN_API_BLACKLIST_EXEMPTIONS: - + New setting keys are not allowed (Field: HIDDEN_API_BLACKLIST_EXEMPTIONS); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#HIDDEN_API_POLICY: - + New setting keys are not allowed (Field: HIDDEN_API_POLICY); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#HIDE_ERROR_DIALOGS: - -NoSettingsProvider: android.provider.Settings.Global#LOCATION_GLOBAL_KILL_SWITCH: - -NoSettingsProvider: android.provider.Settings.Global#LOCATION_IGNORE_SETTINGS_PACKAGE_WHITELIST: - + New setting keys are not allowed (Field: HIDE_ERROR_DIALOGS); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#LOW_POWER_MODE: - + New setting keys are not allowed (Field: LOW_POWER_MODE); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#LOW_POWER_MODE_STICKY: - -NoSettingsProvider: android.provider.Settings.Global#NOTIFICATION_BUBBLES: - + New setting keys are not allowed (Field: LOW_POWER_MODE_STICKY); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Global#OVERLAY_DISPLAY_DEVICES: - -NoSettingsProvider: android.provider.Settings.Global#TETHER_OFFLOAD_DISABLED: - -NoSettingsProvider: android.provider.Settings.Global#USE_OPEN_WIFI_PACKAGE: - + New setting keys are not allowed (Field: OVERLAY_DISPLAY_DEVICES); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED: - + New setting keys are not allowed (Field: ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#ACCESSIBILITY_MAGNIFICATION_CAPABILITY: - + New setting keys are not allowed (Field: ACCESSIBILITY_MAGNIFICATION_CAPABILITY); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#ACCESSIBILITY_MAGNIFICATION_MODE: - -NoSettingsProvider: android.provider.Settings.Secure#ACCESSIBILITY_MAGNIFICATION_MODE_ALL: - -NoSettingsProvider: android.provider.Settings.Secure#ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN: - -NoSettingsProvider: android.provider.Settings.Secure#ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW: - + New setting keys are not allowed (Field: ACCESSIBILITY_MAGNIFICATION_MODE); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#ACCESSIBILITY_SHORTCUT_TARGET_SERVICE: - -NoSettingsProvider: android.provider.Settings.Secure#AUTOFILL_FEATURE_FIELD_CLASSIFICATION: - + New setting keys are not allowed (Field: ACCESSIBILITY_SHORTCUT_TARGET_SERVICE); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#AUTOFILL_SERVICE: - -NoSettingsProvider: android.provider.Settings.Secure#AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT: - -NoSettingsProvider: android.provider.Settings.Secure#AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE: - -NoSettingsProvider: android.provider.Settings.Secure#AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE: - -NoSettingsProvider: android.provider.Settings.Secure#AUTOFILL_USER_DATA_MAX_VALUE_LENGTH: - -NoSettingsProvider: android.provider.Settings.Secure#AUTOFILL_USER_DATA_MIN_VALUE_LENGTH: - + New setting keys are not allowed (Field: AUTOFILL_SERVICE); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#CONTENT_CAPTURE_ENABLED: - + New setting keys are not allowed (Field: CONTENT_CAPTURE_ENABLED); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#DISABLED_PRINT_SERVICES: - -NoSettingsProvider: android.provider.Settings.Secure#DOZE_ALWAYS_ON: - + New setting keys are not allowed (Field: DISABLED_PRINT_SERVICES); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#ENABLED_VR_LISTENERS: - + New setting keys are not allowed (Field: ENABLED_VR_LISTENERS); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#IMMERSIVE_MODE_CONFIRMATIONS: - -NoSettingsProvider: android.provider.Settings.Secure#LOCATION_ACCESS_CHECK_DELAY_MILLIS: - -NoSettingsProvider: android.provider.Settings.Secure#LOCATION_ACCESS_CHECK_INTERVAL_MILLIS: - -NoSettingsProvider: android.provider.Settings.Secure#LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS: - -NoSettingsProvider: android.provider.Settings.Secure#LOCK_SCREEN_SHOW_NOTIFICATIONS: - -NoSettingsProvider: android.provider.Settings.Secure#NFC_PAYMENT_DEFAULT_COMPONENT: - + New setting keys are not allowed (Field: IMMERSIVE_MODE_CONFIRMATIONS); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#NOTIFICATION_BADGING: - + New setting keys are not allowed (Field: NOTIFICATION_BADGING); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#POWER_MENU_LOCKED_SHOW_CONTENT: - + New setting keys are not allowed (Field: POWER_MENU_LOCKED_SHOW_CONTENT); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#SYNC_PARENT_SOUNDS: - -NoSettingsProvider: android.provider.Settings.Secure#USER_SETUP_COMPLETE: - + New setting keys are not allowed (Field: SYNC_PARENT_SOUNDS); use getters/setters in relevant manager class NoSettingsProvider: android.provider.Settings.Secure#VOICE_INTERACTION_SERVICE: - + New setting keys are not allowed (Field: VOICE_INTERACTION_SERVICE); use getters/setters in relevant manager class -NotCloseable: android.app.prediction.AppPredictor: - -NotCloseable: android.net.EthernetManager.TetheredInterfaceRequest: - -NotCloseable: android.os.HwParcel: - -NotCloseable: android.telephony.ims.stub.ImsUtImplBase: - - - -NullableCollection: android.os.UserManager#createProfileForUser(String, String, int, int, String[]) parameter #4: - Type of parameter disallowedPackages in android.os.UserManager.createProfileForUser(String name, String userType, int flags, int userId, String[] disallowedPackages) is a nullable collection (`java.lang.String[]`); must be non-null - - -OnNameExpected: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.PrintWriter, String[]): - -OnNameExpected: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]): - OnNameExpected: android.service.notification.ConditionProviderService#isBound(): - -OnNameExpected: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context): - -OnNameExpected: android.service.quicksettings.TileService#isQuickSettingsSupported(): - + If implemented by developer, should follow the on<Something> style; otherwise consider marking final OnNameExpected: android.service.watchdog.ExplicitHealthCheckService#setCallback(android.os.RemoteCallback): - -OnNameExpected: android.telephony.ims.ImsService#createMmTelFeature(int): - -OnNameExpected: android.telephony.ims.ImsService#createRcsFeature(int): - -OnNameExpected: android.telephony.ims.ImsService#disableIms(int): - -OnNameExpected: android.telephony.ims.ImsService#enableIms(int): - -OnNameExpected: android.telephony.ims.ImsService#getConfig(int): - -OnNameExpected: android.telephony.ims.ImsService#getRegistration(int): - -OnNameExpected: android.telephony.ims.ImsService#querySupportedImsFeatures(): - -OnNameExpected: android.telephony.ims.ImsService#readyForFeatureCreation(): - -OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#dispose(int): - -OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int): - -OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#startGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, android.telephony.mbms.GroupCallCallback): - -OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#stopGroupCall(int, long): - -OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#updateGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>): - - - -OptionalBuilderConstructorArgument: android.app.prediction.AppTargetEvent.Builder#Builder(android.app.prediction.AppTarget, int) parameter #0: - -OptionalBuilderConstructorArgument: android.net.CaptivePortalData.Builder#Builder(android.net.CaptivePortalData) parameter #0: - -OptionalBuilderConstructorArgument: android.os.VibrationAttributes.Builder#Builder(android.media.AudioAttributes, android.os.VibrationEffect) parameter #1: - + If implemented by developer, should follow the on<Something> style; otherwise consider marking final PackageLayering: android.util.FeatureFlagUtils: - + Method parameter type `android.content.Context` violates package layering: nothing in `package android.util` should depend on `package android.content` -ParcelConstructor: android.os.IncidentManager.IncidentReport#IncidentReport(android.os.Parcel): - -ParcelConstructor: android.os.IncidentReportArgs#IncidentReportArgs(android.os.Parcel): - ParcelConstructor: android.os.StrictMode.ViolationInfo#ViolationInfo(android.os.Parcel): - + Parcelable inflation is exposed through CREATOR, not raw constructors, in android.os.StrictMode.ViolationInfo ParcelConstructor: android.os.health.HealthStatsParceler#HealthStatsParceler(android.os.Parcel): - -ParcelConstructor: android.service.notification.SnoozeCriterion#SnoozeCriterion(android.os.Parcel): - + Parcelable inflation is exposed through CREATOR, not raw constructors, in android.os.health.HealthStatsParceler ParcelCreator: android.app.WindowConfiguration: - -ParcelCreator: android.net.metrics.ApfProgramEvent: - -ParcelCreator: android.net.metrics.ApfStats: - -ParcelCreator: android.net.metrics.DhcpClientEvent: - -ParcelCreator: android.net.metrics.DhcpErrorEvent: - -ParcelCreator: android.net.metrics.IpConnectivityLog.Event: - -ParcelCreator: android.net.metrics.IpManagerEvent: - -ParcelCreator: android.net.metrics.IpReachabilityEvent: - -ParcelCreator: android.net.metrics.NetworkEvent: - -ParcelCreator: android.net.metrics.RaEvent: - -ParcelCreator: android.net.metrics.ValidationProbeEvent: - + Parcelable requires a `CREATOR` field; missing in android.app.WindowConfiguration ParcelCreator: android.service.autofill.InternalOnClickAction: - + Parcelable requires a `CREATOR` field; missing in android.service.autofill.InternalOnClickAction ParcelCreator: android.service.autofill.InternalSanitizer: - + Parcelable requires a `CREATOR` field; missing in android.service.autofill.InternalSanitizer ParcelCreator: android.service.autofill.InternalTransformation: - + Parcelable requires a `CREATOR` field; missing in android.service.autofill.InternalTransformation ParcelCreator: android.service.autofill.InternalValidator: - + Parcelable requires a `CREATOR` field; missing in android.service.autofill.InternalValidator ParcelNotFinal: android.app.WindowConfiguration: - + Parcelable classes must be final: android.app.WindowConfiguration is not final ParcelNotFinal: android.content.pm.UserInfo: Parcelable classes must be final: android.content.pm.UserInfo is not final -ParcelNotFinal: android.net.metrics.IpConnectivityLog.Event: - -ParcelNotFinal: android.os.IncidentManager.IncidentReport: - ParcelNotFinal: android.os.health.HealthStatsParceler: - + Parcelable classes must be final: android.os.health.HealthStatsParceler is not final ParcelNotFinal: android.service.autofill.InternalOnClickAction: - + Parcelable classes must be final: android.service.autofill.InternalOnClickAction is not final ParcelNotFinal: android.service.autofill.InternalSanitizer: - + Parcelable classes must be final: android.service.autofill.InternalSanitizer is not final ParcelNotFinal: android.service.autofill.InternalTransformation: - + Parcelable classes must be final: android.service.autofill.InternalTransformation is not final ParcelNotFinal: android.service.autofill.InternalValidator: - + Parcelable classes must be final: android.service.autofill.InternalValidator is not final ProtectedMember: android.app.AppDetailsActivity#onCreate(android.os.Bundle): - -ProtectedMember: android.os.VibrationEffect#scale(int, float, int): - -ProtectedMember: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]): - -ProtectedMember: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.PrintWriter, String[]): - -ProtectedMember: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]): - -ProtectedMember: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context): - -ProtectedMember: android.util.proto.ProtoStream#FIELD_TYPE_NAMES: - + Protected methods not allowed; must be public: method android.app.AppDetailsActivity.onCreate(android.os.Bundle)} ProtectedMember: android.view.View#resetResolvedDrawables(): - + Protected methods not allowed; must be public: method android.view.View.resetResolvedDrawables()} ProtectedMember: android.view.ViewGroup#resetResolvedDrawables(): - + Protected methods not allowed; must be public: method android.view.ViewGroup.resetResolvedDrawables()} -RawAidl: android.telephony.mbms.vendor.MbmsDownloadServiceBase: - -RawAidl: android.telephony.mbms.vendor.MbmsStreamingServiceBase: - +RethrowRemoteException: android.app.ActivityManager#resumeAppSwitches(): + Methods calling system APIs should rethrow `RemoteException` as `RuntimeException` (but do not list it in the throws clause) -RethrowRemoteException: android.app.ActivityManager#resumeAppSwitches(): - -RethrowRemoteException: android.os.HwBinder#getService(String, String): - -RethrowRemoteException: android.os.HwBinder#getService(String, String, boolean): - -RethrowRemoteException: android.os.HwBinder#onTransact(int, android.os.HwParcel, android.os.HwParcel, int): - -RethrowRemoteException: android.os.HwBinder#registerService(String): - -RethrowRemoteException: android.os.HwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int): - -RethrowRemoteException: android.os.IHwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int): - -RethrowRemoteException: android.telephony.ims.ImsService#onUpdateSupportedImsFeatures(android.telephony.ims.stub.ImsFeatureConfiguration): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#cancelDownload(android.telephony.mbms.DownloadRequest): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#dispose(int): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#download(android.telephony.mbms.DownloadRequest): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#listPendingDownloads(int): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestUpdateFileServices(int, java.util.List<java.lang.String>): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#resetDownloadKnowledge(android.telephony.mbms.DownloadRequest): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#setTempFileRootDirectory(int, String): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#dispose(int): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#dispose(int): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#getPlaybackUri(int, String): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#requestUpdateStreamingServices(int, java.util.List<java.lang.String>): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback): - -RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#stopStreaming(int, String): - - - -SamShouldBeLast: android.app.ActivityManager#addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int): - SamShouldBeLast: android.database.sqlite.SQLiteDebug#dump(android.util.Printer, String[]): - + SAM-compatible parameters (such as parameter 1, "printer", in android.database.sqlite.SQLiteDebug.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.database.sqlite.SQLiteDirectCursorDriver#query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]): - -SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(android.location.LocationRequest, android.location.LocationListener, android.os.Looper): - -SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(android.location.LocationRequest, java.util.concurrent.Executor, android.location.LocationListener): - -SamShouldBeLast: android.os.BugreportManager#startBugreport(android.os.ParcelFileDescriptor, android.os.ParcelFileDescriptor, android.os.BugreportParams, java.util.concurrent.Executor, android.os.BugreportManager.BugreportCallback): - -SamShouldBeLast: android.os.IHwBinder#linkToDeath(android.os.IHwBinder.DeathRecipient, long): - + SAM-compatible parameters (such as parameter 1, "factory", in android.database.sqlite.SQLiteDirectCursorDriver.query) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.os.StrictMode.ViolationInfo#dump(android.util.Printer, String): - + SAM-compatible parameters (such as parameter 1, "pw", in android.os.StrictMode.ViolationInfo.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.permission.PermissionControllerManager#countPermissionApps(java.util.List<java.lang.String>, int, android.permission.PermissionControllerManager.OnCountPermissionAppsResultCallback, android.os.Handler): - + SAM-compatible parameters (such as parameter 3, "callback", in android.permission.PermissionControllerManager.countPermissionApps) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.permission.PermissionControllerManager#getAppPermissions(String, android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, android.os.Handler): - -SamShouldBeLast: android.permission.PermissionControllerManager#revokeRuntimePermissions(java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, java.util.concurrent.Executor, android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback): - + SAM-compatible parameters (such as parameter 2, "callback", in android.permission.PermissionControllerManager.getAppPermissions) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.service.autofill.CharSequenceTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int): - + SAM-compatible parameters (such as parameter 1, "finder", in android.service.autofill.CharSequenceTransformation.apply) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.service.autofill.DateTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int): - + SAM-compatible parameters (such as parameter 1, "finder", in android.service.autofill.DateTransformation.apply) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.service.autofill.ImageTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int): - + SAM-compatible parameters (such as parameter 1, "finder", in android.service.autofill.ImageTransformation.apply) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.service.autofill.InternalTransformation#batchApply(android.service.autofill.ValueFinder, android.widget.RemoteViews, java.util.ArrayList<android.util.Pair<java.lang.Integer,android.service.autofill.InternalTransformation>>): - -SamShouldBeLast: android.telephony.ims.ImsMmTelManager#getFeatureState(java.util.function.Consumer<java.lang.Integer>, java.util.concurrent.Executor): - + SAM-compatible parameters (such as parameter 1, "finder", in android.service.autofill.InternalTransformation.batchApply) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.view.Choreographer#postCallback(int, Runnable, Object): - + SAM-compatible parameters (such as parameter 2, "action", in android.view.Choreographer.postCallback) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.view.Choreographer#postCallbackDelayed(int, Runnable, Object, long): - + SAM-compatible parameters (such as parameter 2, "action", in android.view.Choreographer.postCallbackDelayed) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.view.Choreographer#removeCallbacks(int, Runnable, Object): - -SamShouldBeLast: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.function.Function<android.graphics.Picture,java.lang.Boolean>): - -SamShouldBeLast: android.view.accessibility.AccessibilityManager#addAccessibilityServicesStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener, android.os.Handler): - - - -ServiceName: android.Manifest.permission#BIND_CELL_BROADCAST_SERVICE: - -ServiceName: android.app.AppOpsManager#OPSTR_BIND_ACCESSIBILITY_SERVICE: - -ServiceName: android.provider.Settings.Secure#ACCESSIBILITY_SHORTCUT_TARGET_SERVICE: - -ServiceName: android.provider.Settings.Secure#AUTOFILL_SERVICE: - -ServiceName: android.provider.Settings.Secure#VOICE_INTERACTION_SERVICE: - - - -SetterReturnsThis: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener): - -SetterReturnsThis: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener): - - - -StartWithLower: android.content.pm.PackageManager#BINDER(): - Method name must start with lowercase char: BINDER - - -StaticFinalBuilder: android.content.integrity.RuleSet.Builder: - -StaticFinalBuilder: android.hardware.display.BrightnessConfiguration.Builder: - -StaticFinalBuilder: android.media.audiopolicy.AudioMix.Builder: - -StaticFinalBuilder: android.media.audiopolicy.AudioMixingRule.Builder: - -StaticFinalBuilder: android.media.audiopolicy.AudioPolicy.Builder: - -StaticFinalBuilder: android.net.CaptivePortalData.Builder: - -StaticFinalBuilder: android.net.TetheringManager.TetheringRequest.Builder: - -StaticFinalBuilder: android.telephony.ims.stub.ImsFeatureConfiguration.Builder: - + SAM-compatible parameters (such as parameter 2, "action", in android.view.Choreographer.removeCallbacks) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions StaticUtils: android.os.health.HealthKeys: - + Fully-static utility classes must not have constructor StaticUtils: android.service.autofill.InternalTransformation: - -StaticUtils: android.telephony.mbms.vendor.VendorUtils: - + Fully-static utility classes must not have constructor StaticUtils: android.util.FeatureFlagUtils: - -StaticUtils: android.util.proto.ProtoStream: - + Fully-static utility classes must not have constructor StreamFiles: android.os.Environment#buildPath(java.io.File, java.lang.String...): - + Methods accepting `File` should also accept `FileDescriptor` or streams: method android.os.Environment.buildPath(java.io.File,java.lang.String...) StreamFiles: android.os.FileUtils#contains(java.io.File, java.io.File): - -StreamFiles: android.provider.MediaStore#scanFile(android.content.Context, java.io.File): - -StreamFiles: android.provider.MediaStore#scanFileFromShell(android.content.Context, java.io.File): - -StreamFiles: android.provider.MediaStore#scanVolume(android.content.Context, java.io.File): - + Methods accepting `File` should also accept `FileDescriptor` or streams: method android.os.FileUtils.contains(java.io.File,java.io.File) UseIcu: android.hardware.soundtrigger.KeyphraseEnrollmentInfo#getKeyphraseMetadata(String, java.util.Locale) parameter #1: - + Type `java.util.Locale` should be replaced with richer ICU type `android.icu.util.ULocale` UseIcu: android.hardware.soundtrigger.KeyphraseEnrollmentInfo#getManageKeyphraseIntent(int, String, java.util.Locale) parameter #2: - + Type `java.util.Locale` should be replaced with richer ICU type `android.icu.util.ULocale` UseIcu: android.hardware.soundtrigger.KeyphraseMetadata#supportsLocale(java.util.Locale) parameter #0: - -UseIcu: android.hardware.soundtrigger.SoundTrigger.Keyphrase#Keyphrase(int, int, java.util.Locale, String, int[]) parameter #2: - -UseIcu: android.hardware.soundtrigger.SoundTrigger.Keyphrase#getLocale(): - - - -UseParcelFileDescriptor: android.util.proto.ProtoOutputStream#ProtoOutputStream(java.io.FileDescriptor) parameter #0: - + Type `java.util.Locale` should be replaced with richer ICU type `android.icu.util.ULocale` -UserHandle: android.app.ActivityManager#switchUser(android.os.UserHandle): - UserHandle: android.app.admin.DevicePolicyManager#getOwnerInstalledCaCerts(android.os.UserHandle): - + When a method overload is needed to target a specific UserHandle, callers should be directed to use Context.createPackageContextAsUser() and re-obtain the relevant Manager, and no new API should be added UserHandle: android.app.usage.StorageStatsManager#queryCratesForPackage(java.util.UUID, String, android.os.UserHandle): - + When a method overload is needed to target a specific UserHandle, callers should be directed to use Context.createPackageContextAsUser() and re-obtain the relevant Manager, and no new API should be added UserHandle: android.app.usage.StorageStatsManager#queryCratesForUser(java.util.UUID, android.os.UserHandle): - -UserHandle: android.companion.CompanionDeviceManager#isDeviceAssociated(String, android.net.MacAddress, android.os.UserHandle): - -UserHandle: android.companion.CompanionDeviceManager#isDeviceAssociatedForWifiConnection(String, android.net.MacAddress, android.os.UserHandle): - + When a method overload is needed to target a specific UserHandle, callers should be directed to use Context.createPackageContextAsUser() and re-obtain the relevant Manager, and no new API should be added UserHandle: android.content.pm.PackageManager#getInstallReason(String, android.os.UserHandle): - -UserHandle: android.content.pm.PackageManager#getPermissionFlags(String, String, android.os.UserHandle): - -UserHandle: android.content.pm.PackageManager#grantRuntimePermission(String, String, android.os.UserHandle): - -UserHandle: android.content.pm.PackageManager#revokeRuntimePermission(String, String, android.os.UserHandle): - -UserHandle: android.content.pm.PackageManager#revokeRuntimePermission(String, String, android.os.UserHandle, String): - -UserHandle: android.content.pm.PackageManager#updatePermissionFlags(String, String, int, int, android.os.UserHandle): - -UserHandle: android.location.LocationManager#setLocationEnabledForUser(boolean, android.os.UserHandle): - -UserHandle: android.permission.PermissionControllerManager#applyStagedRuntimePermissionBackup(String, android.os.UserHandle, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Boolean>): - -UserHandle: android.permission.PermissionControllerManager#getRuntimePermissionBackup(android.os.UserHandle, java.util.concurrent.Executor, java.util.function.Consumer<byte[]>): - -UserHandle: android.permission.PermissionControllerManager#stageAndApplyRuntimePermissionsBackup(byte[], android.os.UserHandle): - -UserHandle: android.telecom.TelecomManager#getDefaultDialerPackage(android.os.UserHandle): - + When a method overload is needed to target a specific UserHandle, callers should be directed to use Context.createPackageContextAsUser() and re-obtain the relevant Manager, and no new API should be added UserHandleName: android.content.AutofillOptions: - + Classes holding a set of parameters should be called `FooParams`, was `AutofillOptions` UserHandleName: android.content.ContentCaptureOptions: - -UserHandleName: android.os.IncidentReportArgs: - -UserHandleName: android.provider.MediaStore#deleteContributedMedia(android.content.Context, String, android.os.UserHandle): - -UserHandleName: android.provider.MediaStore#getContributedMediaSize(android.content.Context, String, android.os.UserHandle): - - - -VisiblySynchronized: PsiClassObjectAccessExpression: - -VisiblySynchronized: PsiThisExpression: - -VisiblySynchronized: android.app.ActivityManager#addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int): - -VisiblySynchronized: android.app.ActivityManager#removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener): - -VisiblySynchronized: android.content.ContentProviderClient#setDetectNotResponding(long): - + Classes holding a set of parameters should be called `FooParams`, was `ContentCaptureOptions` + + +VisiblySynchronized: PsiThisExpression:this: + Internal locks must not be exposed (synchronizing on this or class is still externally observable): method android.content.res.AssetManager.getApkPaths() VisiblySynchronized: android.content.res.AssetManager#getApkPaths(): - + Internal locks must not be exposed (synchronizing on this or class is still externally observable): method android.content.res.AssetManager.getApkPaths() VisiblySynchronized: android.content.res.AssetManager#getLastResourceResolution(): - + Internal locks must not be exposed (synchronizing on this or class is still externally observable): method android.content.res.AssetManager.getLastResourceResolution() VisiblySynchronized: android.content.res.AssetManager#getOverlayablesToString(String): - + Internal locks must not be exposed (synchronizing on this or class is still externally observable): method android.content.res.AssetManager.getOverlayablesToString(String) VisiblySynchronized: android.content.res.AssetManager#setResourceResolutionLoggingEnabled(boolean): - + Internal locks must not be exposed (synchronizing on this or class is still externally observable): method android.content.res.AssetManager.setResourceResolutionLoggingEnabled(boolean) VisiblySynchronized: android.os.MessageQueue#removeSyncBarrier(int): - + Internal locks must not be exposed (synchronizing on this or class is still externally observable): method android.os.MessageQueue.removeSyncBarrier(int) diff --git a/core/java/android/inputmethodservice/NavigationBarController.java b/core/java/android/inputmethodservice/NavigationBarController.java index dc38db2134f4..69105016e0ea 100644 --- a/core/java/android/inputmethodservice/NavigationBarController.java +++ b/core/java/android/inputmethodservice/NavigationBarController.java @@ -152,6 +152,7 @@ final class NavigationBarController { private boolean mDrawLegacyNavigationBarBackground; private final Rect mTempRect = new Rect(); + private final int[] mTempPos = new int[2]; Impl(@NonNull InputMethodService inputMethodService) { mService = inputMethodService; @@ -259,21 +260,28 @@ final class NavigationBarController { switch (originalInsets.touchableInsets) { case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME: if (inputFrame.getVisibility() == View.VISIBLE) { - inputFrame.getBoundsOnScreen(mTempRect); + inputFrame.getLocationInWindow(mTempPos); + mTempRect.set(mTempPos[0], mTempPos[1], + mTempPos[0] + inputFrame.getWidth(), + mTempPos[1] + inputFrame.getHeight()); touchableRegion = new Region(mTempRect); } break; case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT: if (inputFrame.getVisibility() == View.VISIBLE) { - inputFrame.getBoundsOnScreen(mTempRect); - mTempRect.top = originalInsets.contentTopInsets; + inputFrame.getLocationInWindow(mTempPos); + mTempRect.set(mTempPos[0], originalInsets.contentTopInsets, + mTempPos[0] + inputFrame.getWidth() , + mTempPos[1] + inputFrame.getHeight()); touchableRegion = new Region(mTempRect); } break; case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE: if (inputFrame.getVisibility() == View.VISIBLE) { - inputFrame.getBoundsOnScreen(mTempRect); - mTempRect.top = originalInsets.visibleTopInsets; + inputFrame.getLocationInWindow(mTempPos); + mTempRect.set(mTempPos[0], originalInsets.visibleTopInsets, + mTempPos[0] + inputFrame.getWidth(), + mTempPos[1] + inputFrame.getHeight()); touchableRegion = new Region(mTempRect); } break; diff --git a/core/java/android/service/games/GameSession.java b/core/java/android/service/games/GameSession.java index 01152943efe3..e8d53d351795 100644 --- a/core/java/android/service/games/GameSession.java +++ b/core/java/android/service/games/GameSession.java @@ -25,7 +25,6 @@ import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.app.ActivityTaskManager; import android.app.Instrumentation; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; @@ -511,14 +510,11 @@ public abstract class GameSession { callback.onActivityResult(result.getResultCode(), result.getData()); }, executor); - final Intent trampolineIntent = new Intent(); - trampolineIntent.setComponent( - new ComponentName( - "android", "android.service.games.GameSessionTrampolineActivity")); - trampolineIntent.putExtra(GameSessionTrampolineActivity.INTENT_KEY, intent); - trampolineIntent.putExtra(GameSessionTrampolineActivity.OPTIONS_KEY, options); - trampolineIntent.putExtra( - GameSessionTrampolineActivity.FUTURE_KEY, future); + final Intent trampolineIntent = + GameSessionTrampolineActivity.createIntent( + intent, + options, + future); try { int result = ActivityTaskManager.getService().startActivityFromGameSession( diff --git a/core/java/android/service/games/GameSessionActivityResult.java b/core/java/android/service/games/GameSessionActivityResult.java index a2ec6ada010c..c8099e6e5eff 100644 --- a/core/java/android/service/games/GameSessionActivityResult.java +++ b/core/java/android/service/games/GameSessionActivityResult.java @@ -22,8 +22,12 @@ import android.content.Intent; import android.os.Parcel; import android.os.Parcelable; +import com.android.internal.annotations.VisibleForTesting; -final class GameSessionActivityResult implements Parcelable { + +/** @hide */ +@VisibleForTesting +public final class GameSessionActivityResult implements Parcelable { public static final Creator<GameSessionActivityResult> CREATOR = new Creator<GameSessionActivityResult>() { @@ -44,17 +48,17 @@ final class GameSessionActivityResult implements Parcelable { @Nullable private final Intent mData; - GameSessionActivityResult(int resultCode, @Nullable Intent data) { + public GameSessionActivityResult(int resultCode, @Nullable Intent data) { mResultCode = resultCode; mData = data; } - int getResultCode() { + public int getResultCode() { return mResultCode; } @Nullable - Intent getData() { + public Intent getData() { return mData; } diff --git a/core/java/android/service/games/GameSessionService.java b/core/java/android/service/games/GameSessionService.java index df5bad5c53b2..52c8ec3d4018 100644 --- a/core/java/android/service/games/GameSessionService.java +++ b/core/java/android/service/games/GameSessionService.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SystemApi; import android.app.Service; +import android.content.Context; import android.content.Intent; import android.hardware.display.DisplayManager; import android.os.Binder; @@ -28,6 +29,7 @@ import android.os.Handler; import android.os.IBinder; import android.view.Display; import android.view.SurfaceControlViewHost; +import android.view.WindowManager; import com.android.internal.infra.AndroidFuture; import com.android.internal.util.function.pooled.PooledLambda; @@ -117,13 +119,18 @@ public abstract class GameSessionService extends Service { } IBinder hostToken = new Binder(); + + // Use a WindowContext so that views attached to the SurfaceControlViewHost will receive + // configuration changes (rather than always perceiving the global configuration). + final Context windowContext = createWindowContext(display, + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, /*options=*/ null); SurfaceControlViewHost surfaceControlViewHost = - new SurfaceControlViewHost(this, display, hostToken); + new SurfaceControlViewHost(windowContext, display, hostToken); gameSession.attach( gameSessionController, createGameSessionRequest.getTaskId(), - this, + windowContext, surfaceControlViewHost, gameSessionViewHostConfiguration.mWidthPx, gameSessionViewHostConfiguration.mHeightPx); diff --git a/core/java/android/service/games/GameSessionTrampolineActivity.java b/core/java/android/service/games/GameSessionTrampolineActivity.java index 3d97d0f59b33..e890876df3e7 100644 --- a/core/java/android/service/games/GameSessionTrampolineActivity.java +++ b/core/java/android/service/games/GameSessionTrampolineActivity.java @@ -16,12 +16,15 @@ package android.service.games; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; +import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.util.Slog; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.infra.AndroidFuture; import java.util.concurrent.Executor; @@ -35,6 +38,7 @@ import java.util.concurrent.Executor; * * @hide */ +@VisibleForTesting public final class GameSessionTrampolineActivity extends Activity { private static final String TAG = "GameSessionTrampoline"; private static final int REQUEST_CODE = 1; @@ -42,11 +46,52 @@ public final class GameSessionTrampolineActivity extends Activity { static final String FUTURE_KEY = "GameSessionTrampolineActivity.future"; static final String INTENT_KEY = "GameSessionTrampolineActivity.intent"; static final String OPTIONS_KEY = "GameSessionTrampolineActivity.options"; + private static final String HAS_LAUNCHED_INTENT_KEY = + "GameSessionTrampolineActivity.hasLaunchedIntent"; + private boolean mHasLaunchedIntent = false; + + /** + * Create an {@link Intent} for the {@link GameSessionTrampolineActivity} with the given + * parameters. + * + * @param targetIntent the forwarded {@link Intent} that is associated with the Activity that + * will be launched by the {@link GameSessionTrampolineActivity}. + * @param options Activity options. See {@link #startActivity(Intent, Bundle)}. + * @param resultFuture the {@link AndroidFuture} that will complete with the activity results of + * {@code targetIntent} launched. + * @return the Intent that will launch the {@link GameSessionTrampolineActivity} with the given + * parameters. + * @hide + */ + @VisibleForTesting + public static Intent createIntent( + @NonNull Intent targetIntent, + @Nullable Bundle options, + @NonNull AndroidFuture<GameSessionActivityResult> resultFuture) { + final Intent trampolineIntent = new Intent(); + trampolineIntent.setComponent( + new ComponentName( + "android", "android.service.games.GameSessionTrampolineActivity")); + trampolineIntent.putExtra(INTENT_KEY, targetIntent); + trampolineIntent.putExtra(OPTIONS_KEY, options); + trampolineIntent.putExtra(FUTURE_KEY, resultFuture); + + return trampolineIntent; + } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + mHasLaunchedIntent = savedInstanceState.getBoolean(HAS_LAUNCHED_INTENT_KEY); + } + + if (mHasLaunchedIntent) { + return; + } + mHasLaunchedIntent = true; + try { startActivityAsCaller( getIntent().getParcelableExtra(INTENT_KEY), @@ -64,6 +109,12 @@ public final class GameSessionTrampolineActivity extends Activity { } @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(HAS_LAUNCHED_INTENT_KEY, mHasLaunchedIntent); + } + + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode != REQUEST_CODE) { // Something went very wrong if we hit this code path, and we should bail. diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java index 4bbfbc2e717d..b783f6b8fd51 100644 --- a/core/java/android/service/voice/VoiceInteractionSession.java +++ b/core/java/android/service/voice/VoiceInteractionSession.java @@ -1095,7 +1095,7 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall if (!mWindowVisible) { mWindowVisible = true; if (mUiEnabled) { - mWindow.show(); + showWindow(); } } if (showCallback != null) { @@ -1284,9 +1284,25 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall } } + void showWindow() { + if (mWindow != null) { + mWindow.show(); + try { + mSystemService.setSessionWindowVisible(mToken, true); + } catch (RemoteException e) { + Log.w(TAG, "Failed to notify session window shown", e); + } + } + } + void ensureWindowHidden() { if (mWindow != null) { mWindow.hide(); + try { + mSystemService.setSessionWindowVisible(mToken, false); + } catch (RemoteException e) { + Log.w(TAG, "Failed to notify session window hidden", e); + } } } @@ -1377,7 +1393,7 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall if (mWindowVisible) { if (enabled) { ensureWindowAdded(); - mWindow.show(); + showWindow(); } else { ensureWindowHidden(); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index cf5727ea1342..62d0d37da84d 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -12066,8 +12066,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * <p>In multiple-screen scenarios, if the surface spans multiple screens, * the coordinate space of the surface also spans multiple screens. * - * <p>After the method returns, the argument array contains the x- and - * y-coordinates of the view relative to the view's left and top edges, + * <p>After the method returns, the argument array contains the x and y + * coordinates of the view relative to the view's left and top edges, * respectively. * * @param location A two-element integer array in which the view coordinates @@ -18743,18 +18743,37 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * If some part of this view is not clipped by any of its parents, then - * return that area in r in global (root) coordinates. To convert r to local - * coordinates (without taking possible View rotations into account), offset - * it by -globalOffset (e.g. r.offset(-globalOffset.x, -globalOffset.y)). - * If the view is completely clipped or translated out, return false. + * Sets {@code r} to the coordinates of the non-clipped area of this view in + * the coordinate space of the view's root view. Sets {@code globalOffset} + * to the offset of the view's x and y coordinates from the coordinate space + * origin, which is the top left corner of the root view irrespective of + * screen decorations and system UI elements. * - * @param r If true is returned, r holds the global coordinates of the - * visible portion of this view. - * @param globalOffset If true is returned, globalOffset holds the dx,dy - * between this view and its root. globalOffet may be null. - * @return true if r is non-empty (i.e. part of the view is visible at the - * root level. + * <p>To convert {@code r} to coordinates relative to the top left corner of + * this view (without taking view rotations into account), offset {@code r} + * by the inverse values of + * {@code globalOffset}—{@code r.offset(-globalOffset.x, + * -globalOffset.y)}—which is equivalent to calling + * {@link #getLocalVisibleRect(Rect) getLocalVisibleRect(Rect)}. + * + * <p><b>Note:</b> Do not use this method to determine the size of a window + * in multi-window mode; use + * {@link WindowManager#getCurrentWindowMetrics()}. + * + * @param r If the method returns true, contains the coordinates of the + * visible portion of this view in the coordinate space of the view's + * root view. If the method returns false, the contents of {@code r} + * are undefined. + * @param globalOffset If the method returns true, contains the offset of + * the x and y coordinates of this view from the top left corner of the + * view's root view. If the method returns false, the contents of + * {@code globalOffset} are undefined. The argument can be null (see + * {@link #getGlobalVisibleRect(Rect) getGlobalVisibleRect(Rect)}. + * @return true if at least part of the view is visible within the root + * view; false if the view is completely clipped or translated out of + * the visible area of the root view. + * + * @see #getLocalVisibleRect(Rect) */ public boolean getGlobalVisibleRect(Rect r, Point globalOffset) { int width = mRight - mLeft; @@ -18769,10 +18788,48 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return false; } + /** + * Sets {@code r} to the coordinates of the non-clipped area of this view in + * the coordinate space of the view's root view. + * + * <p>See {@link #getGlobalVisibleRect(Rect, Point) + * getGlobalVisibleRect(Rect, Point)} for more information. + * + * @param r If the method returns true, contains the coordinates of the + * visible portion of this view in the coordinate space of the view's + * root view. If the method returns false, the contents of {@code r} + * are undefined. + * @return true if at least part of the view is visible within the root + * view; otherwise false. + */ public final boolean getGlobalVisibleRect(Rect r) { return getGlobalVisibleRect(r, null); } + /** + * Sets {@code r} to the coordinates of the non-clipped area of this view + * relative to the top left corner of the view. + * + * <p>If the view is clipped on the left or top, the left and top + * coordinates are offset from 0 by the clipped amount. For example, if the + * view is off screen 50px on the left and 30px at the top, the left and top + * coordinates are 50 and 30 respectively. + * + * <p>If the view is clipped on the right or bottom, the right and bottom + * coordinates are reduced by the clipped amount. For example, if the view + * is off screen 40px on the right and 20px at the bottom, the right + * coordinate is the view width - 40, and the bottom coordinate is the view + * height - 20. + * + * @param r If the method returns true, contains the coordinates of the + * visible portion of this view relative to the top left corner of the + * view. If the method returns false, the contents of {@code r} are + * undefined. + * @return true if at least part of the view is visible; false if the view + * is completely clipped or translated out of the visible area. + * + * @see #getGlobalVisibleRect(Rect, Point) + */ public final boolean getLocalVisibleRect(Rect r) { final Point offset = mAttachInfo != null ? mAttachInfo.mPoint : new Point(); if (getGlobalVisibleRect(r, offset)) { @@ -25606,8 +25663,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * multiple-screen environment, the coordinate space includes only the * screen on which the app is running. * - * <p>After the method returns, the argument array contains the x- and - * y-coordinates of the view relative to the view's left and top edges, + * <p>After the method returns, the argument array contains the x and y + * coordinates of the view relative to the view's left and top edges, * respectively. * * @param outLocation A two-element integer array in which the view @@ -25637,8 +25694,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * restricted to a single screen, the coordinate space includes only the * screen on which the app is running. * - * <p>After the method returns, the argument array contains the x- and - * y-coordinates of the view relative to the view's left and top edges, + * <p>After the method returns, the argument array contains the x and y + * coordinates of the view relative to the view's left and top edges, * respectively. * * @param outLocation A two-element integer array in which the view diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl index 52d54cd1f717..681693b1dbad 100644 --- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl +++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl @@ -284,4 +284,9 @@ interface IVoiceInteractionManagerService { * Stops to listen the status of visible activity. */ void stopListeningVisibleActivityChanged(in IBinder token); + + /** + * Notifies when the session window is shown or hidden. + */ + void setSessionWindowVisible(in IBinder token, boolean visible); } diff --git a/core/java/com/android/internal/app/IVoiceInteractionSessionListener.aidl b/core/java/com/android/internal/app/IVoiceInteractionSessionListener.aidl index bc757e24c852..6e409885fa13 100644 --- a/core/java/com/android/internal/app/IVoiceInteractionSessionListener.aidl +++ b/core/java/com/android/internal/app/IVoiceInteractionSessionListener.aidl @@ -30,6 +30,11 @@ void onVoiceSessionHidden(); /** + * Called when a voice session window is shown/hidden. + */ + void onVoiceSessionWindowVisibilityChanged(boolean visible); + + /** * Called when UI hints were received. */ void onSetUiHints(in Bundle args); diff --git a/core/java/com/android/internal/app/SuggestedLocaleAdapter.java b/core/java/com/android/internal/app/SuggestedLocaleAdapter.java index 18fde4794969..5fe111148c91 100644 --- a/core/java/com/android/internal/app/SuggestedLocaleAdapter.java +++ b/core/java/com/android/internal/app/SuggestedLocaleAdapter.java @@ -27,7 +27,6 @@ import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; -import android.widget.FrameLayout; import android.widget.TextView; import com.android.internal.R; @@ -222,6 +221,7 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable { convertView = mInflater.inflate( R.layout.app_language_picker_current_locale_item, parent, false); title = convertView.findViewById(R.id.language_picker_item); + addStateDescriptionIntoCurrentLocaleItem(convertView); } else { convertView = mInflater.inflate( R.layout.language_picker_item, parent, false); @@ -234,6 +234,7 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable { if (!(convertView instanceof ViewGroup)) { convertView = mInflater.inflate( R.layout.app_language_picker_current_locale_item, parent, false); + addStateDescriptionIntoCurrentLocaleItem(convertView); } updateTextView( convertView, convertView.findViewById(R.id.language_picker_item), position); @@ -369,4 +370,9 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable { : View.TEXT_DIRECTION_LTR); } } + + private void addStateDescriptionIntoCurrentLocaleItem(View root) { + String description = root.getContext().getResources().getString(R.string.checked); + root.setStateDescription(description); + } } diff --git a/core/proto/android/os/appbackgroundrestrictioninfo.proto b/core/proto/android/os/appbackgroundrestrictioninfo.proto index 502fd64f97e4..5bf8ea79a8ea 100644 --- a/core/proto/android/os/appbackgroundrestrictioninfo.proto +++ b/core/proto/android/os/appbackgroundrestrictioninfo.proto @@ -73,12 +73,17 @@ message AppBackgroundRestrictionsInfo { optional FgsTrackerInfo fgs_tracker_info = 5; message BatteryTrackerInfo { - // total battery usage within last 24h (percentage) + // total battery usage within last 24h (1/10000th) optional int32 battery_24h = 1; - // background battery usage (percentage) + // background battery usage (1/10000th) optional int32 battery_usage_background = 2; - // FGS battery usage (percentage) + // FGS battery usage (1/10000th) optional int32 battery_usage_fgs = 3; + // Foreground battery usage (1/10000th) + optional int32 battery_usage_foreground = 4; + // Cached battery usage (1/10000th) + optional int32 battery_usage_cached = 5; + } optional BatteryTrackerInfo battery_tracker_info = 6; @@ -197,5 +202,8 @@ message AppBackgroundRestrictionsInfo { // indicates if the current device is a low ram device. optional bool low_mem_device = 12; + + // indicates previous background restriction level. + optional RestrictionLevel previous_restriction_level = 13; } diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java index b04b82629b92..a76d74edc0f4 100644 --- a/graphics/java/android/graphics/drawable/Icon.java +++ b/graphics/java/android/graphics/drawable/Icon.java @@ -128,6 +128,7 @@ public final class Icon implements Parcelable { // TYPE_RESOURCE: Resources // TYPE_DATA: DataBytes private Object mObj1; + private boolean mCachedAshmem = false; // TYPE_RESOURCE: package name // TYPE_URI: uri string @@ -156,6 +157,8 @@ public final class Icon implements Parcelable { /** * @return The {@link android.graphics.Bitmap} held by this {@link #TYPE_BITMAP} or * {@link #TYPE_ADAPTIVE_BITMAP} Icon. + * + * Note that this will always return an immutable Bitmap. * @hide */ @UnsupportedAppUsage @@ -166,8 +169,20 @@ public final class Icon implements Parcelable { return (Bitmap) mObj1; } + /** + * Sets the Icon's contents to a particular Bitmap. Note that this may make a copy of the Bitmap + * if the supplied Bitmap is mutable. In that case, the value returned by getBitmap() may not + * equal the Bitmap passed to setBitmap(). + * + * @hide + */ private void setBitmap(Bitmap b) { - mObj1 = b; + if (b.isMutable()) { + mObj1 = b.copy(b.getConfig(), false); + } else { + mObj1 = b; + } + mCachedAshmem = false; } /** @@ -488,6 +503,7 @@ public final class Icon implements Parcelable { getBitmap().getAllocationByteCount() >= MIN_ASHMEM_ICON_SIZE) { setBitmap(getBitmap().asShared()); } + mCachedAshmem = true; } /** @@ -913,7 +929,10 @@ public final class Icon implements Parcelable { switch (mType) { case TYPE_BITMAP: case TYPE_ADAPTIVE_BITMAP: - final Bitmap bits = getBitmap(); + if (!mCachedAshmem) { + mObj1 = ((Bitmap) mObj1).asShared(); + mCachedAshmem = true; + } getBitmap().writeToParcel(dest, flags); break; case TYPE_RESOURCE: diff --git a/libs/WindowManager/Shell/res/layout/split_decor.xml b/libs/WindowManager/Shell/res/layout/split_decor.xml index dfb90affe7f6..443ecb2ed3f3 100644 --- a/libs/WindowManager/Shell/res/layout/split_decor.xml +++ b/libs/WindowManager/Shell/res/layout/split_decor.xml @@ -20,8 +20,8 @@ android:layout_width="match_parent"> <ImageView android:id="@+id/split_resizing_icon" - android:layout_height="@*android:dimen/starting_surface_icon_size" - android:layout_width="@*android:dimen/starting_surface_icon_size" + android:layout_height="@dimen/split_icon_size" + android:layout_width="@dimen/split_icon_size" android:layout_gravity="center" android:scaleType="fitCenter" android:padding="0dp" diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml index c21381d1486a..1dac9caba01e 100644 --- a/libs/WindowManager/Shell/res/values/dimen.xml +++ b/libs/WindowManager/Shell/res/values/dimen.xml @@ -87,6 +87,8 @@ <!-- How high we lift the divider when touching --> <dimen name="docked_stack_divider_lift_elevation">4dp</dimen> + <!-- Icon size for split screen --> + <dimen name="split_icon_size">72dp</dimen> <!-- Divider handle size for legacy split screen --> <dimen name="docked_divider_handle_width">16dp</dimen> <dimen name="docked_divider_handle_height">2dp</dimen> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java index 5dc6bd19853a..de30dbbe7e46 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java @@ -73,6 +73,8 @@ public class SplitDecorManager extends WindowlessWindowManager { private Rect mBounds = new Rect(); private ValueAnimator mFadeAnimator; + private int mIconSize; + public SplitDecorManager(Configuration configuration, IconProvider iconProvider, SurfaceSession surfaceSession) { super(configuration, null /* rootSurface */, null /* hostInputToken */); @@ -104,6 +106,7 @@ public class SplitDecorManager extends WindowlessWindowManager { mHostLeash = rootLeash; mViewHost = new SurfaceControlViewHost(context, context.getDisplay(), this); + mIconSize = context.getResources().getDimensionPixelSize(R.dimen.split_icon_size); final FrameLayout rootLayout = (FrameLayout) LayoutInflater.from(context) .inflate(R.layout.split_decor, null); mResizingIconView = rootLayout.findViewById(R.id.split_resizing_icon); @@ -171,14 +174,14 @@ public class SplitDecorManager extends WindowlessWindowManager { WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mViewHost.getView().getLayoutParams(); - lp.width = mIcon.getIntrinsicWidth(); - lp.height = mIcon.getIntrinsicHeight(); + lp.width = mIconSize; + lp.height = mIconSize; mViewHost.relayout(lp); t.setLayer(mIconLeash, Integer.MAX_VALUE); } t.setPosition(mIconLeash, - newBounds.width() / 2 - mIcon.getIntrinsicWidth() / 2, - newBounds.height() / 2 - mIcon.getIntrinsicWidth() / 2); + newBounds.width() / 2 - mIconSize / 2, + newBounds.height() / 2 - mIconSize / 2); boolean show = newBounds.width() > mBounds.width() || newBounds.height() > mBounds.height(); if (show != mShown) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DropZoneView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DropZoneView.java index 0cea36ed48c8..28f59b53b5b6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DropZoneView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DropZoneView.java @@ -111,8 +111,7 @@ public class DropZoneView extends FrameLayout { mColorDrawable = new ColorDrawable(); setBackgroundDrawable(mColorDrawable); - final int iconSize = context.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.starting_surface_icon_size); + final int iconSize = context.getResources().getDimensionPixelSize(R.dimen.split_icon_size); mSplashScreenView = new ImageView(context); mSplashScreenView.setScaleType(ImageView.ScaleType.FIT_CENTER); addView(mSplashScreenView, diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 83b1b52fff3d..c8fff39cc8e5 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -711,4 +711,10 @@ <item>@*android:string/status_bar_alarm_clock</item> <item>@*android:string/status_bar_call_strength</item> </string-array> + + <!-- Packages of SystemUI --> + <string-array name="system_ui_packages" translatable="false"> + <item>com.android.keyguard</item> + <item>com.android.systemui</item> + </string-array> </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java index f925eaa0e40b..eb6705a2e979 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java @@ -15,6 +15,8 @@ */ package com.android.keyguard; +import static com.android.systemui.util.ColorUtilKt.getPrivateAttrColorIfUnset; + import android.animation.AnimatorSet; import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; @@ -152,7 +154,7 @@ class NumPadAnimator { ContextThemeWrapper ctw = new ContextThemeWrapper(context, mStyle); TypedArray a = ctw.obtainStyledAttributes(customAttrs); - mNormalColor = Utils.getPrivateAttrColorIfUnset(ctw, a, 0, 0, + mNormalColor = getPrivateAttrColorIfUnset(ctw, a, 0, 0, com.android.internal.R.attr.colorSurface); mHighlightColor = a.getColor(1, 0); a.recycle(); diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt b/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt index 3641e1d52144..0df2730a48eb 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt @@ -380,7 +380,7 @@ class ScreenDecorHwcLayer(context: Context, displayDecorationSupport: DisplayDec ) { if (hasTopRoundedCorner == hasTop && hasBottomRoundedCorner == hasBottom && - roundedCornerBottomSize == bottomSize && + roundedCornerTopSize == topSize && roundedCornerBottomSize == bottomSize) { return } diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index b98fc03e3acd..8d6509874776 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -348,7 +348,8 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab @Override public void onDisplayChanged(int displayId) { final int newRotation = mContext.getDisplay().getRotation(); - if (mOverlays != null && mRotation != newRotation) { + if ((mOverlays != null || mScreenDecorHwcWindow != null) + && mRotation != newRotation) { // We cannot immediately update the orientation. Otherwise // WindowManager is still deferring layout until it has finished dispatching // the config changes, which may cause divergence between what we draw @@ -362,11 +363,13 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab + mRotation); } - for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) { - if (mOverlays[i] != null) { - final ViewGroup overlayView = mOverlays[i].getRootView(); - overlayView.getViewTreeObserver().addOnPreDrawListener( - new RestartingPreDrawListener(overlayView, i, newRotation)); + if (mOverlays != null) { + for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) { + if (mOverlays[i] != null) { + final ViewGroup overlayView = mOverlays[i].getRootView(); + overlayView.getViewTreeObserver().addOnPreDrawListener( + new RestartingPreDrawListener(overlayView, i, newRotation)); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index 9d5b93c2b329..7c2673c31bf5 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -187,6 +187,14 @@ public class AssistManager { } @Override + public void onVoiceSessionWindowVisibilityChanged(boolean visible) + throws RemoteException { + if (VERBOSE) { + Log.v(TAG, "Window visibility changed: " + visible); + } + } + + @Override public void onSetUiHints(Bundle hints) { if (VERBOSE) { Log.v(TAG, "UI hints received"); diff --git a/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerDecorProviderImpl.kt b/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerDecorProviderImpl.kt index 9dbeb77ebc00..e316722b64ea 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerDecorProviderImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerDecorProviderImpl.kt @@ -105,7 +105,7 @@ private fun Int.toLayoutGravity(@Surface.Rotation rotation: Int): Int = when (ro DisplayCutout.BOUNDS_POSITION_LEFT -> Gravity.BOTTOM DisplayCutout.BOUNDS_POSITION_TOP -> Gravity.LEFT DisplayCutout.BOUNDS_POSITION_RIGHT -> Gravity.TOP - else /* DisplayCutout.BOUNDS_POSITION_BOTTOM */ -> Gravity.LEFT + else /* DisplayCutout.BOUNDS_POSITION_BOTTOM */ -> Gravity.RIGHT } Surface.ROTATION_270 -> when (this) { DisplayCutout.BOUNDS_POSITION_LEFT -> Gravity.TOP diff --git a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java index 3ae11ff28345..9c7411bf3649 100644 --- a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java +++ b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java @@ -54,7 +54,7 @@ public class FragmentHostManager { private final View mRootView; private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges( ActivityInfo.CONFIG_FONT_SCALE | ActivityInfo.CONFIG_LOCALE - | ActivityInfo.CONFIG_LAYOUT_DIRECTION | ActivityInfo.CONFIG_ASSETS_PATHS); + | ActivityInfo.CONFIG_ASSETS_PATHS); private final FragmentService mManager; private final ExtensionFragmentManager mPlugins = new ExtensionFragmentManager(); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 2e1373259975..29e940f24df6 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -849,7 +849,8 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, @Override public void onLaunchAnimationCancelled() { - setOccluded(true /* occluded */, false /* animate */); + Log.d(TAG, "Occlude launch animation cancelled. " + + "Occluded state is now: " + mOccluded); } @NonNull @@ -894,7 +895,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, }; private IRemoteAnimationRunner mOccludeAnimationRunner = - new ActivityLaunchRemoteAnimationRunner(mOccludeAnimationController); + new OccludeActivityLaunchRemoteAnimationRunner(mOccludeAnimationController); /** * Animation controller for activities that unocclude the keyguard. This does not use the @@ -919,13 +920,17 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException { - final RemoteAnimationTarget primary = apps[0]; + if (apps == null || apps.length == 0 || apps[0] == null) { + Log.d(TAG, "No apps provided to unocclude runner; " + + "skipping animation and unoccluding."); - if (primary == null) { finishedCallback.onAnimationFinished(); + setOccluded(false /* isOccluded */, true /* animate */); return; } + final RemoteAnimationTarget primary = apps[0]; + final SyncRtSurfaceTransactionApplier applier = new SyncRtSurfaceTransactionApplier( mKeyguardViewControllerLazy.get().getViewRootImpl().getView()); @@ -965,6 +970,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, @Override public void onAnimationEnd(Animator animation) { try { + setOccluded(false /* isOccluded */, true /* animate */); finishedCallback.onAnimationFinished(); mUnoccludeAnimator = null; } catch (RemoteException e) { @@ -3125,4 +3131,36 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, mRunner.onAnimationStart(transit, apps, wallpapers, nonApps, finishedCallback); } } + + /** + * Subclass of {@link ActivityLaunchRemoteAnimationRunner} that calls {@link #setOccluded} when + * onAnimationStart is called. + */ + private class OccludeActivityLaunchRemoteAnimationRunner + extends ActivityLaunchRemoteAnimationRunner { + + OccludeActivityLaunchRemoteAnimationRunner( + ActivityLaunchAnimator.Controller controller) { + super(controller); + } + + @Override + public void onAnimationStart(int transit, RemoteAnimationTarget[] apps, + RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, + IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException { + super.onAnimationStart(transit, apps, wallpapers, nonApps, finishedCallback); + + // This is the first signal we have from WM that we're going to be occluded. Set our + // internal state to reflect that immediately, vs. waiting for the launch animator to + // begin. Otherwise, calls to setShowingLocked, etc. will not know that we're about to + // be occluded and might re-show the keyguard. + setOccluded(true /* isOccluded */, false /* animate */); + } + + @Override + public void onAnimationCancelled() throws RemoteException { + super.onAnimationCancelled(); + Log.d(TAG, "Occlude launch animation cancelled. Occluded state is now: " + mOccluded); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt index 5a214d1cd5e0..70052fd45abf 100644 --- a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt +++ b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt @@ -21,24 +21,41 @@ import android.animation.ValueAnimator.AnimatorUpdateListener import android.animation.ValueAnimator import android.content.Context import android.content.res.ColorStateList +import android.graphics.drawable.GradientDrawable import com.android.internal.R import com.android.internal.annotations.VisibleForTesting import com.android.settingslib.Utils import com.android.systemui.monet.ColorScheme +import com.android.systemui.util.getColorWithAlpha /** - * ColorTransition is responsible for managing the animation between two specific colors. + * A [ColorTransition] is an object that updates the colors of views each time [updateColorScheme] + * is triggered. + */ +interface ColorTransition { + fun updateColorScheme(scheme: ColorScheme?) +} + +/** A generic implementation of [ColorTransition] so that we can define a factory method. */ +open class GenericColorTransition( + private val applyTheme: (ColorScheme?) -> Unit +) : ColorTransition { + override fun updateColorScheme(scheme: ColorScheme?) = applyTheme(scheme) +} + +/** + * A [ColorTransition] that animates between two specific colors. * It uses a ValueAnimator to execute the animation and interpolate between the source color and * the target color. * * Selection of the target color from the scheme, and application of the interpolated color * are delegated to callbacks. */ -open class ColorTransition( +open class AnimatingColorTransition( private val defaultColor: Int, private val extractColor: (ColorScheme) -> Int, private val applyColor: (Int) -> Unit -) : AnimatorUpdateListener { +) : AnimatorUpdateListener, ColorTransition { private val argbEvaluator = ArgbEvaluator() private val valueAnimator = buildAnimator() @@ -53,7 +70,7 @@ open class ColorTransition( applyColor(currentColor) } - fun updateColorScheme(scheme: ColorScheme?) { + override fun updateColorScheme(scheme: ColorScheme?) { val newTargetColor = if (scheme == null) defaultColor else extractColor(scheme) if (newTargetColor != targetColor) { sourceColor = currentColor @@ -76,7 +93,9 @@ open class ColorTransition( } } -typealias ColorTransitionFactory = (Int, (ColorScheme) -> Int, (Int) -> Unit) -> ColorTransition +typealias AnimatingColorTransitionFactory = + (Int, (ColorScheme) -> Int, (Int) -> Unit) -> AnimatingColorTransition +typealias GenericColorTransitionFactory = ((ColorScheme?) -> Unit) -> GenericColorTransition /** * ColorSchemeTransition constructs a ColorTransition for each color in the scheme @@ -86,27 +105,26 @@ typealias ColorTransitionFactory = (Int, (ColorScheme) -> Int, (Int) -> Unit) -> class ColorSchemeTransition internal constructor( private val context: Context, mediaViewHolder: MediaViewHolder, - colorTransitionFactory: ColorTransitionFactory + animatingColorTransitionFactory: AnimatingColorTransitionFactory, + genericColorTransitionFactory: GenericColorTransitionFactory ) { constructor(context: Context, mediaViewHolder: MediaViewHolder) : - this(context, mediaViewHolder, ::ColorTransition) + this(context, mediaViewHolder, ::AnimatingColorTransition, ::GenericColorTransition) val bgColor = context.getColor(com.android.systemui.R.color.material_dynamic_secondary95) - val surfaceColor = colorTransitionFactory( + val surfaceColor = animatingColorTransitionFactory( bgColor, ::surfaceFromScheme ) { surfaceColor -> val colorList = ColorStateList.valueOf(surfaceColor) mediaViewHolder.player.backgroundTintList = colorList - mediaViewHolder.albumView.foregroundTintList = colorList - mediaViewHolder.albumView.backgroundTintList = colorList mediaViewHolder.seamlessIcon.imageTintList = colorList mediaViewHolder.seamlessText.setTextColor(surfaceColor) mediaViewHolder.gutsViewHolder.setSurfaceColor(surfaceColor) } - val accentPrimary = colorTransitionFactory( + val accentPrimary = animatingColorTransitionFactory( loadDefaultColor(R.attr.textColorPrimary), ::accentPrimaryFromScheme ) { accentPrimary -> @@ -116,7 +134,7 @@ class ColorSchemeTransition internal constructor( mediaViewHolder.gutsViewHolder.setAccentPrimaryColor(accentPrimary) } - val textPrimary = colorTransitionFactory( + val textPrimary = animatingColorTransitionFactory( loadDefaultColor(R.attr.textColorPrimary), ::textPrimaryFromScheme ) { textPrimary -> @@ -132,28 +150,65 @@ class ColorSchemeTransition internal constructor( mediaViewHolder.gutsViewHolder.setTextPrimaryColor(textPrimary) } - val textPrimaryInverse = colorTransitionFactory( + val textPrimaryInverse = animatingColorTransitionFactory( loadDefaultColor(R.attr.textColorPrimaryInverse), ::textPrimaryInverseFromScheme ) { textPrimaryInverse -> mediaViewHolder.actionPlayPause.imageTintList = ColorStateList.valueOf(textPrimaryInverse) } - val textSecondary = colorTransitionFactory( + val textSecondary = animatingColorTransitionFactory( loadDefaultColor(R.attr.textColorSecondary), ::textSecondaryFromScheme ) { textSecondary -> mediaViewHolder.artistText.setTextColor(textSecondary) } - val textTertiary = colorTransitionFactory( + val textTertiary = animatingColorTransitionFactory( loadDefaultColor(R.attr.textColorTertiary), ::textTertiaryFromScheme ) { textTertiary -> mediaViewHolder.seekBar.progressBackgroundTintList = ColorStateList.valueOf(textTertiary) } + // Note: This background gradient currently doesn't animate between colors. + val backgroundGradient = genericColorTransitionFactory { scheme -> + val defaultTintColor = ColorStateList.valueOf(bgColor) + if (scheme == null) { + mediaViewHolder.albumView.foregroundTintList = defaultTintColor + mediaViewHolder.albumView.backgroundTintList = defaultTintColor + return@genericColorTransitionFactory + } + + // If there's no album art, just hide the gradient so we show the solid background. + val showGradient = mediaViewHolder.albumView.drawable != null + val startColor = getColorWithAlpha( + backgroundStartFromScheme(scheme), + alpha = if (showGradient) .25f else 0f + ) + val endColor = getColorWithAlpha( + backgroundEndFromScheme(scheme), + alpha = if (showGradient) .90f else 0f + ) + val gradientColors = intArrayOf(startColor, endColor) + + val foregroundGradient = mediaViewHolder.albumView.foreground.mutate() + if (foregroundGradient is GradientDrawable) { + foregroundGradient.colors = gradientColors + } + val backgroundGradient = mediaViewHolder.albumView.background.mutate() + if (backgroundGradient is GradientDrawable) { + backgroundGradient.colors = gradientColors + } + } + val colorTransitions = arrayOf( - surfaceColor, accentPrimary, textPrimary, - textPrimaryInverse, textSecondary, textTertiary) + surfaceColor, + accentPrimary, + textPrimary, + textPrimaryInverse, + textSecondary, + textTertiary, + backgroundGradient + ) private fun loadDefaultColor(id: Int): Int { return Utils.getColorAttr(context, id).defaultColor diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaColorSchemes.kt b/packages/SystemUI/src/com/android/systemui/media/MediaColorSchemes.kt index 97c6014c91bd..5e767b0458b9 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaColorSchemes.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaColorSchemes.kt @@ -35,3 +35,9 @@ internal fun textSecondaryFromScheme(scheme: ColorScheme) = scheme.neutral2[3] / /** Returns the tertiary text color for media controls based on the scheme. */ internal fun textTertiaryFromScheme(scheme: ColorScheme) = scheme.neutral2[5] // N2-400 + +/** Returns the color for the start of the background gradient based on the scheme. */ +internal fun backgroundStartFromScheme(scheme: ColorScheme) = scheme.accent2[8] // A2-700 + +/** Returns the color for the end of the background gradient based on the scheme. */ +internal fun backgroundEndFromScheme(scheme: ColorScheme) = scheme.accent1[8] // A1-700 diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 34f771ce0431..ce50ddff7b0f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -39,6 +39,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { private static final boolean DEBUG = false; private static final String CURRENT_PAGE = "current_page"; + private static final int NO_PAGE = -1; private static final String TAG = "PagedTileLayout"; private static final int REVEAL_SCROLL_DURATION_MILLIS = 750; @@ -109,13 +110,14 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { } public void saveInstanceState(Bundle outState) { - outState.putInt(CURRENT_PAGE, getCurrentItem()); + int resolvedPage = mPageToRestore != NO_PAGE ? mPageToRestore : getCurrentPageNumber(); + outState.putInt(CURRENT_PAGE, resolvedPage); } public void restoreInstanceState(Bundle savedInstanceState) { // There's only 1 page at this point. We want to restore the correct page once the // pages have been inflated - mPageToRestore = savedInstanceState.getInt(CURRENT_PAGE, -1); + mPageToRestore = savedInstanceState.getInt(CURRENT_PAGE, NO_PAGE); } @Override @@ -151,12 +153,15 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { @Override public void onRtlPropertiesChanged(int layoutDirection) { + // The configuration change will change the flag in the view (that's returned in + // isLayoutRtl). As we detect the change, we use the cached direction to store the page + // before setting it. + final int page = getPageNumberForDirection(mLayoutDirection == LAYOUT_DIRECTION_RTL); super.onRtlPropertiesChanged(layoutDirection); if (mLayoutDirection != layoutDirection) { mLayoutDirection = layoutDirection; setAdapter(mAdapter); - setCurrentItem(0, false); - mPageToRestore = 0; + setCurrentItem(page, false); } } @@ -172,8 +177,12 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { * Obtains the current page number respecting RTL */ private int getCurrentPageNumber() { + return getPageNumberForDirection(isLayoutRtl()); + } + + private int getPageNumberForDirection(boolean isLayoutRTL) { int page = getCurrentItem(); - if (mLayoutDirection == LAYOUT_DIRECTION_RTL) { + if (isLayoutRTL) { page = mPages.size() - 1 - page; } return page; @@ -388,9 +397,9 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { mPageIndicator.setNumPages(mPages.size()); setAdapter(mAdapter); mAdapter.notifyDataSetChanged(); - if (mPageToRestore != -1) { + if (mPageToRestore != NO_PAGE) { setCurrentItem(mPageToRestore, false); - mPageToRestore = -1; + mPageToRestore = NO_PAGE; } } @@ -479,9 +488,27 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { maxHeight = height; } } + if (mPages.get(0).getParent() == null) { + // Measure page 0 so we know how tall it is if it's not attached to the pager. + mPages.get(0).measure(widthMeasureSpec, heightMeasureSpec); + int height = mPages.get(0).getMeasuredHeight(); + if (height > maxHeight) { + maxHeight = height; + } + } setMeasuredDimension(getMeasuredWidth(), maxHeight + getPaddingBottom()); } + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + if (mPages.get(0).getParent() == null) { + // Layout page 0, so we can get the bottom of the tiles. We only do this if the page + // is not attached. + mPages.get(0).layout(l, t, r, b); + } + } + public int getColumnCount() { if (mPages.size() == 0) return 0; return mPages.get(0).mColumns; @@ -625,8 +652,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { if (mPageIndicator == null) return; if (mPageListener != null) { int pageNumber = isLayoutRtl() ? mPages.size() - 1 - position : position; - mPageListener.onPageChanged(isLayoutRtl() ? position == mPages.size() - 1 - : position == 0, pageNumber); + mPageListener.onPageChanged(pageNumber == 0, pageNumber); } } @@ -645,8 +671,8 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { mPageIndicator.setLocation(mPageIndicatorPosition); if (mPageListener != null) { int pageNumber = isLayoutRtl() ? mPages.size() - 1 - position : position; - mPageListener.onPageChanged(positionOffsetPixels == 0 && - (isLayoutRtl() ? position == mPages.size() - 1 : position == 0), + mPageListener.onPageChanged( + positionOffsetPixels == 0 && pageNumber == 0, // Send only valid page number on integer pages positionOffsetPixels == 0 ? pageNumber : PageListener.INVALID_PAGE ); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java index 8ca095d9a609..6eb54f799a24 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java @@ -24,7 +24,6 @@ import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.net.Network; import android.net.NetworkCapabilities; -import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Handler; import android.telephony.ServiceState; @@ -90,8 +89,6 @@ public class InternetDialog extends SystemUIDialog implements @VisibleForTesting protected InternetAdapter mAdapter; @VisibleForTesting - protected WifiManager mWifiManager; - @VisibleForTesting protected View mDialogView; @VisibleForTesting protected boolean mCanConfigWifi; @@ -179,7 +176,6 @@ public class InternetDialog extends SystemUIDialog implements mSubscriptionManager = mInternetDialogController.getSubscriptionManager(); mDefaultDataSubId = mInternetDialogController.getDefaultDataSubscriptionId(); mTelephonyManager = mInternetDialogController.getTelephonyManager(); - mWifiManager = mInternetDialogController.getWifiManager(); mCanConfigMobileData = canConfigMobileData; mCanConfigWifi = canConfigWifi; mCanChangeWifiState = WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(context); @@ -332,7 +328,7 @@ public class InternetDialog extends SystemUIDialog implements showProgressBar(); final boolean isDeviceLocked = mInternetDialogController.isDeviceLocked(); - final boolean isWifiEnabled = mWifiManager != null && mWifiManager.isWifiEnabled(); + final boolean isWifiEnabled = mInternetDialogController.isWifiEnabled(); final boolean isWifiScanEnabled = mInternetDialogController.isWifiScanEnabled(); updateWifiToggle(isWifiEnabled, isDeviceLocked); updateConnectedWifi(isWifiEnabled, isDeviceLocked); @@ -362,9 +358,8 @@ public class InternetDialog extends SystemUIDialog implements mSeeAllLayout.setOnClickListener(this::onClickSeeMoreButton); mWiFiToggle.setOnCheckedChangeListener( (buttonView, isChecked) -> { - if (mWifiManager == null) return; - buttonView.setChecked(isChecked); - mWifiManager.setWifiEnabled(isChecked); + if (mInternetDialogController.isWifiEnabled() == isChecked) return; + mInternetDialogController.setWifiEnabled(isChecked); }); mDoneButton.setOnClickListener(v -> dismiss()); mAirplaneModeButton.setOnClickListener(v -> { @@ -388,7 +383,7 @@ public class InternetDialog extends SystemUIDialog implements Log.d(TAG, "setMobileDataLayout, isCarrierNetworkActive = " + isCarrierNetworkActive); } - boolean isWifiEnabled = mWifiManager != null && mWifiManager.isWifiEnabled(); + boolean isWifiEnabled = mInternetDialogController.isWifiEnabled(); if (!mInternetDialogController.hasActiveSubId() && (!isWifiEnabled || !isCarrierNetworkActive)) { mMobileNetworkLayout.setVisibility(View.GONE); @@ -444,7 +439,9 @@ public class InternetDialog extends SystemUIDialog implements @MainThread private void updateWifiToggle(boolean isWifiEnabled, boolean isDeviceLocked) { - mWiFiToggle.setChecked(isWifiEnabled); + if (mWiFiToggle.isChecked() != isWifiEnabled) { + mWiFiToggle.setChecked(isWifiEnabled); + } if (isDeviceLocked) { mWifiToggleTitleText.setTextAppearance((mConnectedWifiEntry != null) ? R.style.TextAppearance_InternetDialog_Active @@ -572,7 +569,7 @@ public class InternetDialog extends SystemUIDialog implements } protected void showProgressBar() { - if (mWifiManager == null || !mWifiManager.isWifiEnabled() + if (!mInternetDialogController.isWifiEnabled() || mInternetDialogController.isDeviceLocked()) { setProgressBarVisible(false); return; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java index d97ce7757d8c..90a3d4586fd3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java @@ -22,6 +22,7 @@ import static com.android.wifitrackerlib.WifiEntry.CONNECTED_STATE_CONNECTED; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.annotation.AnyThread; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -157,6 +158,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi private LocationController mLocationController; private DialogLaunchAnimator mDialogLaunchAnimator; private boolean mHasWifiEntries; + private WifiStateWorker mWifiStateWorker; @VisibleForTesting static final float TOAST_PARAMS_HORIZONTAL_WEIGHT = 1.0f; @@ -210,7 +212,9 @@ public class InternetDialogController implements AccessPointController.AccessPoi @Background Handler workerHandler, CarrierConfigTracker carrierConfigTracker, LocationController locationController, - DialogLaunchAnimator dialogLaunchAnimator) { + DialogLaunchAnimator dialogLaunchAnimator, + WifiStateWorker wifiStateWorker + ) { if (DEBUG) { Log.d(TAG, "Init InternetDialogController"); } @@ -241,6 +245,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi mLocationController = locationController; mDialogLaunchAnimator = dialogLaunchAnimator; mConnectedWifiInternetMonitor = new ConnectedWifiInternetMonitor(); + mWifiStateWorker = wifiStateWorker; } void onStart(@NonNull InternetDialogCallback callback, boolean canConfigWifi) { @@ -323,7 +328,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi @Nullable CharSequence getSubtitleText(boolean isProgressBarVisible) { - if (mCanConfigWifi && !mWifiManager.isWifiEnabled()) { + if (mCanConfigWifi && !isWifiEnabled()) { // When Wi-Fi is disabled. // Sub-Title: Wi-Fi is off if (DEBUG) { @@ -648,6 +653,27 @@ public class InternetDialogController implements AccessPointController.AccessPoi startActivity(intent, view); } + /** + * Enable or disable Wi-Fi. + * + * @param enabled {@code true} to enable, {@code false} to disable. + */ + @AnyThread + public void setWifiEnabled(boolean enabled) { + mWifiStateWorker.setWifiEnabled(enabled); + } + + /** + * Return whether Wi-Fi is enabled or disabled. + * + * @return {@code true} if Wi-Fi is enabled or enabling + * @see WifiManager#getWifiState() + */ + @AnyThread + public boolean isWifiEnabled() { + return mWifiStateWorker.isWifiEnabled(); + } + void connectCarrierNetwork() { final MergedCarrierEntry mergedCarrierEntry = mAccessPointController.getMergedCarrierEntry(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/WifiStateWorker.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/WifiStateWorker.java new file mode 100644 index 000000000000..a7ea50e5e6dd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/WifiStateWorker.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.tiles.dialog; + +import static android.net.wifi.WifiManager.EXTRA_WIFI_STATE; +import static android.net.wifi.WifiManager.WIFI_STATE_CHANGED_ACTION; +import static android.net.wifi.WifiManager.WIFI_STATE_DISABLED; +import static android.net.wifi.WifiManager.WIFI_STATE_DISABLING; +import static android.net.wifi.WifiManager.WIFI_STATE_ENABLED; +import static android.net.wifi.WifiManager.WIFI_STATE_ENABLING; +import static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.wifi.WifiManager; +import android.util.Log; + +import androidx.annotation.AnyThread; +import androidx.annotation.Nullable; + +import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.util.concurrency.DelayableExecutor; + +import javax.inject.Inject; + +/** + * Worker for the Wi-Fi enabled state cache. + */ +@SysUISingleton +public class WifiStateWorker extends BroadcastReceiver { + + private static final String TAG = "WifiStateWorker"; + + private DelayableExecutor mBackgroundExecutor; + private WifiManager mWifiManager; + private int mWifiState = WIFI_STATE_DISABLED; + + @Inject + public WifiStateWorker( + BroadcastDispatcher broadcastDispatcher, + @Background DelayableExecutor backgroundExecutor, + @Nullable WifiManager wifiManager) { + mWifiManager = wifiManager; + mBackgroundExecutor = backgroundExecutor; + + broadcastDispatcher.registerReceiver(this, new IntentFilter(WIFI_STATE_CHANGED_ACTION)); + mBackgroundExecutor.execute(() -> { + if (mWifiManager == null) return; + + mWifiState = mWifiManager.getWifiState(); + Log.i(TAG, "WifiManager.getWifiState():" + mWifiState); + }); + } + + /** + * Enable or disable Wi-Fi. + * + * @param enabled {@code true} to enable, {@code false} to disable. + */ + @AnyThread + public void setWifiEnabled(boolean enabled) { + mBackgroundExecutor.execute(() -> { + if (mWifiManager == null) return; + + mWifiState = (enabled) ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING; + if (!mWifiManager.setWifiEnabled(enabled)) { + Log.e(TAG, "Failed to WifiManager.setWifiEnabled(" + enabled + ");"); + } + }); + } + + /** + * Gets the Wi-Fi enabled state. + * + * @return One of {@link WifiManager#WIFI_STATE_DISABLED}, + * {@link WifiManager#WIFI_STATE_DISABLING}, {@link WifiManager#WIFI_STATE_ENABLED}, + * {@link WifiManager#WIFI_STATE_ENABLING} + */ + @AnyThread + public int getWifiState() { + return mWifiState; + } + + /** + * Return whether Wi-Fi is enabled or disabled. + * + * @return {@code true} if Wi-Fi is enabled or enabling + * @see WifiManager#getWifiState() + */ + @AnyThread + public boolean isWifiEnabled() { + return (mWifiState == WIFI_STATE_ENABLED || mWifiState == WIFI_STATE_ENABLING); + } + + @Override + public void onReceive(Context context, Intent intent) { + if (intent == null) return; + + if (WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) { + final int wifiState = intent.getIntExtra(EXTRA_WIFI_STATE, WIFI_STATE_DISABLED); + if (wifiState == WIFI_STATE_UNKNOWN) return; + + mWifiState = wifiState; + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt index 270bdc785178..0a616c095551 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt @@ -17,6 +17,7 @@ import android.util.MathUtils.lerp import android.view.View import com.android.systemui.animation.Interpolators import com.android.systemui.statusbar.LightRevealEffect.Companion.getPercentPastThreshold +import com.android.systemui.util.getColorWithAlpha import java.util.function.Consumer /** @@ -367,7 +368,7 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, } if (startColorAlpha > 0f) { - canvas.drawColor(updateColorAlpha(revealGradientEndColor, startColorAlpha)) + canvas.drawColor(getColorWithAlpha(revealGradientEndColor, startColorAlpha)) } with(shaderGradientMatrix) { @@ -383,15 +384,7 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, private fun setPaintColorFilter() { gradientPaint.colorFilter = PorterDuffColorFilter( - updateColorAlpha(revealGradientEndColor, revealGradientEndColorAlpha), + getColorWithAlpha(revealGradientEndColor, revealGradientEndColorAlpha), PorterDuff.Mode.MULTIPLY) } - - private fun updateColorAlpha(color: Int, alpha: Float): Int = - Color.argb( - (alpha * 255).toInt(), - Color.red(color), - Color.green(color), - Color.blue(color) - ) }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index bf27550b331b..36cd173d2d1c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -415,6 +415,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable private boolean mForwardScrollable; private boolean mBackwardScrollable; private NotificationShelf mShelf; + /** + * Limits the number of visible notifications. The remaining are collapsed in the notification + * shelf. -1 when there is no limit. + */ private int mMaxDisplayedNotifications = -1; private float mKeyguardBottomPadding = -1; @VisibleForTesting int mStatusBarHeight; @@ -1323,7 +1327,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } private float updateStackEndHeight(float height, float bottomMargin, float topPadding) { - final float stackEndHeight = Math.max(0f, height - bottomMargin - topPadding); + final float stackEndHeight; + if (mMaxDisplayedNotifications != -1) { + // The stack intrinsic height already contains the correct value when there is a limit + // in the max number of notifications (e.g. as in keyguard). + stackEndHeight = mIntrinsicContentHeight; + } else { + stackEndHeight = Math.max(0f, height - bottomMargin - topPadding); + } mAmbientState.setStackEndHeight(stackEndHeight); return stackEndHeight; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index ae1fd2b180e5..c2750c2d2a6f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -1207,7 +1207,7 @@ public class NotificationStackScrollLayoutController { */ public void updateShowEmptyShadeView() { Trace.beginSection("NSSLC.updateShowEmptyShadeView"); - mShowEmptyShadeView = mBarState != KEYGUARD + mShowEmptyShadeView = mStatusBarStateController.getCurrentOrUpcomingState() != KEYGUARD && !mView.isQsFullScreen() && getVisibleNotificationCount() == 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java index b14e92bf39cf..83017c41629c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -1748,6 +1748,23 @@ public class CentralSurfaces extends CoreStartable implements } @Override + public void onLaunchAnimationStart(boolean isExpandingFullyAbove) { + super.onLaunchAnimationStart(isExpandingFullyAbove); + + // Double check that the keyguard is still showing and not going away, but if so + // set the keyguard occluded. Typically, WM will let KeyguardViewMediator know + // directly, but we're overriding that to play the custom launch animation, so + // we need to take care of that here. The unocclude animation is not overridden, + // so WM will call KeyguardViewMediator's unocclude animation runner when the + // activity is exited. + if (mKeyguardStateController.isShowing() + && !mKeyguardStateController.isKeyguardGoingAway()) { + mKeyguardViewMediator.setOccluded(true /* isOccluded */, + true /* animate */); + } + } + + @Override public void onLaunchAnimationEnd(boolean isExpandingFullyAbove) { // Set mIsLaunchingActivityOverLockscreen to false before actually finishing the // animation so that we can assume that mIsLaunchingActivityOverLockscreen @@ -4514,9 +4531,12 @@ public class CentralSurfaces extends CoreStartable implements * @return UserHandle */ private UserHandle getActivityUserHandle(Intent intent) { - if (intent.getComponent() != null - && mContext.getPackageName().equals(intent.getComponent().getPackageName())) { - return new UserHandle(UserHandle.myUserId()); + String[] packages = mContext.getResources().getStringArray(R.array.system_ui_packages); + for (String pkg : packages) { + if (intent.getComponent() == null) break; + if (pkg.equals(intent.getComponent().getPackageName())) { + return new UserHandle(UserHandle.myUserId()); + } } return UserHandle.CURRENT; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index adf70a255b4f..0b46f07f8e8b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1233,6 +1233,11 @@ public class NotificationPanelViewController extends PanelViewController { mKeyguardBottomArea.initQRCodeScanner(mQRCodeScannerController); } + @VisibleForTesting + void setMaxDisplayedNotifications(int maxAllowed) { + mMaxAllowedKeyguardNotifications = maxAllowed; + } + private void updateMaxDisplayedNotifications(boolean recompute) { if (recompute) { mMaxAllowedKeyguardNotifications = Math.max(computeMaxKeyguardNotifications(), 1); @@ -1463,7 +1468,11 @@ public class NotificationPanelViewController extends PanelViewController { /** * @return the maximum keyguard notifications that can fit on the screen */ - private int computeMaxKeyguardNotifications() { + @VisibleForTesting + int computeMaxKeyguardNotifications() { + if (mAmbientState.getFractionToShade() > 0 || mAmbientState.getDozeAmount() > 0) { + return mMaxAllowedKeyguardNotifications; + } float topPadding = mNotificationStackScrollLayoutController.getTopPadding(); float shelfIntrinsicHeight = mNotificationShelfController.getVisibility() == View.GONE diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 052a4f7c5f7c..639be24ac46e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -390,6 +390,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb && !mBouncer.isShowing() && !mBouncer.isAnimatingAway()) { mBouncer.show(false /* resetSecuritySelection */, false /* scrimmed */); } + } else if (!mShowing && mBouncer.inTransit()) { + // Keyguard is not visible anymore, but expansion animation was still running. + // We need to keep propagating the expansion state to the bouncer, otherwise it will be + // stuck in transit. + mBouncer.setExpansion(fraction); } else if (mPulsing && fraction == KeyguardBouncer.EXPANSION_VISIBLE) { // Panel expanded while pulsing but didn't translate the bouncer (because we are // unlocked.) Let's simply wake-up to dismiss the lock screen. diff --git a/packages/SystemUI/src/com/android/systemui/util/ColorUtil.kt b/packages/SystemUI/src/com/android/systemui/util/ColorUtil.kt new file mode 100644 index 000000000000..27a53bf2ceda --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/util/ColorUtil.kt @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.util + +import android.content.res.TypedArray +import android.graphics.Color +import android.view.ContextThemeWrapper + +/** Returns an ARGB color version of [color] at the given [alpha]. */ +fun getColorWithAlpha(color: Int, alpha: Float): Int = + Color.argb( + (alpha * 255).toInt(), + Color.red(color), + Color.green(color), + Color.blue(color) + ) + + +/** + * Returns the color provided at the specified {@param attrIndex} in {@param a} if it exists, + * otherwise, returns the color from the private attribute {@param privAttrId}. + */ +fun getPrivateAttrColorIfUnset( + ctw: ContextThemeWrapper, attrArray: TypedArray, + attrIndex: Int, defColor: Int, privAttrId: Int +): Int { + // If the index is specified, use that value + var a = attrArray + if (a.hasValue(attrIndex)) { + return a.getColor(attrIndex, defColor) + } + + // Otherwise fallback to the value of the private attribute + val customAttrs = intArrayOf(privAttrId) + a = ctw.obtainStyledAttributes(customAttrs) + val color = a.getColor(0, defColor) + a.recycle() + return color +} diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java index 8e5e1d2e1b87..5b5dca30620a 100644 --- a/packages/SystemUI/src/com/android/systemui/util/Utils.java +++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java @@ -105,25 +105,6 @@ public class Utils { } /** - * Returns the color provided at the specified {@param attrIndex} in {@param a} if it exists, - * otherwise, returns the color from the private attribute {@param privAttrId}. - */ - public static int getPrivateAttrColorIfUnset(ContextThemeWrapper ctw, TypedArray a, - int attrIndex, int defColor, int privAttrId) { - // If the index is specified, use that value - if (a.hasValue(attrIndex)) { - return a.getColor(attrIndex, defColor); - } - - // Otherwise fallback to the value of the private attribute - int[] customAttrs = { privAttrId }; - a = ctw.obtainStyledAttributes(customAttrs); - int color = a.getColor(0, defColor); - a.recycle(); - return color; - } - - /** * Gets the {@link R.dimen#status_bar_header_height_keyguard}. */ public static int getStatusBarHeaderHeightKeyguard(Context context) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt index 8f967ab5294f..65d501442d87 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt @@ -19,9 +19,9 @@ package com.android.systemui.media import org.mockito.Mockito.`when` as whenever import android.animation.ValueAnimator import android.graphics.Color -import android.test.suitebuilder.annotation.SmallTest import android.testing.AndroidTestingRunner import android.testing.TestableLooper +import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.monet.ColorScheme import junit.framework.Assert.assertEquals @@ -46,28 +46,35 @@ class ColorSchemeTransitionTest : SysuiTestCase() { private interface ExtractCB : (ColorScheme) -> Int private interface ApplyCB : (Int) -> Unit - private lateinit var colorTransition: ColorTransition + private lateinit var colorTransition: AnimatingColorTransition private lateinit var colorSchemeTransition: ColorSchemeTransition - @Mock private lateinit var mockTransition: ColorTransition + @Mock private lateinit var mockAnimatingTransition: AnimatingColorTransition + @Mock private lateinit var mockGenericTransition: GenericColorTransition @Mock private lateinit var valueAnimator: ValueAnimator @Mock private lateinit var colorScheme: ColorScheme @Mock private lateinit var extractColor: ExtractCB @Mock private lateinit var applyColor: ApplyCB - private lateinit var transitionFactory: ColorTransitionFactory + private lateinit var animatingColorTransitionFactory: AnimatingColorTransitionFactory + private lateinit var genericColorTransitionFactory: GenericColorTransitionFactory @Mock private lateinit var mediaViewHolder: MediaViewHolder @JvmField @Rule val mockitoRule = MockitoJUnit.rule() @Before fun setUp() { - transitionFactory = { default, extractColor, applyColor -> mockTransition } + animatingColorTransitionFactory = { _, _, _ -> mockAnimatingTransition } + genericColorTransitionFactory = { _ -> mockGenericTransition } whenever(extractColor.invoke(colorScheme)).thenReturn(TARGET_COLOR) - colorSchemeTransition = ColorSchemeTransition(context, mediaViewHolder, transitionFactory) + colorSchemeTransition = ColorSchemeTransition( + context, mediaViewHolder, animatingColorTransitionFactory, genericColorTransitionFactory + ) - colorTransition = object : ColorTransition(DEFAULT_COLOR, extractColor, applyColor) { + colorTransition = object : AnimatingColorTransition( + DEFAULT_COLOR, extractColor, applyColor + ) { override fun buildAnimator(): ValueAnimator { return valueAnimator } @@ -142,6 +149,7 @@ class ColorSchemeTransitionTest : SysuiTestCase() { @Test fun testColorSchemeTransition_update() { colorSchemeTransition.updateColorScheme(colorScheme) - verify(mockTransition, times(6)).updateColorScheme(colorScheme) + verify(mockAnimatingTransition, times(6)).updateColorScheme(colorScheme) + verify(mockGenericTransition).updateColorScheme(colorScheme) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java index 633a9c3a03d8..4a8cb0b76dc4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java @@ -138,6 +138,8 @@ public class InternetDialogControllerTest extends SysuiTestCase { private DialogLaunchAnimator mDialogLaunchAnimator; @Mock private View mDialogLaunchView; + @Mock + private WifiStateWorker mWifiStateWorker; private TestableResources mTestableResources; private InternetDialogController mInternetDialogController; @@ -166,6 +168,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { when(mSystemUIToast.getView()).thenReturn(mToastView); when(mSystemUIToast.getGravity()).thenReturn(GRAVITY_FLAGS); when(mSystemUIToast.getInAnimation()).thenReturn(mAnimator); + when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); mInternetDialogController = new InternetDialogController(mContext, mock(UiEventLogger.class), mock(ActivityStarter.class), mAccessPointController, @@ -173,7 +176,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { mock(ConnectivityManager.class), mHandler, mExecutor, mBroadcastDispatcher, mock(KeyguardUpdateMonitor.class), mGlobalSettings, mKeyguardStateController, mWindowManager, mToastFactory, mWorkerHandler, mCarrierConfigTracker, - mLocationController, mDialogLaunchAnimator); + mLocationController, mDialogLaunchAnimator, mWifiStateWorker); mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, mInternetDialogController.mOnSubscriptionsChangedListener); mInternetDialogController.onStart(mInternetDialogCallback, true); @@ -239,7 +242,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getSubtitleText_withApmOnAndWifiOff_returnWifiIsOff() { fakeAirplaneModeEnabled(true); - when(mWifiManager.isWifiEnabled()).thenReturn(false); + when(mWifiStateWorker.isWifiEnabled()).thenReturn(false); assertThat(mInternetDialogController.getSubtitleText(false)) .isEqualTo(getResourcesString("wifi_is_off")); @@ -254,7 +257,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getSubtitleText_withWifiOff_returnWifiIsOff() { fakeAirplaneModeEnabled(false); - when(mWifiManager.isWifiEnabled()).thenReturn(false); + when(mWifiStateWorker.isWifiEnabled()).thenReturn(false); assertThat(mInternetDialogController.getSubtitleText(false)) .isEqualTo(getResourcesString("wifi_is_off")); @@ -269,7 +272,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getSubtitleText_withNoWifiEntry_returnSearchWifi() { fakeAirplaneModeEnabled(false); - when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); mInternetDialogController.onAccessPointsChanged(null /* accessPoints */); assertThat(mInternetDialogController.getSubtitleText(true)) @@ -286,7 +289,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { public void getSubtitleText_withWifiEntry_returnTapToConnect() { // The preconditions WiFi Entries is already in setUp() fakeAirplaneModeEnabled(false); - when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); assertThat(mInternetDialogController.getSubtitleText(false)) .isEqualTo(getResourcesString("tap_a_network_to_connect")); @@ -301,7 +304,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getSubtitleText_deviceLockedWithWifiOn_returnUnlockToViewNetworks() { fakeAirplaneModeEnabled(false); - when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); when(mKeyguardStateController.isUnlocked()).thenReturn(false); assertTrue(TextUtils.equals(mInternetDialogController.getSubtitleText(false), @@ -311,7 +314,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getSubtitleText_withNoService_returnNoNetworksAvailable() { fakeAirplaneModeEnabled(false); - when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); mInternetDialogController.onAccessPointsChanged(null /* accessPoints */); doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mServiceState).getState(); @@ -325,7 +328,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getSubtitleText_withMobileDataDisabled_returnNoOtherAvailable() { fakeAirplaneModeEnabled(false); - when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); mInternetDialogController.onAccessPointsChanged(null /* accessPoints */); doReturn(ServiceState.STATE_IN_SERVICE).when(mServiceState).getState(); @@ -346,7 +349,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getSubtitleText_withCarrierNetworkActiveOnly_returnNoOtherAvailable() { fakeAirplaneModeEnabled(false); - when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); mInternetDialogController.onAccessPointsChanged(null /* accessPoints */); when(mMergedCarrierEntry.isDefaultNetwork()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java index 616f89455c74..d09a5a11040f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java @@ -14,7 +14,6 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.net.wifi.WifiManager; import android.os.Handler; import android.telephony.TelephonyManager; import android.testing.AndroidTestingRunner; @@ -64,8 +63,6 @@ public class InternetDialogTest extends SysuiTestCase { @Mock private TelephonyManager mTelephonyManager; @Mock - private WifiManager mWifiManager; - @Mock private WifiEntry mInternetWifiEntry; @Mock private List<WifiEntry> mWifiEntries; @@ -97,7 +94,6 @@ public class InternetDialogTest extends SysuiTestCase { public void setUp() { MockitoAnnotations.initMocks(this); doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(anyInt()); - when(mWifiManager.isWifiEnabled()).thenReturn(true); when(mInternetWifiEntry.getTitle()).thenReturn(WIFI_TITLE); when(mInternetWifiEntry.getSummary(false)).thenReturn(WIFI_SUMMARY); when(mInternetWifiEntry.isDefaultNetwork()).thenReturn(true); @@ -107,7 +103,7 @@ public class InternetDialogTest extends SysuiTestCase { when(mInternetDialogController.getMobileNetworkTitle()).thenReturn(MOBILE_NETWORK_TITLE); when(mInternetDialogController.getMobileNetworkSummary()) .thenReturn(MOBILE_NETWORK_SUMMARY); - when(mInternetDialogController.getWifiManager()).thenReturn(mWifiManager); + when(mInternetDialogController.isWifiEnabled()).thenReturn(true); mMockitoSession = ExtendedMockito.mockitoSession() .spyStatic(WifiEnterpriseRestrictionUtils.class) @@ -232,7 +228,7 @@ public class InternetDialogTest extends SysuiTestCase { // Carrier network should be gone if airplane mode ON and Wi-Fi is off. when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - when(mWifiManager.isWifiEnabled()).thenReturn(false); + when(mInternetDialogController.isWifiEnabled()).thenReturn(false); mInternetDialog.updateDialog(true); @@ -241,7 +237,7 @@ public class InternetDialogTest extends SysuiTestCase { // Carrier network should be visible if airplane mode ON and Wi-Fi is ON. when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true); when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); - when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mInternetDialogController.isWifiEnabled()).thenReturn(true); mInternetDialog.updateDialog(true); @@ -468,7 +464,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test public void updateDialog_wifiOffAndWifiScanOff_hideWifiScanNotify() { - when(mWifiManager.isWifiEnabled()).thenReturn(false); + when(mInternetDialogController.isWifiEnabled()).thenReturn(false); when(mInternetDialogController.isWifiScanEnabled()).thenReturn(false); mInternetDialog.updateDialog(false); @@ -478,7 +474,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test public void updateDialog_wifiOffAndWifiScanOnAndDeviceLocked_hideWifiScanNotify() { - when(mWifiManager.isWifiEnabled()).thenReturn(false); + when(mInternetDialogController.isWifiEnabled()).thenReturn(false); when(mInternetDialogController.isWifiScanEnabled()).thenReturn(true); when(mInternetDialogController.isDeviceLocked()).thenReturn(true); @@ -489,7 +485,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test public void updateDialog_wifiOffAndWifiScanOnAndDeviceUnlocked_showWifiScanNotify() { - when(mWifiManager.isWifiEnabled()).thenReturn(false); + when(mInternetDialogController.isWifiEnabled()).thenReturn(false); when(mInternetDialogController.isWifiScanEnabled()).thenReturn(true); when(mInternetDialogController.isDeviceLocked()).thenReturn(false); @@ -502,6 +498,26 @@ public class InternetDialogTest extends SysuiTestCase { } @Test + public void updateDialog_wifiIsDisabled_uncheckWifiSwitch() { + when(mInternetDialogController.isWifiEnabled()).thenReturn(false); + mWifiToggleSwitch.setChecked(true); + + mInternetDialog.updateDialog(false); + + assertThat(mWifiToggleSwitch.isChecked()).isFalse(); + } + + @Test + public void updateDialog_wifiIsEnabled_checkWifiSwitch() { + when(mInternetDialogController.isWifiEnabled()).thenReturn(true); + mWifiToggleSwitch.setChecked(false); + + mInternetDialog.updateDialog(false); + + assertThat(mWifiToggleSwitch.isChecked()).isTrue(); + } + + @Test public void onClickSeeMoreButton_clickSeeAll_verifyLaunchNetworkSetting() { mSeeAll.performClick(); @@ -512,7 +528,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test public void showProgressBar_wifiDisabled_hideProgressBar() { Mockito.reset(mHandler); - when(mWifiManager.isWifiEnabled()).thenReturn(false); + when(mInternetDialogController.isWifiEnabled()).thenReturn(false); mInternetDialog.showProgressBar(); @@ -534,7 +550,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test public void showProgressBar_wifiEnabledWithWifiEntry_showProgressBarThenHide() { Mockito.reset(mHandler); - when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mInternetDialogController.isWifiEnabled()).thenReturn(true); mInternetDialog.showProgressBar(); @@ -553,7 +569,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test public void showProgressBar_wifiEnabledWithoutWifiEntries_showProgressBarThenHideSearch() { Mockito.reset(mHandler); - when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mInternetDialogController.isWifiEnabled()).thenReturn(true); mInternetDialog.mConnectedWifiEntry = null; mInternetDialog.mWifiEntriesCount = 0; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/WifiStateWorkerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/WifiStateWorkerTest.java new file mode 100644 index 000000000000..5d7ba7bc673d --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/WifiStateWorkerTest.java @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.tiles.dialog; + +import static android.net.wifi.WifiManager.EXTRA_WIFI_STATE; +import static android.net.wifi.WifiManager.WIFI_STATE_CHANGED_ACTION; +import static android.net.wifi.WifiManager.WIFI_STATE_DISABLED; +import static android.net.wifi.WifiManager.WIFI_STATE_DISABLING; +import static android.net.wifi.WifiManager.WIFI_STATE_ENABLED; +import static android.net.wifi.WifiManager.WIFI_STATE_ENABLING; +import static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Intent; +import android.net.wifi.WifiManager; +import android.testing.AndroidTestingRunner; + +import androidx.test.filters.SmallTest; + +import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.time.FakeSystemClock; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +@RunWith(AndroidTestingRunner.class) +@SmallTest +public class WifiStateWorkerTest extends SysuiTestCase { + + @Rule + public MockitoRule mRule = MockitoJUnit.rule(); + @Mock + private BroadcastDispatcher mBroadcastDispatcher; + @Mock + private WifiManager mWifiManager; + @Mock + private Intent mIntent; + + private WifiStateWorker mWifiStateWorker; + private FakeExecutor mBackgroundExecutor = new FakeExecutor(new FakeSystemClock()); + + @Before + public void setup() { + when(mWifiManager.setWifiEnabled(anyBoolean())).thenReturn(true); + when(mWifiManager.getWifiState()).thenReturn(WIFI_STATE_ENABLED); + when(mIntent.getAction()).thenReturn(WIFI_STATE_CHANGED_ACTION); + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_ENABLED); + + mWifiStateWorker = new WifiStateWorker(mBroadcastDispatcher, mBackgroundExecutor, + mWifiManager); + mBackgroundExecutor.runAllReady(); + } + + @Test + public void constructor_shouldGetWifiState() { + verify(mWifiManager).getWifiState(); + } + + @Test + public void setWifiEnabled_wifiManagerIsNull_shouldNotSetWifiEnabled() { + mWifiStateWorker = new WifiStateWorker(mBroadcastDispatcher, mBackgroundExecutor, + null /* wifiManager */); + + mWifiStateWorker.setWifiEnabled(true); + mBackgroundExecutor.runAllReady(); + + verify(mWifiManager, never()).setWifiEnabled(anyBoolean()); + } + + @Test + public void setWifiEnabled_enabledIsTrue_shouldSetWifiEnabled() { + mWifiStateWorker.setWifiEnabled(true); + mBackgroundExecutor.runAllReady(); + + verify(mWifiManager).setWifiEnabled(true); + } + + @Test + public void setWifiEnabled_enabledIsFalse_shouldSetWifiDisabled() { + mWifiStateWorker.setWifiEnabled(false); + mBackgroundExecutor.runAllReady(); + + verify(mWifiManager).setWifiEnabled(false); + } + + @Test + public void getWifiState_receiveWifiStateDisabling_getWifiStateDisabling() { + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_DISABLING); + mWifiStateWorker.onReceive(mContext, mIntent); + + assertThat(mWifiStateWorker.getWifiState()).isEqualTo(WIFI_STATE_DISABLING); + } + + @Test + public void getWifiState_receiveWifiStateDisabled_getWifiStateDisabled() { + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_DISABLED); + mWifiStateWorker.onReceive(mContext, mIntent); + + assertThat(mWifiStateWorker.getWifiState()).isEqualTo(WIFI_STATE_DISABLED); + } + + @Test + public void getWifiState_receiveWifiStateEnabling_getWifiStateEnabling() { + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_ENABLING); + mWifiStateWorker.onReceive(mContext, mIntent); + + assertThat(mWifiStateWorker.getWifiState()).isEqualTo(WIFI_STATE_ENABLING); + } + + @Test + public void getWifiState_receiveWifiStateEnabled_getWifiStateEnabled() { + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_ENABLED); + mWifiStateWorker.onReceive(mContext, mIntent); + + assertThat(mWifiStateWorker.getWifiState()).isEqualTo(WIFI_STATE_ENABLED); + } + + @Test + public void getWifiState_receiveWifiStateUnknown_ignoreTheIntent() { + // Update the Wi-Fi state to WIFI_STATE_DISABLED + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_DISABLED); + mWifiStateWorker.onReceive(mContext, mIntent); + assertThat(mWifiStateWorker.getWifiState()).isEqualTo(WIFI_STATE_DISABLED); + + // Receiver WIFI_STATE_UNKNOWN + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_UNKNOWN); + mWifiStateWorker.onReceive(mContext, mIntent); + + // Ignore the intent and keep the Wi-Fi state to WIFI_STATE_DISABLED + assertThat(mWifiStateWorker.getWifiState()).isEqualTo(WIFI_STATE_DISABLED); + + // Update the Wi-Fi state to WIFI_STATE_ENABLED + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_ENABLED); + mWifiStateWorker.onReceive(mContext, mIntent); + assertThat(mWifiStateWorker.getWifiState()).isEqualTo(WIFI_STATE_ENABLED); + + // Receiver WIFI_STATE_UNKNOWN change + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_UNKNOWN); + mWifiStateWorker.onReceive(mContext, mIntent); + + // Ignore the intent and keep the Wi-Fi state to WIFI_STATE_ENABLED + assertThat(mWifiStateWorker.getWifiState()).isEqualTo(WIFI_STATE_ENABLED); + } + + @Test + public void isWifiEnabled_receiveWifiStateDisabling_returnFalse() { + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_DISABLING); + mWifiStateWorker.onReceive(mContext, mIntent); + + assertThat(mWifiStateWorker.isWifiEnabled()).isFalse(); + } + + @Test + public void isWifiEnabled_receiveWifiStateDisabled_returnFalse() { + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_DISABLED); + mWifiStateWorker.onReceive(mContext, mIntent); + + assertThat(mWifiStateWorker.isWifiEnabled()).isFalse(); + } + + @Test + public void isWifiEnabled_receiveWifiStateEnabling_returnTrue() { + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_ENABLING); + mWifiStateWorker.onReceive(mContext, mIntent); + + assertThat(mWifiStateWorker.isWifiEnabled()).isTrue(); + } + + @Test + public void isWifiEnabled_receiveWifiStateEnabled_returnTrue() { + when(mIntent.getIntExtra(eq(EXTRA_WIFI_STATE), anyInt())).thenReturn(WIFI_STATE_ENABLED); + mWifiStateWorker.onReceive(mContext, mIntent); + + assertThat(mWifiStateWorker.isWifiEnabled()).isTrue(); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java index c9de60806b66..6409967aca9b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java @@ -228,19 +228,15 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { public void testUpdateEmptyShadeView_notificationsVisible_zenHiding() { when(mZenModeController.areNotificationsHiddenInShade()).thenReturn(true); mController.attach(mNotificationStackScrollLayout); - verify(mSysuiStatusBarStateController).addCallback( - mStateListenerArgumentCaptor.capture(), anyInt()); - StatusBarStateController.StateListener stateListener = - mStateListenerArgumentCaptor.getValue(); - setupShowEmptyShadeViewState(stateListener, true); + setupShowEmptyShadeViewState(true); reset(mNotificationStackScrollLayout); mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( /* visible= */ true, /* notifVisibleInShade= */ true); - setupShowEmptyShadeViewState(stateListener, false); + setupShowEmptyShadeViewState(false); reset(mNotificationStackScrollLayout); mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( @@ -252,19 +248,15 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { public void testUpdateEmptyShadeView_notificationsHidden_zenNotHiding() { when(mZenModeController.areNotificationsHiddenInShade()).thenReturn(false); mController.attach(mNotificationStackScrollLayout); - verify(mSysuiStatusBarStateController).addCallback( - mStateListenerArgumentCaptor.capture(), anyInt()); - StatusBarStateController.StateListener stateListener = - mStateListenerArgumentCaptor.getValue(); - setupShowEmptyShadeViewState(stateListener, true); + setupShowEmptyShadeViewState(true); reset(mNotificationStackScrollLayout); mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( /* visible= */ true, /* notifVisibleInShade= */ false); - setupShowEmptyShadeViewState(stateListener, false); + setupShowEmptyShadeViewState(false); reset(mNotificationStackScrollLayout); mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( @@ -407,15 +399,13 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { return argThat(new LogMatcher(category, type)); } - private void setupShowEmptyShadeViewState( - StatusBarStateController.StateListener statusBarStateListener, - boolean toShow) { + private void setupShowEmptyShadeViewState(boolean toShow) { if (toShow) { - statusBarStateListener.onStateChanged(SHADE); + when(mSysuiStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(SHADE); mController.setQsFullScreen(false); mController.getView().removeAllViews(); } else { - statusBarStateListener.onStateChanged(KEYGUARD); + when(mSysuiStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(KEYGUARD); mController.setQsFullScreen(true); mController.getView().addContainerView(mock(ExpandableNotificationRow.class)); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java index 71f1f0b0f7cf..cad603c85bbc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java @@ -558,6 +558,37 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @Test + public void computeMaxKeyguardNotifications_lockscreenToShade_returnsExistingMax() { + when(mAmbientState.getFractionToShade()).thenReturn(0.5f); + mNotificationPanelViewController.setMaxDisplayedNotifications(-1); + + // computeMaxKeyguardNotifications sets maxAllowed to 0 at minimum if it updates the value + assertThat(mNotificationPanelViewController.computeMaxKeyguardNotifications()) + .isEqualTo(-1); + } + + @Test + public void computeMaxKeyguardNotifications_dozeAmountNotZero_returnsExistingMax() { + when(mAmbientState.getDozeAmount()).thenReturn(0.5f); + mNotificationPanelViewController.setMaxDisplayedNotifications(-1); + + // computeMaxKeyguardNotifications sets maxAllowed to 0 at minimum if it updates the value + assertThat(mNotificationPanelViewController.computeMaxKeyguardNotifications()) + .isEqualTo(-1); + } + + @Test + public void computeMaxKeyguardNotifications_noTransition_updatesMax() { + when(mAmbientState.getFractionToShade()).thenReturn(0f); + when(mAmbientState.getDozeAmount()).thenReturn(0f); + mNotificationPanelViewController.setMaxDisplayedNotifications(-1); + + // computeMaxKeyguardNotifications sets maxAllowed to 0 at minimum if it updates the value + assertThat(mNotificationPanelViewController.computeMaxKeyguardNotifications()) + .isNotEqualTo(-1); + } + + @Test public void testSetPanelScrimMinFraction() { mNotificationPanelViewController.setPanelScrimMinFraction(0.5f); verify(mNotificationShadeDepthController).setPanelPullDownMinFraction(eq(0.5f)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index a94ad0b763aa..38e018b42985 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -192,6 +192,15 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { } @Test + public void onPanelExpansionChanged_propagatesToBouncer_evenAfterHidden() { + mStatusBarKeyguardViewManager.hide(0, 0); + when(mBouncer.inTransit()).thenReturn(true); + + mStatusBarKeyguardViewManager.onPanelExpansionChanged(EXPANSION_EVENT); + verify(mBouncer).setExpansion(eq(EXPANSION_EVENT.getFraction())); + } + + @Test public void onPanelExpansionChanged_showsBouncerWhenSwiping() { when(mKeyguardStateController.canDismissLockScreen()).thenReturn(false); mStatusBarKeyguardViewManager.onPanelExpansionChanged(EXPANSION_EVENT); diff --git a/services/core/java/com/android/server/am/AppBatteryTracker.java b/services/core/java/com/android/server/am/AppBatteryTracker.java index 9894a52b58e1..6e28d8fbad59 100644 --- a/services/core/java/com/android/server/am/AppBatteryTracker.java +++ b/services/core/java/com/android/server/am/AppBatteryTracker.java @@ -276,7 +276,9 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> AppBackgroundRestrictionsInfo.REASON_UNKNOWN, // ExemptionReason AppBackgroundRestrictionsInfo.UNKNOWN, // OptimizationLevel AppBackgroundRestrictionsInfo.SDK_UNKNOWN, // TargetSdk - isLowRamDeviceStatic()); + isLowRamDeviceStatic(), + AppBackgroundRestrictionsInfo.LEVEL_UNKNOWN // previous RestrictionLevel + ); } } } @@ -304,11 +306,17 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_BACKGROUND]; final double usageFgs = bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]; + final double usageForeground = + bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_FOREGROUND]; + final double usageCached = + bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_CACHED]; if (DEBUG_BACKGROUND_BATTERY_TRACKER_VERBOSE) { Slog.d(TAG, "getBatteryTrackerInfoProtoLocked uid:" + uid + " allUsage:" + String.format("%4.2f%%", allUsage) + " usageBackground:" + String.format("%4.2f%%", usageBackground) - + " usageFgs:" + String.format("%4.2f%%", usageFgs)); + + " usageFgs:" + String.format("%4.2f%%", usageFgs) + + " usageForeground:" + String.format("%4.2f%%", usageForeground) + + " usageCached:" + String.format("%4.2f%%", usageCached)); } final ProtoOutputStream proto = new ProtoOutputStream(); proto.write(AppBackgroundRestrictionsInfo.BatteryTrackerInfo.BATTERY_24H, @@ -317,6 +325,10 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> usageBackground * 10000); proto.write(AppBackgroundRestrictionsInfo.BatteryTrackerInfo.BATTERY_USAGE_FGS, usageFgs * 10000); + proto.write(AppBackgroundRestrictionsInfo.BatteryTrackerInfo.BATTERY_USAGE_FOREGROUND, + usageForeground * 10000); + proto.write(AppBackgroundRestrictionsInfo.BatteryTrackerInfo.BATTERY_USAGE_CACHED, + usageCached * 10000); proto.flush(); return proto.getBytes(); } diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java index 0c1ab8178b38..f7abb117e3de 100644 --- a/services/core/java/com/android/server/am/AppRestrictionController.java +++ b/services/core/java/com/android/server/am/AppRestrictionController.java @@ -2086,6 +2086,9 @@ public final class AppRestrictionController { int curLevel; int prevReason; final AppStandbyInternal appStandbyInternal = mInjector.getAppStandbyInternal(); + if (trackerInfo == null) { + trackerInfo = mEmptyTrackerInfo; + } synchronized (mSettingsLock) { curLevel = getRestrictionLevel(uid, pkgName); if (curLevel == level) { @@ -2138,14 +2141,21 @@ public final class AppRestrictionController { // It's currently active, enqueue it. final int localReason = reason; final int localSubReason = subReason; - mActiveUids.add(uid, pkgName, () -> appStandbyInternal.restrictApp( - pkgName, UserHandle.getUserId(uid), localReason, localSubReason)); + final TrackerInfo localTrackerInfo = trackerInfo; + mActiveUids.add(uid, pkgName, () -> { + appStandbyInternal.restrictApp(pkgName, UserHandle.getUserId(uid), + localReason, localSubReason); + logAppBackgroundRestrictionInfo(pkgName, uid, curLevel, level, + localTrackerInfo, localReason); + }); doIt = false; } } if (doIt) { appStandbyInternal.restrictApp(pkgName, UserHandle.getUserId(uid), reason, subReason); + logAppBackgroundRestrictionInfo(pkgName, uid, curLevel, level, trackerInfo, + reason); } } } else if (curLevel >= RESTRICTION_LEVEL_RESTRICTED_BUCKET @@ -2160,11 +2170,14 @@ public final class AppRestrictionController { appStandbyInternal.maybeUnrestrictApp(pkgName, UserHandle.getUserId(uid), prevReason & REASON_MAIN_MASK, prevReason & REASON_SUB_MASK, reason, subReason); + logAppBackgroundRestrictionInfo(pkgName, uid, curLevel, level, trackerInfo, + reason); } + } - if (trackerInfo == null) { - trackerInfo = mEmptyTrackerInfo; - } + private void logAppBackgroundRestrictionInfo(String pkgName, int uid, + @RestrictionLevel int prevLevel, @RestrictionLevel int level, + @NonNull TrackerInfo trackerInfo, int reason) { FrameworkStatsLog.write(FrameworkStatsLog.APP_BACKGROUND_RESTRICTIONS_INFO, uid, getRestrictionLevelStatsd(level), getThresholdStatsd(reason), @@ -2176,7 +2189,8 @@ public final class AppRestrictionController { getExemptionReasonStatsd(uid, level), getOptimizationLevelStatsd(level), getTargetSdkStatsd(pkgName), - ActivityManager.isLowRamDeviceStatic()); + ActivityManager.isLowRamDeviceStatic(), + getRestrictionLevelStatsd(prevLevel)); } private void handleBackgroundRestrictionChanged(int uid, String pkgName, boolean restricted) { @@ -2449,7 +2463,8 @@ public final class AppRestrictionController { mBgController.getBackgroundRestrictionExemptionReason(uid)), AppBackgroundRestrictionsInfo.UNKNOWN, // OptimizationLevel AppBackgroundRestrictionsInfo.SDK_UNKNOWN, // TargetSdk - ActivityManager.isLowRamDeviceStatic()); + ActivityManager.isLowRamDeviceStatic(), + mBgController.getRestrictionLevel(uid)); PendingIntent pendingIntent; if (!mBgController.mConstantsObserver.mBgPromptFgsWithNotiOnLongRunning && mBgController.hasForegroundServiceNotifications(packageName, uid)) { diff --git a/services/core/java/com/android/server/app/GameServiceProviderInstanceFactoryImpl.java b/services/core/java/com/android/server/app/GameServiceProviderInstanceFactoryImpl.java index a76eb8f1e55d..90b1b634f2ee 100644 --- a/services/core/java/com/android/server/app/GameServiceProviderInstanceFactoryImpl.java +++ b/services/core/java/com/android/server/app/GameServiceProviderInstanceFactoryImpl.java @@ -20,9 +20,11 @@ import android.annotation.NonNull; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.ActivityTaskManager; +import android.app.IActivityTaskManager; import android.content.Context; import android.content.Intent; import android.os.ServiceManager; +import android.os.UserHandle; import android.service.games.GameService; import android.service.games.GameSessionService; import android.service.games.IGameService; @@ -47,14 +49,17 @@ final class GameServiceProviderInstanceFactoryImpl implements GameServiceProvide @Override public GameServiceProviderInstance create( @NonNull GameServiceComponentConfiguration configuration) { + final UserHandle userHandle = configuration.getUserHandle(); + final IActivityTaskManager activityTaskManager = ActivityTaskManager.getService(); return new GameServiceProviderInstanceImpl( - configuration.getUserHandle(), + userHandle, BackgroundThread.getExecutor(), mContext, - new GameClassifierImpl(mContext.getPackageManager()), + new GameTaskInfoProvider(userHandle, activityTaskManager, + new GameClassifierImpl(mContext.getPackageManager())), ActivityManager.getService(), LocalServices.getService(ActivityManagerInternal.class), - ActivityTaskManager.getService(), + activityTaskManager, (WindowManagerService) ServiceManager.getService(Context.WINDOW_SERVICE), LocalServices.getService(WindowManagerInternal.class), new GameServiceConnector(mContext, configuration), diff --git a/services/core/java/com/android/server/app/GameServiceProviderInstanceImpl.java b/services/core/java/com/android/server/app/GameServiceProviderInstanceImpl.java index b38195aed250..a200067b8f3f 100644 --- a/services/core/java/com/android/server/app/GameServiceProviderInstanceImpl.java +++ b/services/core/java/com/android/server/app/GameServiceProviderInstanceImpl.java @@ -64,7 +64,6 @@ import com.android.server.wm.WindowManagerInternal; import com.android.server.wm.WindowManagerInternal.TaskSystemBarsListener; import com.android.server.wm.WindowManagerService; -import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; @@ -218,7 +217,7 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan private final UserHandle mUserHandle; private final Executor mBackgroundExecutor; private final Context mContext; - private final GameClassifier mGameClassifier; + private final GameTaskInfoProvider mGameTaskInfoProvider; private final IActivityManager mActivityManager; private final ActivityManagerInternal mActivityManagerInternal; private final IActivityTaskManager mActivityTaskManager; @@ -244,7 +243,7 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan @NonNull UserHandle userHandle, @NonNull Executor backgroundExecutor, @NonNull Context context, - @NonNull GameClassifier gameClassifier, + @NonNull GameTaskInfoProvider gameTaskInfoProvider, @NonNull IActivityManager activityManager, @NonNull ActivityManagerInternal activityManagerInternal, @NonNull IActivityTaskManager activityTaskManager, @@ -256,7 +255,7 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan mUserHandle = userHandle; mBackgroundExecutor = backgroundExecutor; mContext = context; - mGameClassifier = gameClassifier; + mGameTaskInfoProvider = gameTaskInfoProvider; mActivityManager = activityManager; mActivityManagerInternal = activityManagerInternal; mActivityTaskManager = activityTaskManager; @@ -344,13 +343,14 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan } private void onTaskCreated(int taskId, @NonNull ComponentName componentName) { - String packageName = componentName.getPackageName(); - if (!mGameClassifier.isGame(packageName, mUserHandle)) { + final GameTaskInfo taskInfo = mGameTaskInfoProvider.get(taskId, componentName); + + if (!taskInfo.mIsGameTask) { return; } synchronized (mLock) { - gameTaskStartedLocked(taskId, componentName); + gameTaskStartedLocked(taskInfo); } } @@ -367,7 +367,17 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan } final GameSessionRecord gameSessionRecord = mGameSessions.get(taskId); - if (gameSessionRecord == null || gameSessionRecord.getGameSession() == null) { + if (gameSessionRecord == null) { + if (focused) { + // The game session for a game task may have been destroyed when the game task + // was put into the background by pressing the back button. If the task is restored + // via the Recents UI there will be no TaskStackListener#onCreated call for the + // restoration, so this focus event is the first opportunity to re-create the game + // session. + maybeCreateGameSessionForFocusedTaskLocked(taskId); + } + return; + } else if (gameSessionRecord.getGameSession() == null) { return; } @@ -379,30 +389,50 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan } @GuardedBy("mLock") - private void gameTaskStartedLocked(int taskId, @NonNull ComponentName componentName) { + private void maybeCreateGameSessionForFocusedTaskLocked(int taskId) { + if (DEBUG) { + Slog.d(TAG, "maybeRecreateGameSessionForFocusedTaskLocked() id: " + taskId); + } + + final GameTaskInfo taskInfo = mGameTaskInfoProvider.get(taskId); + if (taskInfo == null) { + Slog.w(TAG, "No task info for focused task: " + taskId); + return; + } + + if (!taskInfo.mIsGameTask) { + return; + } + + gameTaskStartedLocked(taskInfo); + } + + @GuardedBy("mLock") + private void gameTaskStartedLocked(@NonNull GameTaskInfo gameTaskInfo) { if (DEBUG) { - Slog.i(TAG, "gameStartedLocked() id: " + taskId + " component: " + componentName); + Slog.i(TAG, "gameStartedLocked(): " + gameTaskInfo); } if (!mIsRunning) { return; } - GameSessionRecord existingGameSessionRecord = mGameSessions.get(taskId); + GameSessionRecord existingGameSessionRecord = mGameSessions.get(gameTaskInfo.mTaskId); if (existingGameSessionRecord != null) { - Slog.w(TAG, "Existing game session found for task (id: " + taskId + Slog.w(TAG, "Existing game session found for task (id: " + gameTaskInfo.mTaskId + ") creation. Ignoring."); return; } GameSessionRecord gameSessionRecord = GameSessionRecord.awaitingGameSessionRequest( - taskId, componentName); - mGameSessions.put(taskId, gameSessionRecord); + gameTaskInfo.mTaskId, gameTaskInfo.mComponentName); + mGameSessions.put(gameTaskInfo.mTaskId, gameSessionRecord); AndroidFuture<Void> unusedPostGameStartedFuture = mGameServiceConnector.post( gameService -> { gameService.gameStarted( - new GameStartedEvent(taskId, componentName.getPackageName())); + new GameStartedEvent(gameTaskInfo.mTaskId, + gameTaskInfo.mComponentName.getPackageName())); }); } @@ -769,7 +799,7 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan @Nullable private GameSessionViewHostConfiguration createViewHostConfigurationForTask(int taskId) { - RunningTaskInfo runningTaskInfo = getRunningTaskInfoForTask(taskId); + RunningTaskInfo runningTaskInfo = mGameTaskInfoProvider.getRunningTaskInfo(taskId); if (runningTaskInfo == null) { return null; } @@ -781,28 +811,6 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan bounds.height()); } - @Nullable - private RunningTaskInfo getRunningTaskInfoForTask(int taskId) { - List<RunningTaskInfo> runningTaskInfos; - try { - runningTaskInfos = mActivityTaskManager.getTasks( - /* maxNum= */ Integer.MAX_VALUE, - /* filterOnlyVisibleRecents= */ true, - /* keepIntentExtra= */ false); - } catch (RemoteException ex) { - Slog.w(TAG, "Failed to fetch running tasks"); - return null; - } - - for (RunningTaskInfo taskInfo : runningTaskInfos) { - if (taskInfo.taskId == taskId) { - return taskInfo; - } - } - - return null; - } - @VisibleForTesting void takeScreenshot(int taskId, @NonNull AndroidFuture callback) { GameSessionRecord gameSessionRecord; @@ -834,7 +842,8 @@ final class GameServiceProviderInstanceImpl implements GameServiceProviderInstan } else { final Bundle bundle = ScreenshotHelper.HardwareBitmapBundler.hardwareBitmapToBundle( bitmap); - final RunningTaskInfo runningTaskInfo = getRunningTaskInfoForTask(taskId); + final RunningTaskInfo runningTaskInfo = + mGameTaskInfoProvider.getRunningTaskInfo(taskId); if (runningTaskInfo == null) { Slog.w(TAG, "Could not get running task info for id: " + taskId); callback.complete(GameScreenshotResult.createInternalErrorResult()); diff --git a/services/core/java/com/android/server/app/GameTaskInfo.java b/services/core/java/com/android/server/app/GameTaskInfo.java new file mode 100644 index 000000000000..7548dbd06c5c --- /dev/null +++ b/services/core/java/com/android/server/app/GameTaskInfo.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.app; + +import android.content.ComponentName; + +import java.util.Objects; + +final class GameTaskInfo { + final int mTaskId; + final boolean mIsGameTask; + final ComponentName mComponentName; + + GameTaskInfo(int taskId, boolean isGameTask, ComponentName componentName) { + mTaskId = taskId; + mIsGameTask = isGameTask; + mComponentName = componentName; + } + + @Override + public String toString() { + return "GameTaskInfo{" + + "mTaskId=" + + mTaskId + + ", mIsGameTask=" + + mIsGameTask + + ", mComponentName=" + + mComponentName + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof GameTaskInfo)) { + return false; + } + + GameTaskInfo that = (GameTaskInfo) o; + return mTaskId == that.mTaskId + && mIsGameTask == that.mIsGameTask + && mComponentName.equals(that.mComponentName); + } + + @Override + public int hashCode() { + return Objects.hash(mTaskId, mIsGameTask, mComponentName); + } +} diff --git a/services/core/java/com/android/server/app/GameTaskInfoProvider.java b/services/core/java/com/android/server/app/GameTaskInfoProvider.java new file mode 100644 index 000000000000..f078d98e5950 --- /dev/null +++ b/services/core/java/com/android/server/app/GameTaskInfoProvider.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.app; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.ActivityManager.RunningTaskInfo; +import android.app.IActivityTaskManager; +import android.content.ComponentName; +import android.os.RemoteException; +import android.os.UserHandle; +import android.util.LruCache; +import android.util.Slog; + +import com.android.internal.annotations.GuardedBy; + +import java.util.List; + +final class GameTaskInfoProvider { + private static final String TAG = "GameTaskInfoProvider"; + private static final int TASK_INFO_CACHE_MAX_SIZE = 50; + + private final Object mLock = new Object(); + + @GuardedBy("mLock") + private final LruCache<Integer, GameTaskInfo> mGameTaskInfoCache = new LruCache<>( + TASK_INFO_CACHE_MAX_SIZE); + + private final UserHandle mUserHandle; + private final IActivityTaskManager mActivityTaskManager; + private final GameClassifier mGameClassifier; + + GameTaskInfoProvider(@NonNull UserHandle userHandle, + @NonNull IActivityTaskManager activityTaskManager, + @NonNull GameClassifier gameClassifier) { + mUserHandle = userHandle; + mActivityTaskManager = activityTaskManager; + mGameClassifier = gameClassifier; + } + + @Nullable + GameTaskInfo get(int taskId) { + synchronized (mLock) { + final GameTaskInfo cachedTaskInfo = mGameTaskInfoCache.get(taskId); + if (cachedTaskInfo != null) { + return cachedTaskInfo; + } + } + + final RunningTaskInfo runningTaskInfo = getRunningTaskInfo(taskId); + if (runningTaskInfo == null || runningTaskInfo.baseActivity == null) { + return null; + } + + return generateGameInfo(taskId, runningTaskInfo.baseActivity); + } + + GameTaskInfo get(int taskId, @NonNull ComponentName componentName) { + synchronized (mLock) { + final GameTaskInfo cachedTaskInfo = mGameTaskInfoCache.get(taskId); + if (cachedTaskInfo != null) { + if (cachedTaskInfo.mComponentName.equals(componentName)) { + Slog.w(TAG, "Found cached task info for taskId " + taskId + + " but cached component name " + cachedTaskInfo.mComponentName + + " does not match " + componentName); + } else { + return cachedTaskInfo; + } + } + } + + return generateGameInfo(taskId, componentName); + } + + @Nullable + RunningTaskInfo getRunningTaskInfo(int taskId) { + List<RunningTaskInfo> runningTaskInfos; + try { + runningTaskInfos = mActivityTaskManager.getTasks( + /* maxNum= */ Integer.MAX_VALUE, + /* filterOnlyVisibleRecents= */ false, + /* keepIntentExtra= */ false); + } catch (RemoteException ex) { + Slog.w(TAG, "Failed to fetch running tasks"); + return null; + } + + for (RunningTaskInfo taskInfo : runningTaskInfos) { + if (taskInfo.taskId == taskId) { + return taskInfo; + } + } + + return null; + } + + private GameTaskInfo generateGameInfo(int taskId, @NonNull ComponentName componentName) { + final GameTaskInfo gameTaskInfo = new GameTaskInfo(taskId, + mGameClassifier.isGame(componentName.getPackageName(), mUserHandle), componentName); + + synchronized (mLock) { + mGameTaskInfoCache.put(taskId, gameTaskInfo); + } + + return gameTaskInfo; + } +} diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 698f41f23e98..80ff8349a153 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -1389,12 +1389,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Brightness throttling is needed, so do so quickly. // Later, when throttling is removed, we let other mechanisms decide on speed. slowChange = false; - updateScreenBrightnessSetting = true; } mAppliedThrottling = true; } else if (mAppliedThrottling) { mAppliedThrottling = false; - updateScreenBrightnessSetting = true; } if (updateScreenBrightnessSetting) { diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 21ee4c21ceeb..6078bfc95488 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -252,6 +252,7 @@ import android.util.Log; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseBooleanArray; import android.util.StatsEvent; import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; @@ -284,6 +285,7 @@ import com.android.internal.util.DumpUtils; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.internal.util.function.TriPredicate; +import com.android.internal.widget.LockPatternUtils; import com.android.server.DeviceIdleInternal; import com.android.server.EventLogTags; import com.android.server.IoThread; @@ -1923,6 +1925,54 @@ public class NotificationManagerService extends SystemService { private SettingsObserver mSettingsObserver; protected ZenModeHelper mZenModeHelper; + protected class StrongAuthTracker extends LockPatternUtils.StrongAuthTracker { + + SparseBooleanArray mUserInLockDownMode = new SparseBooleanArray(); + boolean mIsInLockDownMode = false; + + StrongAuthTracker(Context context) { + super(context); + } + + private boolean containsFlag(int haystack, int needle) { + return (haystack & needle) != 0; + } + + public boolean isInLockDownMode() { + return mIsInLockDownMode; + } + + @Override + public synchronized void onStrongAuthRequiredChanged(int userId) { + boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId), + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mUserInLockDownMode.put(userId, userInLockDownModeNext); + boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1; + + if (mIsInLockDownMode == isInLockDownModeNext) { + return; + } + + if (isInLockDownModeNext) { + cancelNotificationsWhenEnterLockDownMode(); + } + + // When the mIsInLockDownMode is true, both notifyPostedLocked and + // notifyRemovedLocked will be dismissed. So we shall call + // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode + // as true and call postNotificationsWhenExitLockDownMode after we set + // mIsInLockDownMode as false. + mIsInLockDownMode = isInLockDownModeNext; + + if (!isInLockDownModeNext) { + postNotificationsWhenExitLockDownMode(); + } + } + } + + private LockPatternUtils mLockPatternUtils; + private StrongAuthTracker mStrongAuthTracker; + public NotificationManagerService(Context context) { this(context, new NotificationRecordLoggerImpl(), @@ -1952,6 +2002,11 @@ public class NotificationManagerService extends SystemService { } @VisibleForTesting + void setStrongAuthTracker(StrongAuthTracker strongAuthTracker) { + mStrongAuthTracker = strongAuthTracker; + } + + @VisibleForTesting void setKeyguardManager(KeyguardManager keyguardManager) { mKeyguardManager = keyguardManager; } @@ -2145,6 +2200,8 @@ public class NotificationManagerService extends SystemService { mPlatformCompat = IPlatformCompat.Stub.asInterface( ServiceManager.getService(Context.PLATFORM_COMPAT_SERVICE)); + mLockPatternUtils = new LockPatternUtils(getContext()); + mStrongAuthTracker = new StrongAuthTracker(getContext()); mUiHandler = new Handler(UiThread.get().getLooper()); String[] extractorNames; try { @@ -2641,6 +2698,7 @@ public class NotificationManagerService extends SystemService { bubbsExtractor.setShortcutHelper(mShortcutHelper); } registerNotificationPreferencesPullers(); + mLockPatternUtils.registerStrongAuthTracker(mStrongAuthTracker); } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) { // This observer will force an update when observe is called, causing us to // bind to listener services. @@ -9537,6 +9595,29 @@ public class NotificationManagerService extends SystemService { } } + private void cancelNotificationsWhenEnterLockDownMode() { + synchronized (mNotificationLock) { + int numNotifications = mNotificationList.size(); + for (int i = 0; i < numNotifications; i++) { + NotificationRecord rec = mNotificationList.get(i); + mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL, + rec.getStats()); + } + + } + } + + private void postNotificationsWhenExitLockDownMode() { + synchronized (mNotificationLock) { + int numNotifications = mNotificationList.size(); + for (int i = 0; i < numNotifications; i++) { + NotificationRecord rec = mNotificationList.get(i); + mListeners.notifyPostedLocked(rec, rec); + } + + } + } + private void updateNotificationPulse() { synchronized (mNotificationLock) { updateLightsLocked(); @@ -9753,6 +9834,10 @@ public class NotificationManagerService extends SystemService { rankings.toArray(new NotificationListenerService.Ranking[0])); } + boolean isInLockDownMode() { + return mStrongAuthTracker.isInLockDownMode(); + } + boolean hasCompanionDevice(ManagedServiceInfo info) { if (mCompanionManager == null) { mCompanionManager = getCompanionManager(); @@ -10804,8 +10889,12 @@ public class NotificationManagerService extends SystemService { * targetting <= O_MR1 */ @GuardedBy("mNotificationLock") - private void notifyPostedLocked(NotificationRecord r, NotificationRecord old, + void notifyPostedLocked(NotificationRecord r, NotificationRecord old, boolean notifyAllListeners) { + if (isInLockDownMode()) { + return; + } + try { // Lazily initialized snapshots of the notification. StatusBarNotification sbn = r.getSbn(); @@ -10903,6 +10992,10 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") public void notifyRemovedLocked(NotificationRecord r, int reason, NotificationStats notificationStats) { + if (isInLockDownMode()) { + return; + } + final StatusBarNotification sbn = r.getSbn(); // make a copy in case changes are made to the underlying Notification object @@ -10948,6 +11041,10 @@ public class NotificationManagerService extends SystemService { */ @GuardedBy("mNotificationLock") public void notifyRankingUpdateLocked(List<NotificationRecord> changedHiddenNotifications) { + if (isInLockDownMode()) { + return; + } + boolean isHiddenRankingUpdate = changedHiddenNotifications != null && changedHiddenNotifications.size() > 0; // TODO (b/73052211): if the ranking update changed the notification type, diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 8bd1da9fbe9b..2d8d4f588192 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -2545,7 +2545,6 @@ final class InstallPackageHelper { ArrayList<String>[] components; int size = 0; int[] uids; - Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT); synchronized (mPm.mLock) { final SparseArray<ArrayMap<String, ArrayList<String>>> userIdToPackagesToComponents = @@ -2584,7 +2583,6 @@ final class InstallPackageHelper { mPm.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */, components[i], uids[i], null /* reason */); } - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); } void handlePackagePostInstall(PackageInstalledInfo res, InstallArgs installArgs, diff --git a/services/core/java/com/android/server/pm/PackageHandler.java b/services/core/java/com/android/server/pm/PackageHandler.java index e8faca9765f8..0dfa31c5f1fc 100644 --- a/services/core/java/com/android/server/pm/PackageHandler.java +++ b/services/core/java/com/android/server/pm/PackageHandler.java @@ -75,7 +75,7 @@ final class PackageHandler extends Handler { try { doHandleMessage(msg); } finally { - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); + Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT); } } @@ -136,19 +136,13 @@ final class PackageHandler extends Handler { } } break; case WRITE_SETTINGS: { - Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT); mPm.writeSettings(); - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); } break; case WRITE_PACKAGE_RESTRICTIONS: { - Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT); mPm.writePendingRestrictions(); - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); } break; case WRITE_PACKAGE_LIST: { - Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT); mPm.writePackageList(msg.arg1); - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); } break; case CHECK_PENDING_VERIFICATION: { final int verificationId = msg.arg1; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 88564aa2e935..2cef35fcf0f6 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1413,7 +1413,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService t.traceBegin("create package manager"); final PackageManagerTracedLock lock = new PackageManagerTracedLock(); final Object installLock = new Object(); - HandlerThread backgroundThread = new HandlerThread("PackageManagerBg"); + + HandlerThread backgroundThread = new ServiceThread("PackageManagerBg", + Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/); backgroundThread.start(); Handler backgroundHandler = new Handler(backgroundThread.getLooper()); @@ -1467,7 +1469,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService (i, pm) -> domainVerificationService, (i, pm) -> { HandlerThread thread = new ServiceThread(TAG, - Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/); + Process.THREAD_PRIORITY_DEFAULT, true /*allowIo*/); thread.start(); return new PackageHandler(thread.getLooper(), pm); }, diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index a1b4b30c18cd..ba4d09f28d05 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -164,6 +164,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.function.Consumer; @@ -633,8 +634,8 @@ public final class Settings implements Watchable, Snappable { runtimePermissionsPersistence, new Consumer<Integer>() { @Override public void accept(Integer userId) { - mRuntimePermissionsPersistence.writeStateForUser(userId, - mPermissionDataProvider, mPackages, mSharedUsers, mHandler, mLock); + mRuntimePermissionsPersistence.writeStateForUser(userId, mPermissionDataProvider, + mPackages, mSharedUsers, mHandler, mLock, /*sync=*/false); } }); mPermissionDataProvider = permissionDataProvider; @@ -5292,7 +5293,7 @@ public final class Settings implements Watchable, Snappable { public void writePermissionStateForUserLPr(int userId, boolean sync) { if (sync) { mRuntimePermissionsPersistence.writeStateForUser(userId, mPermissionDataProvider, - mPackages, mSharedUsers, /*handler=*/null, mLock); + mPackages, mSharedUsers, /*handler=*/null, mLock, /*sync=*/true); } else { mRuntimePermissionsPersistence.writeStateForUserAsync(userId); } @@ -5370,12 +5371,17 @@ public final class Settings implements Watchable, Snappable { } private static final class RuntimePermissionPersistence { - private static final long WRITE_PERMISSIONS_DELAY_MILLIS = 200; + // 200-400ms delay to avoid monopolizing PMS lock when written for multiple users. + private static final long WRITE_PERMISSIONS_DELAY_MILLIS = 300; + private static final double WRITE_PERMISSIONS_DELAY_JITTER = 0.3; + private static final long MAX_WRITE_PERMISSIONS_DELAY_MILLIS = 2000; private static final int UPGRADE_VERSION = -1; private static final int INITIAL_VERSION = 0; + private static final Random sRandom = new Random(); + private String mExtendedFingerprint; @GuardedBy("mPersistenceLock") @@ -5397,6 +5403,11 @@ public final class Settings implements Watchable, Snappable { private final SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray(); @GuardedBy("mLock") + // Tracking the mutations that haven't yet been written to legacy state. + // This avoids unnecessary work when writing settings for multiple users. + private boolean mIsLegacyPermissionStateStale = false; + + @GuardedBy("mLock") // The mapping keys are user ids. private final SparseIntArray mVersions = new SparseIntArray(); @@ -5472,9 +5483,22 @@ public final class Settings implements Watchable, Snappable { return PackagePartitions.FINGERPRINT + "?pc_version=" + version; } + private static long uniformRandom(double low, double high) { + double mag = high - low; + return (long) (sRandom.nextDouble() * mag + low); + } + + private static long nextWritePermissionDelayMillis() { + final long delay = WRITE_PERMISSIONS_DELAY_MILLIS; + final double jitter = WRITE_PERMISSIONS_DELAY_JITTER; + return delay + uniformRandom(-jitter * delay, jitter * delay); + } + public void writeStateForUserAsync(int userId) { synchronized (mLock) { + mIsLegacyPermissionStateStale = true; final long currentTimeMillis = SystemClock.uptimeMillis(); + final long writePermissionDelayMillis = nextWritePermissionDelayMillis(); if (mWriteScheduled.get(userId)) { mAsyncHandler.removeMessages(userId); @@ -5493,7 +5517,7 @@ public final class Settings implements Watchable, Snappable { // Hold off a bit more as settings are frequently changing. final long maxDelayMillis = Math.max(lastNotWrittenMutationTimeMillis + MAX_WRITE_PERMISSIONS_DELAY_MILLIS - currentTimeMillis, 0); - final long writeDelayMillis = Math.min(WRITE_PERMISSIONS_DELAY_MILLIS, + final long writeDelayMillis = Math.min(writePermissionDelayMillis, maxDelayMillis); Message message = mAsyncHandler.obtainMessage(userId); @@ -5501,7 +5525,7 @@ public final class Settings implements Watchable, Snappable { } else { mLastNotWrittenMutationTimesMillis.put(userId, currentTimeMillis); Message message = mAsyncHandler.obtainMessage(userId); - mAsyncHandler.sendMessageDelayed(message, WRITE_PERMISSIONS_DELAY_MILLIS); + mAsyncHandler.sendMessageDelayed(message, writePermissionDelayMillis); mWriteScheduled.put(userId, true); } } @@ -5511,21 +5535,27 @@ public final class Settings implements Watchable, Snappable { legacyPermissionDataProvider, @NonNull WatchedArrayMap<String, ? extends PackageStateInternal> packageStates, @NonNull WatchedArrayMap<String, SharedUserSetting> sharedUsers, - @Nullable Handler pmHandler, @NonNull Object pmLock) { + @Nullable Handler pmHandler, @NonNull Object pmLock, + boolean sync) { final int version; final String fingerprint; + final boolean isLegacyPermissionStateStale; synchronized (mLock) { mAsyncHandler.removeMessages(userId); mWriteScheduled.delete(userId); version = mVersions.get(userId, INITIAL_VERSION); fingerprint = mFingerprints.get(userId); + isLegacyPermissionStateStale = mIsLegacyPermissionStateStale; + mIsLegacyPermissionStateStale = false; } Runnable writer = () -> { final RuntimePermissionsState runtimePermissions; synchronized (pmLock) { - legacyPermissionDataProvider.writeLegacyPermissionStateTEMP(); + if (sync || isLegacyPermissionStateStale) { + legacyPermissionDataProvider.writeLegacyPermissionStateTEMP(); + } Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions = new ArrayMap<>(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index eff75bc0622b..a9b0f0dc28ad 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -423,7 +423,7 @@ public class WindowManagerService extends IWindowManager.Stub "persist.wm.enable_remote_keyguard_animation"; private static final int sEnableRemoteKeyguardAnimation = - SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1); + SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 2); /** * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY diff --git a/services/tests/mockingservicestests/Android.bp b/services/tests/mockingservicestests/Android.bp index 670c1596e15e..08c68b9a469e 100644 --- a/services/tests/mockingservicestests/Android.bp +++ b/services/tests/mockingservicestests/Android.bp @@ -42,6 +42,8 @@ android_test { static_libs: [ "androidx.test.core", "androidx.test.runner", + "androidx.test.espresso.core", + "androidx.test.espresso.contrib", "androidx.test.ext.truth", "frameworks-base-testutils", "hamcrest-library", diff --git a/services/tests/mockingservicestests/AndroidManifest.xml b/services/tests/mockingservicestests/AndroidManifest.xml index 7714cf0ca094..07b763dcd85b 100644 --- a/services/tests/mockingservicestests/AndroidManifest.xml +++ b/services/tests/mockingservicestests/AndroidManifest.xml @@ -32,6 +32,8 @@ <uses-permission android:name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD"/> <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" /> + <uses-permission android:name="android.permission.MANAGE_GAME_ACTIVITY" /> + <uses-permission android:name="android.permission.SET_ALWAYS_FINISH" /> <!-- needed by MasterClearReceiverTest to display a system dialog --> <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/> @@ -39,6 +41,8 @@ <application android:testOnly="true" android:debuggable="true"> <uses-library android:name="android.test.runner" /> + <activity + android:name="android.service.games.GameSessionTrampolineActivityTest$TestActivity" /> </application> <instrumentation diff --git a/services/tests/mockingservicestests/src/android/service/games/GameSessionTrampolineActivityTest.java b/services/tests/mockingservicestests/src/android/service/games/GameSessionTrampolineActivityTest.java new file mode 100644 index 000000000000..d68b517ca8cd --- /dev/null +++ b/services/tests/mockingservicestests/src/android/service/games/GameSessionTrampolineActivityTest.java @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.games; + +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.isClickable; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static androidx.test.ext.truth.content.IntentSubject.assertThat; +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; + +import static com.google.common.truth.Truth.assertThat; + +import static org.hamcrest.Matchers.allOf; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Intent; +import android.os.Bundle; +import android.os.RemoteException; +import android.platform.test.annotations.Presubmit; +import android.testing.AndroidTestingRunner; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.test.espresso.NoActivityResumedException; +import androidx.test.filters.SmallTest; + +import com.android.internal.infra.AndroidFuture; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.concurrent.TimeUnit; + +/** + * Unit tests for the {@link GameSessionTrampolineActivity}. + */ +@RunWith(AndroidTestingRunner.class) +@SmallTest +@Presubmit +public class GameSessionTrampolineActivityTest { + + @Before + public void setUp() { + setAlwaysFinishActivities(false); + } + + @After + public void tearDown() { + setAlwaysFinishActivities(false); + } + + @Test + public void launch_launchesTargetActivity() { + AndroidFuture<GameSessionActivityResult> unusedResultFuture = + startTestActivityViaGameSessionTrampolineActivity(); + + TestActivityPage.assertPageIsLaunched(); + } + + @Test + public void launch_targetActivityFinishesSuccessfully_futureCompletedWithSameResults() { + AndroidFuture<GameSessionActivityResult> resultFuture = + startTestActivityViaGameSessionTrampolineActivity(); + + TestActivityPage.assertPageIsLaunched(); + TestActivityPage.clickFinish(); + + GameSessionActivityResult expectedResult = + new GameSessionActivityResult(Activity.RESULT_OK, TestActivity.RESULT_INTENT); + + assertEquals(resultFuture, expectedResult); + + TestActivityPage.assertPageIsNotLaunched(); + } + + @Test + public void launch_trampolineActivityProcessDeath_futureCompletedWithSameResults() { + setAlwaysFinishActivities(true); + + AndroidFuture<GameSessionActivityResult> resultFuture = + startTestActivityViaGameSessionTrampolineActivity(); + + TestActivityPage.assertPageIsLaunched(); + TestActivityPage.clickFinish(); + + GameSessionActivityResult expectedResult = + new GameSessionActivityResult(Activity.RESULT_OK, TestActivity.RESULT_INTENT); + + assertEquals(resultFuture, expectedResult); + + TestActivityPage.assertPageIsNotLaunched(); + } + + private static void assertEquals( + AndroidFuture<GameSessionActivityResult> actualFuture, + GameSessionActivityResult expected) { + try { + assertEquals(actualFuture.get(20, TimeUnit.SECONDS), expected); + } catch (Exception ex) { + throw new IllegalStateException(ex); + } + } + + private static void assertEquals( + GameSessionActivityResult actual, + GameSessionActivityResult expected) { + assertThat(actual.getResultCode()).isEqualTo(expected.getResultCode()); + assertThat(actual.getData()).filtersEquallyTo(actual.getData()); + } + + private static void setAlwaysFinishActivities(boolean isEnabled) { + try { + ActivityManager.getService().setAlwaysFinish(isEnabled); + } catch (RemoteException ex) { + throw new IllegalStateException(ex); + } + } + + private static AndroidFuture<GameSessionActivityResult> + startTestActivityViaGameSessionTrampolineActivity() { + Intent testActivityIntent = new Intent(); + testActivityIntent.setClass(getInstrumentation().getTargetContext(), TestActivity.class); + + return startGameSessionTrampolineActivity(testActivityIntent); + } + + private static AndroidFuture<GameSessionActivityResult> startGameSessionTrampolineActivity( + Intent targetIntent) { + AndroidFuture<GameSessionActivityResult> resultFuture = new AndroidFuture<>(); + Intent trampolineActivityIntent = GameSessionTrampolineActivity.createIntent(targetIntent, + null, resultFuture); + trampolineActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getInstrumentation().getTargetContext().startActivity(trampolineActivityIntent); + getInstrumentation().waitForIdleSync(); + + return resultFuture; + } + + + private static class TestActivityPage { + private TestActivityPage() {} + + public static void assertPageIsLaunched() { + onView(withText(TestActivity.PAGE_TITLE_TEXT)).check(matches(isDisplayed())); + } + + public static void assertPageIsNotLaunched() { + try { + onView(withText(TestActivity.PAGE_TITLE_TEXT)).check(doesNotExist()); + } catch (NoActivityResumedException ex) { + // Do nothing + } + } + + public static void clickFinish() { + onView(allOf(withText(TestActivity.FINISH_BUTTON_TEXT), isClickable())).perform( + click()); + getInstrumentation().waitForIdleSync(); + } + } + + public static class TestActivity extends Activity { + private static final String PAGE_TITLE_TEXT = "GameSessionTestActivity"; + private static final String FINISH_BUTTON_TEXT = "Finish Test Activity"; + private static final Intent RESULT_INTENT = new Intent("com.test.action.VIEW"); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + LinearLayout contentLayout = new LinearLayout(this); + contentLayout.setOrientation(LinearLayout.VERTICAL); + + TextView titleTextView = new TextView(this); + titleTextView.setText(PAGE_TITLE_TEXT); + contentLayout.addView(titleTextView); + + Button finishActivityButton = new Button(this); + finishActivityButton.setText(FINISH_BUTTON_TEXT); + finishActivityButton.setOnClickListener((unused) -> { + setResult(Activity.RESULT_OK, RESULT_INTENT); + finish(); + }); + + + contentLayout.addView(finishActivityButton); + setContentView(contentLayout); + } + } +} diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameServiceProviderInstanceImplTest.java b/services/tests/mockingservicestests/src/com/android/server/app/GameServiceProviderInstanceImplTest.java index 319a769bb1de..5b551b1c183c 100644 --- a/services/tests/mockingservicestests/src/com/android/server/app/GameServiceProviderInstanceImplTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/app/GameServiceProviderInstanceImplTest.java @@ -216,11 +216,12 @@ public final class GameServiceProviderInstanceImplTest { mRunningTaskInfos); + final UserHandle userHandle = new UserHandle(USER_ID); mGameServiceProviderInstance = new GameServiceProviderInstanceImpl( - new UserHandle(USER_ID), + userHandle, ConcurrentUtils.DIRECT_EXECUTOR, mMockContext, - mFakeGameClassifier, + new GameTaskInfoProvider(userHandle, mMockActivityTaskManager, mFakeGameClassifier), mMockActivityManager, mMockActivityManagerInternal, mMockActivityTaskManager, @@ -788,6 +789,36 @@ public final class GameServiceProviderInstanceImplTest { } @Test + public void gameTaskFocusedWithCreateAfterRemoved_gameSessionRecreated() throws Exception { + mGameServiceProviderInstance.start(); + + startTask(10, GAME_A_MAIN_ACTIVITY); + mockPermissionGranted(Manifest.permission.MANAGE_GAME_ACTIVITY); + mFakeGameService.requestCreateGameSession(10); + + FakeGameSession gameSession10 = new FakeGameSession(); + SurfacePackage mockSurfacePackage10 = Mockito.mock(SurfacePackage.class); + mFakeGameSessionService.removePendingFutureForTaskId(10) + .complete(new CreateGameSessionResult(gameSession10, mockSurfacePackage10)); + + stopTask(10); + + assertThat(gameSession10.mIsDestroyed).isTrue(); + + // If the game task is restored via the Recents UI, the task will be running again but + // we would not expect any call to TaskStackListener#onTaskCreated. + addRunningTaskInfo(10, GAME_A_MAIN_ACTIVITY); + + // We now receive a task focused event for the task. This will occur if the game task is + // restored via the Recents UI. + dispatchTaskFocused(10, /*focused=*/ true); + mFakeGameService.requestCreateGameSession(10); + + // Verify that a new pending game session is created for the game's taskId. + assertNotNull(mFakeGameSessionService.removePendingFutureForTaskId(10)); + } + + @Test public void gameTaskRemoved_removesTaskOverlay() throws Exception { mGameServiceProviderInstance.start(); @@ -1144,13 +1175,18 @@ public final class GameServiceProviderInstanceImplTest { } private void startTask(int taskId, ComponentName componentName) { + addRunningTaskInfo(taskId, componentName); + + dispatchTaskCreated(taskId, componentName); + } + + private void addRunningTaskInfo(int taskId, ComponentName componentName) { RunningTaskInfo runningTaskInfo = new RunningTaskInfo(); runningTaskInfo.taskId = taskId; + runningTaskInfo.baseActivity = componentName; runningTaskInfo.displayId = 1; runningTaskInfo.configuration.windowConfiguration.setBounds(new Rect(0, 0, 500, 800)); mRunningTaskInfos.add(runningTaskInfo); - - dispatchTaskCreated(taskId, componentName); } private void stopTask(int taskId) { diff --git a/services/tests/servicestests/src/com/android/server/display/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/display/TEST_MAPPING new file mode 100644 index 000000000000..9f1a209d2ee1 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/display/TEST_MAPPING @@ -0,0 +1,21 @@ +{ + "presubmit": [ + { + "name": "FrameworksServicesTests", + "options": [ + { + "include-filter": "com.android.server.display." + }, + { + "include-annotation": "android.platform.test.annotations.Presubmit" + }, + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + }, + { + "exclude-annotation": "org.junit.Ignore" + } + ] + } + ] +} diff --git a/services/tests/uiservicestests/AndroidManifest.xml b/services/tests/uiservicestests/AndroidManifest.xml index 767857bf2de8..e8e3a8f84f21 100644 --- a/services/tests/uiservicestests/AndroidManifest.xml +++ b/services/tests/uiservicestests/AndroidManifest.xml @@ -33,6 +33,7 @@ <uses-permission android:name="android.permission.OBSERVE_ROLE_HOLDERS" /> <uses-permission android:name="android.permission.GET_INTENT_SENDER_INTENT"/> <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" /> + <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" /> <application android:debuggable="true"> <uses-library android:name="android.test.runner" /> diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java index f4b9e258f7e0..76d4059eb436 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java @@ -30,8 +30,11 @@ import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -46,6 +49,8 @@ import android.os.Bundle; import android.os.UserHandle; import android.service.notification.NotificationListenerFilter; import android.service.notification.NotificationListenerService; +import android.service.notification.NotificationStats; +import android.service.notification.StatusBarNotification; import android.testing.TestableContext; import android.util.ArraySet; import android.util.Pair; @@ -59,11 +64,13 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.internal.util.reflection.FieldSetter; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.util.List; public class NotificationListenersTest extends UiServiceTestCase { @@ -388,4 +395,66 @@ public class NotificationListenersTest extends UiServiceTestCase { verify(mContext).sendBroadcastAsUser( any(), eq(UserHandle.of(userId)), nullable(String.class)); } + + @Test + public void testNotifyPostedLockedInLockdownMode() { + NotificationRecord r = mock(NotificationRecord.class); + NotificationRecord old = mock(NotificationRecord.class); + + // before the lockdown mode + when(mNm.isInLockDownMode()).thenReturn(false); + mListeners.notifyPostedLocked(r, old, true); + mListeners.notifyPostedLocked(r, old, false); + verify(r, atLeast(2)).getSbn(); + + // in the lockdown mode + reset(r); + reset(old); + when(mNm.isInLockDownMode()).thenReturn(true); + mListeners.notifyPostedLocked(r, old, true); + mListeners.notifyPostedLocked(r, old, false); + verify(r, never()).getSbn(); + } + + @Test + public void testnotifyRankingUpdateLockedInLockdownMode() { + List chn = mock(List.class); + + // before the lockdown mode + when(mNm.isInLockDownMode()).thenReturn(false); + mListeners.notifyRankingUpdateLocked(chn); + verify(chn, atLeast(1)).size(); + + // in the lockdown mode + reset(chn); + when(mNm.isInLockDownMode()).thenReturn(true); + mListeners.notifyRankingUpdateLocked(chn); + verify(chn, never()).size(); + } + + @Test + public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException { + NotificationRecord r = mock(NotificationRecord.class); + NotificationStats rs = mock(NotificationStats.class); + StatusBarNotification sbn = mock(StatusBarNotification.class); + FieldSetter.setField(mNm, + NotificationManagerService.class.getDeclaredField("mHandler"), + mock(NotificationManagerService.WorkerHandler.class)); + + // before the lockdown mode + when(mNm.isInLockDownMode()).thenReturn(false); + when(r.getSbn()).thenReturn(sbn); + mListeners.notifyRemovedLocked(r, 0, rs); + mListeners.notifyRemovedLocked(r, 0, rs); + verify(r, atLeast(2)).getSbn(); + + // in the lockdown mode + reset(r); + reset(rs); + when(mNm.isInLockDownMode()).thenReturn(true); + when(r.getSbn()).thenReturn(sbn); + mListeners.notifyRemovedLocked(r, 0, rs); + mListeners.notifyRemovedLocked(r, 0, rs); + verify(r, never()).getSbn(); + } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index b987c692bddb..348e015500fe 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -63,10 +63,13 @@ import static android.service.notification.Adjustment.KEY_USER_SENTIMENT; import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ALERTING; import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_CONVERSATIONS; import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ONGOING; +import static android.service.notification.NotificationListenerService.REASON_CANCEL_ALL; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN; + import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertEquals; @@ -352,6 +355,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { MultiRateLimiter mToastRateLimiter; BroadcastReceiver mPackageIntentReceiver; NotificationRecordLoggerFake mNotificationRecordLogger = new NotificationRecordLoggerFake(); + TestableNotificationManagerService.StrongAuthTrackerFake mStrongAuthTracker; private InstanceIdSequence mNotificationInstanceIdSequence = new InstanceIdSequenceFake( 1 << 30); @Mock @@ -508,6 +512,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mService.setAudioManager(mAudioManager); + mStrongAuthTracker = mService.new StrongAuthTrackerFake(mContext); + mService.setStrongAuthTracker(mStrongAuthTracker); + mShortcutHelper = mService.getShortcutHelper(); mShortcutHelper.setLauncherApps(mLauncherApps); mShortcutHelper.setShortcutServiceInternal(mShortcutServiceInternal); @@ -9247,4 +9254,44 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // make sure the summary was removed and not re-posted assertThat(mService.getNotificationRecordCount()).isEqualTo(0); } + + @Test + public void testStrongAuthTracker_isInLockDownMode() { + mStrongAuthTracker.setGetStrongAuthForUserReturnValue( + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + assertTrue(mStrongAuthTracker.isInLockDownMode()); + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + assertFalse(mStrongAuthTracker.isInLockDownMode()); + } + + @Test + public void testCancelAndPostNotificationsWhenEnterAndExitLockDownMode() { + // post 2 notifications from 2 packages + NotificationRecord pkgA = new NotificationRecord(mContext, + generateSbn("a", 1000, 9, 0), mTestNotificationChannel); + mService.addNotification(pkgA); + NotificationRecord pkgB = new NotificationRecord(mContext, + generateSbn("b", 1001, 9, 0), mTestNotificationChannel); + mService.addNotification(pkgB); + + // when entering the lockdown mode, cancel the 2 notifications. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue( + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + assertTrue(mStrongAuthTracker.isInLockDownMode()); + + // the notifyRemovedLocked function is called twice due to REASON_CANCEL_ALL. + ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class); + verify(mListeners, times(2)).notifyRemovedLocked(any(), captor.capture(), any()); + assertEquals(REASON_CANCEL_ALL, captor.getValue().intValue()); + + // exit lockdown mode. + mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); + mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); + + // the notifyPostedLocked function is called twice. + verify(mListeners, times(2)).notifyPostedLocked(any(), any()); + } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java b/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java index bde048569e53..4ed7d35a097f 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/TestableNotificationManagerService.java @@ -113,4 +113,20 @@ public class TestableNotificationManagerService extends NotificationManagerServi protected void doChannelWarningToast(int uid, CharSequence toastText) { mChannelToastsSent.add(uid); } + + public class StrongAuthTrackerFake extends NotificationManagerService.StrongAuthTracker { + private int mGetStrongAuthForUserReturnValue = 0; + StrongAuthTrackerFake(Context context) { + super(context); + } + + public void setGetStrongAuthForUserReturnValue(int val) { + mGetStrongAuthForUserReturnValue = val; + } + + @Override + public int getStrongAuthForUser(int userId) { + return mGetStrongAuthForUserReturnValue; + } + } } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 8cbbe947d32d..f31cdcba5830 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -1824,6 +1824,32 @@ public class VoiceInteractionManagerService extends SystemService { } } + public void setSessionWindowVisible(IBinder token, boolean visible) { + synchronized (this) { + if (mImpl == null) { + Slog.w(TAG, "setSessionWindowVisible called without running voice interaction " + + "service"); + return; + } + if (mImpl.mActiveSession == null || token != mImpl.mActiveSession.mToken) { + Slog.w(TAG, "setSessionWindowVisible does not match active session"); + return; + } + final long caller = Binder.clearCallingIdentity(); + try { + mVoiceInteractionSessionListeners.broadcast(listener -> { + try { + listener.onVoiceSessionWindowVisibilityChanged(visible); + } catch (RemoteException e) { + Slog.e(TAG, "Error delivering window visibility event to listener.", e); + } + }); + } finally { + Binder.restoreCallingIdentity(caller); + } + } + } + @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; diff --git a/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/NotificationTest.java b/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/NotificationTest.java index 90fd08bae4ef..47f87d6d75ff 100644 --- a/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/NotificationTest.java +++ b/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/NotificationTest.java @@ -95,6 +95,8 @@ public final class NotificationTest { PackageManager pm = mContext.getPackageManager(); // Do not run on Automotive. assumeFalse(pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)); + // Do not run on TV. Direct Reply isn't supported on TV. + assumeFalse(pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK_ONLY)); } @After |