diff options
103 files changed, 3276 insertions, 5401 deletions
diff --git a/Android.bp b/Android.bp index 57a5a3c6bff1..f1a3af27a633 100644 --- a/Android.bp +++ b/Android.bp @@ -621,6 +621,7 @@ metalava_framework_docs_args = "" + "--api-lint-ignore-prefix org. " + "--error NoSettingsProvider " + "--error UnhiddenSystemApi " + + "--error UnflaggedApi " + "--force-convert-to-warning-nullability-annotations +*:-android.*:+android.icu.*:-dalvik.* " + "--hide BroadcastBehavior " + "--hide CallbackInterface " + diff --git a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java index 1eaabf5b884f..f252a0ba48cf 100644 --- a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java +++ b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java @@ -5318,7 +5318,7 @@ public class DeviceIdleController extends SystemService if (mConstants.USE_MODE_MANAGER) { pw.print(" mModeManagerRequestedQuickDoze="); pw.println(mModeManagerRequestedQuickDoze); - pw.print(" mIsOffBody"); + pw.print(" mIsOffBody="); pw.println(mIsOffBody); } } diff --git a/api/StubLibraries.bp b/api/StubLibraries.bp index 2f84df70fc40..e45ab89e6935 100644 --- a/api/StubLibraries.bp +++ b/api/StubLibraries.bp @@ -33,7 +33,7 @@ droidstubs { "android-non-updatable-stubs-defaults", "module-classpath-stubs-defaults", ], - args: metalava_framework_docs_args + "--error UnflaggedApi ", + args: metalava_framework_docs_args, check_api: { current: { api_file: ":non-updatable-current.txt", @@ -74,8 +74,7 @@ priv_apps_in_stubs = " --show-for-stub-purposes-annotation android.annotation.Sy "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" + "\\)" -test = " --show-annotation android.annotation.TestApi" + - " --hide UnflaggedApi" // TODO(b/297362755): TestApi lint doesn't ignore existing APIs. +test = " --show-annotation android.annotation.TestApi" module_libs = " --show-annotation android.annotation.SystemApi\\(" + "client=android.annotation.SystemApi.Client.MODULE_LIBRARIES" + @@ -134,6 +133,7 @@ droidstubs { }, api_lint: { enabled: true, + new_since: ":android.api.test.latest", baseline_file: ":non-updatable-test-lint-baseline.txt", }, }, diff --git a/core/api/lint-baseline.txt b/core/api/lint-baseline.txt index 6b7910afc347..afb10f5f234a 100644 --- a/core/api/lint-baseline.txt +++ b/core/api/lint-baseline.txt @@ -265,8 +265,6 @@ UnflaggedApi: android.database.sqlite.SQLiteRawStatement#reset(): New API must be flagged with @FlaggedApi: method android.database.sqlite.SQLiteRawStatement.reset() UnflaggedApi: android.database.sqlite.SQLiteRawStatement#step(): New API must be flagged with @FlaggedApi: method android.database.sqlite.SQLiteRawStatement.step() -UnflaggedApi: android.database.sqlite.SQLiteRawStatement#toString(): - New API must be flagged with @FlaggedApi: method android.database.sqlite.SQLiteRawStatement.toString() UnflaggedApi: android.graphics.Gainmap#Gainmap(android.graphics.Gainmap, android.graphics.Bitmap): New API must be flagged with @FlaggedApi: constructor android.graphics.Gainmap(android.graphics.Gainmap,android.graphics.Bitmap) UnflaggedApi: android.graphics.Path#computeBounds(android.graphics.RectF): @@ -321,8 +319,6 @@ UnflaggedApi: android.media.midi.MidiUmpDeviceService#onBind(android.content.Int New API must be flagged with @FlaggedApi: method android.media.midi.MidiUmpDeviceService.onBind(android.content.Intent) UnflaggedApi: android.media.midi.MidiUmpDeviceService#onClose(): New API must be flagged with @FlaggedApi: method android.media.midi.MidiUmpDeviceService.onClose() -UnflaggedApi: android.media.midi.MidiUmpDeviceService#onCreate(): - New API must be flagged with @FlaggedApi: method android.media.midi.MidiUmpDeviceService.onCreate() UnflaggedApi: android.media.midi.MidiUmpDeviceService#onDeviceStatusChanged(android.media.midi.MidiDeviceStatus): New API must be flagged with @FlaggedApi: method android.media.midi.MidiUmpDeviceService.onDeviceStatusChanged(android.media.midi.MidiDeviceStatus) UnflaggedApi: android.media.midi.MidiUmpDeviceService#onGetInputPortReceivers(): @@ -335,8 +331,6 @@ UnflaggedApi: android.os.UserManager#DISALLOW_NEAR_FIELD_COMMUNICATION_RADIO: New API must be flagged with @FlaggedApi: field android.os.UserManager.DISALLOW_NEAR_FIELD_COMMUNICATION_RADIO UnflaggedApi: android.provider.Settings#ACTION_CREDENTIAL_PROVIDER: New API must be flagged with @FlaggedApi: field android.provider.Settings.ACTION_CREDENTIAL_PROVIDER -UnflaggedApi: android.telecom.Call.Details#PROPERTY_IS_TRANSACTIONAL: - New API must be flagged with @FlaggedApi: field android.telecom.Call.Details.PROPERTY_IS_TRANSACTIONAL UnflaggedApi: android.telecom.Call.Details#getId(): New API must be flagged with @FlaggedApi: method android.telecom.Call.Details.getId() UnflaggedApi: android.telephony.CarrierConfigManager#KEY_CARRIER_SUPPORTED_SATELLITE_SERVICES_PER_PROVIDER_BUNDLE: @@ -355,46 +349,10 @@ UnflaggedApi: android.telephony.TelephonyManager#EVENT_DISPLAY_SOS_MESSAGE: New API must be flagged with @FlaggedApi: field android.telephony.TelephonyManager.EVENT_DISPLAY_SOS_MESSAGE UnflaggedApi: android.telephony.TelephonyManager#PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_DISABLED: New API must be flagged with @FlaggedApi: field android.telephony.TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_DISABLED -UnflaggedApi: android.text.BoringLayout#computeDrawingBoundingBox(): - New API must be flagged with @FlaggedApi: method android.text.BoringLayout.computeDrawingBoundingBox() -UnflaggedApi: android.text.BoringLayout.Metrics#getDrawingBoundingBox(): - New API must be flagged with @FlaggedApi: method android.text.BoringLayout.Metrics.getDrawingBoundingBox() -UnflaggedApi: android.text.DynamicLayout#getLineBreakConfig(): - New API must be flagged with @FlaggedApi: method android.text.DynamicLayout.getLineBreakConfig() UnflaggedApi: android.text.DynamicLayout.Builder#setLineBreakConfig(android.graphics.text.LineBreakConfig): New API must be flagged with @FlaggedApi: method android.text.DynamicLayout.Builder.setLineBreakConfig(android.graphics.text.LineBreakConfig) UnflaggedApi: android.text.DynamicLayout.Builder#setUseBoundsForWidth(boolean): New API must be flagged with @FlaggedApi: method android.text.DynamicLayout.Builder.setUseBoundsForWidth(boolean) -UnflaggedApi: android.text.Layout#computeDrawingBoundingBox(): - New API must be flagged with @FlaggedApi: method android.text.Layout.computeDrawingBoundingBox() -UnflaggedApi: android.text.Layout#getBreakStrategy(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getBreakStrategy() -UnflaggedApi: android.text.Layout#getEllipsize(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getEllipsize() -UnflaggedApi: android.text.Layout#getHyphenationFrequency(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getHyphenationFrequency() -UnflaggedApi: android.text.Layout#getJustificationMode(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getJustificationMode() -UnflaggedApi: android.text.Layout#getLeftIndents(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getLeftIndents() -UnflaggedApi: android.text.Layout#getLineBreakConfig(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getLineBreakConfig() -UnflaggedApi: android.text.Layout#getLineSpacingAmount(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getLineSpacingAmount() -UnflaggedApi: android.text.Layout#getLineSpacingMultiplier(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getLineSpacingMultiplier() -UnflaggedApi: android.text.Layout#getMaxLines(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getMaxLines() -UnflaggedApi: android.text.Layout#getRightIndents(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getRightIndents() -UnflaggedApi: android.text.Layout#getTextDirectionHeuristic(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getTextDirectionHeuristic() -UnflaggedApi: android.text.Layout#getUseBoundsForWidth(): - New API must be flagged with @FlaggedApi: method android.text.Layout.getUseBoundsForWidth() -UnflaggedApi: android.text.Layout#isFontPaddingIncluded(): - New API must be flagged with @FlaggedApi: method android.text.Layout.isFontPaddingIncluded() -UnflaggedApi: android.text.Layout.Builder: - New API must be flagged with @FlaggedApi: class android.text.Layout.Builder UnflaggedApi: android.text.Layout.Builder#Builder(CharSequence, int, int, android.text.TextPaint, int): New API must be flagged with @FlaggedApi: constructor android.text.Layout.Builder(CharSequence,int,int,android.text.TextPaint,int) UnflaggedApi: android.text.Layout.Builder#build(): @@ -429,24 +387,12 @@ UnflaggedApi: android.text.Layout.Builder#setRightIndents(int[]): New API must be flagged with @FlaggedApi: method android.text.Layout.Builder.setRightIndents(int[]) UnflaggedApi: android.text.Layout.Builder#setTextDirectionHeuristic(android.text.TextDirectionHeuristic): New API must be flagged with @FlaggedApi: method android.text.Layout.Builder.setTextDirectionHeuristic(android.text.TextDirectionHeuristic) -UnflaggedApi: android.text.Layout.Builder#setUseBoundsForWidth(boolean): - New API must be flagged with @FlaggedApi: method android.text.Layout.Builder.setUseBoundsForWidth(boolean) -UnflaggedApi: android.text.StaticLayout#computeDrawingBoundingBox(): - New API must be flagged with @FlaggedApi: method android.text.StaticLayout.computeDrawingBoundingBox() UnflaggedApi: android.text.StaticLayout.Builder#setUseBoundsForWidth(boolean): New API must be flagged with @FlaggedApi: method android.text.StaticLayout.Builder.setUseBoundsForWidth(boolean) -UnflaggedApi: android.text.style.LineBreakConfigSpan: - New API must be flagged with @FlaggedApi: class android.text.style.LineBreakConfigSpan UnflaggedApi: android.text.style.LineBreakConfigSpan#LineBreakConfigSpan(android.graphics.text.LineBreakConfig): New API must be flagged with @FlaggedApi: constructor android.text.style.LineBreakConfigSpan(android.graphics.text.LineBreakConfig) -UnflaggedApi: android.text.style.LineBreakConfigSpan#equals(Object): - New API must be flagged with @FlaggedApi: method android.text.style.LineBreakConfigSpan.equals(Object) UnflaggedApi: android.text.style.LineBreakConfigSpan#getLineBreakConfig(): New API must be flagged with @FlaggedApi: method android.text.style.LineBreakConfigSpan.getLineBreakConfig() -UnflaggedApi: android.text.style.LineBreakConfigSpan#hashCode(): - New API must be flagged with @FlaggedApi: method android.text.style.LineBreakConfigSpan.hashCode() -UnflaggedApi: android.text.style.LineBreakConfigSpan#toString(): - New API must be flagged with @FlaggedApi: method android.text.style.LineBreakConfigSpan.toString() UnflaggedApi: android.view.HapticScrollFeedbackProvider#HapticScrollFeedbackProvider(android.view.View): New API must be flagged with @FlaggedApi: constructor android.view.HapticScrollFeedbackProvider(android.view.View) UnflaggedApi: android.view.HapticScrollFeedbackProvider#onScrollLimit(int, int, int, boolean): @@ -455,16 +401,10 @@ UnflaggedApi: android.view.HapticScrollFeedbackProvider#onScrollProgress(int, in New API must be flagged with @FlaggedApi: method android.view.HapticScrollFeedbackProvider.onScrollProgress(int,int,int,int) UnflaggedApi: android.view.HapticScrollFeedbackProvider#onSnapToItem(int, int, int): New API must be flagged with @FlaggedApi: method android.view.HapticScrollFeedbackProvider.onSnapToItem(int,int,int) -UnflaggedApi: android.view.ScrollFeedbackProvider#onScrollLimit(android.view.MotionEvent, int, boolean): - New API must be flagged with @FlaggedApi: method android.view.ScrollFeedbackProvider.onScrollLimit(android.view.MotionEvent,int,boolean) UnflaggedApi: android.view.ScrollFeedbackProvider#onScrollLimit(int, int, int, boolean): New API must be flagged with @FlaggedApi: method android.view.ScrollFeedbackProvider.onScrollLimit(int,int,int,boolean) -UnflaggedApi: android.view.ScrollFeedbackProvider#onScrollProgress(android.view.MotionEvent, int, int): - New API must be flagged with @FlaggedApi: method android.view.ScrollFeedbackProvider.onScrollProgress(android.view.MotionEvent,int,int) UnflaggedApi: android.view.ScrollFeedbackProvider#onScrollProgress(int, int, int, int): New API must be flagged with @FlaggedApi: method android.view.ScrollFeedbackProvider.onScrollProgress(int,int,int,int) -UnflaggedApi: android.view.ScrollFeedbackProvider#onSnapToItem(android.view.MotionEvent, int): - New API must be flagged with @FlaggedApi: method android.view.ScrollFeedbackProvider.onSnapToItem(android.view.MotionEvent,int) UnflaggedApi: android.view.ScrollFeedbackProvider#onSnapToItem(int, int, int): New API must be flagged with @FlaggedApi: method android.view.ScrollFeedbackProvider.onSnapToItem(int,int,int) UnflaggedApi: android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_SCROLL_AMOUNT_FLOAT: @@ -515,7 +455,3 @@ UnflaggedApi: android.view.inputmethod.InlineSuggestionsRequest.Builder#setClien New API must be flagged with @FlaggedApi: method android.view.inputmethod.InlineSuggestionsRequest.Builder.setClientSupported(boolean) UnflaggedApi: android.view.inputmethod.InlineSuggestionsRequest.Builder#setServiceSupported(boolean): New API must be flagged with @FlaggedApi: method android.view.inputmethod.InlineSuggestionsRequest.Builder.setServiceSupported(boolean) -UnflaggedApi: android.widget.TextView#getUseBoundsForWidth(): - New API must be flagged with @FlaggedApi: method android.widget.TextView.getUseBoundsForWidth() -UnflaggedApi: android.widget.TextView#setUseBoundsForWidth(boolean): - New API must be flagged with @FlaggedApi: method android.widget.TextView.setUseBoundsForWidth(boolean) diff --git a/core/api/module-lib-lint-baseline.txt b/core/api/module-lib-lint-baseline.txt index a0d38588bc10..163383515548 100644 --- a/core/api/module-lib-lint-baseline.txt +++ b/core/api/module-lib-lint-baseline.txt @@ -35,26 +35,8 @@ SamShouldBeLast: android.media.session.MediaSessionManager#setOnMediaKeyListener SAM-compatible parameters (such as parameter 1, "listener", in android.media.session.MediaSessionManager.setOnMediaKeyListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.session.MediaSessionManager#setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, android.os.Handler): SAM-compatible parameters (such as parameter 1, "listener", in android.media.session.MediaSessionManager.setOnVolumeKeyLongPressListener) 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.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 -UnflaggedApi: android.Manifest.permission#BLUETOOTH_STACK: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BLUETOOTH_STACK -UnflaggedApi: android.Manifest.permission#CONTROL_AUTOMOTIVE_GNSS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONTROL_AUTOMOTIVE_GNSS -UnflaggedApi: android.Manifest.permission#GET_INTENT_SENDER_INTENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.GET_INTENT_SENDER_INTENT -UnflaggedApi: android.Manifest.permission#MAKE_UID_VISIBLE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MAKE_UID_VISIBLE UnflaggedApi: android.Manifest.permission#MANAGE_REMOTE_AUTH: New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_REMOTE_AUTH UnflaggedApi: android.Manifest.permission#USE_COMPANION_TRANSPORTS: @@ -89,13 +71,7 @@ UnflaggedApi: android.companion.CompanionDeviceManager.OnTransportsChangedListen New API must be flagged with @FlaggedApi: method android.companion.CompanionDeviceManager.OnTransportsChangedListener.onTransportsChanged(java.util.List<android.companion.AssociationInfo>) UnflaggedApi: android.content.Context#REMOTE_AUTH_SERVICE: New API must be flagged with @FlaggedApi: field android.content.Context.REMOTE_AUTH_SERVICE -UnflaggedApi: android.content.ContextWrapper#createContextForSdkInSandbox(android.content.pm.ApplicationInfo, int): - New API must be flagged with @FlaggedApi: method android.content.ContextWrapper.createContextForSdkInSandbox(android.content.pm.ApplicationInfo,int) -UnflaggedApi: android.media.session.MediaController.PlaybackInfo#PlaybackInfo(int, int, int, int, android.media.AudioAttributes, String): - New API must be flagged with @FlaggedApi: constructor android.media.session.MediaController.PlaybackInfo(int,int,int,int,android.media.AudioAttributes,String) UnflaggedApi: android.os.IpcDataCache#MODULE_TELEPHONY: New API must be flagged with @FlaggedApi: field android.os.IpcDataCache.MODULE_TELEPHONY -UnflaggedApi: android.provider.ContactsContract.RawContactsEntity#queryRawContactEntity(android.content.ContentResolver, long): - New API must be flagged with @FlaggedApi: method android.provider.ContactsContract.RawContactsEntity.queryRawContactEntity(android.content.ContentResolver,long) UnflaggedApi: android.provider.Settings.Config#getAllStrings(): New API must be flagged with @FlaggedApi: method android.provider.Settings.Config.getAllStrings() diff --git a/core/api/system-lint-baseline.txt b/core/api/system-lint-baseline.txt index d62bea86bd06..ee031db50b62 100644 --- a/core/api/system-lint-baseline.txt +++ b/core/api/system-lint-baseline.txt @@ -21,28 +21,10 @@ ListenerLast: android.telephony.satellite.SatelliteManager#stopSatelliteTransmis Listeners should always be at end of argument list (method `stopSatelliteTransmissionUpdates`) -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): - android.telephony.mbms.DownloadRequest does not declare a `getServiceId()` method matching method android.telephony.mbms.DownloadRequest.Builder.setServiceId(String) - - 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: @@ -61,10 +43,6 @@ MissingNullability: android.telephony.NetworkService#onUnbind(android.content.In 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: - Missing nullability on parameter `serviceId` in method `setServiceId` ProtectedMember: android.printservice.recommendation.RecommendationService#attachBaseContext(android.content.Context): @@ -173,12 +151,6 @@ SamShouldBeLast: android.nfc.NfcAdapter#enableReaderMode(android.app.Activity, a 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): @@ -225,1350 +197,32 @@ SamShouldBeLast: android.webkit.WebChromeClient#onShowFileChooser(android.webkit 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 -UnflaggedApi: android.Manifest.permission#ACCESS_AMBIENT_CONTEXT_EVENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT -UnflaggedApi: android.Manifest.permission#ACCESS_AMBIENT_LIGHT_STATS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_AMBIENT_LIGHT_STATS -UnflaggedApi: android.Manifest.permission#ACCESS_BROADCAST_RADIO: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_BROADCAST_RADIO -UnflaggedApi: android.Manifest.permission#ACCESS_BROADCAST_RESPONSE_STATS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_BROADCAST_RESPONSE_STATS -UnflaggedApi: android.Manifest.permission#ACCESS_CACHE_FILESYSTEM: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_CACHE_FILESYSTEM -UnflaggedApi: android.Manifest.permission#ACCESS_CONTEXT_HUB: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_CONTEXT_HUB -UnflaggedApi: android.Manifest.permission#ACCESS_DRM_CERTIFICATES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_DRM_CERTIFICATES -UnflaggedApi: android.Manifest.permission#ACCESS_FPS_COUNTER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_FPS_COUNTER -UnflaggedApi: android.Manifest.permission#ACCESS_INSTANT_APPS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_INSTANT_APPS -UnflaggedApi: android.Manifest.permission#ACCESS_LOCUS_ID_USAGE_STATS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_LOCUS_ID_USAGE_STATS -UnflaggedApi: android.Manifest.permission#ACCESS_MOCK_LOCATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_MOCK_LOCATION -UnflaggedApi: android.Manifest.permission#ACCESS_MTP: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_MTP -UnflaggedApi: android.Manifest.permission#ACCESS_NETWORK_CONDITIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_NETWORK_CONDITIONS -UnflaggedApi: android.Manifest.permission#ACCESS_NOTIFICATIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_NOTIFICATIONS -UnflaggedApi: android.Manifest.permission#ACCESS_PDB_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_PDB_STATE -UnflaggedApi: android.Manifest.permission#ACCESS_RCS_USER_CAPABILITY_EXCHANGE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_RCS_USER_CAPABILITY_EXCHANGE -UnflaggedApi: android.Manifest.permission#ACCESS_SHARED_LIBRARIES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_SHARED_LIBRARIES -UnflaggedApi: android.Manifest.permission#ACCESS_SHORTCUTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_SHORTCUTS UnflaggedApi: android.Manifest.permission#ACCESS_SMARTSPACE: New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_SMARTSPACE -UnflaggedApi: android.Manifest.permission#ACCESS_SURFACE_FLINGER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_SURFACE_FLINGER -UnflaggedApi: android.Manifest.permission#ACCESS_TUNED_INFO: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_TUNED_INFO -UnflaggedApi: android.Manifest.permission#ACCESS_TV_DESCRAMBLER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_TV_DESCRAMBLER -UnflaggedApi: android.Manifest.permission#ACCESS_TV_SHARED_FILTER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_TV_SHARED_FILTER -UnflaggedApi: android.Manifest.permission#ACCESS_TV_TUNER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_TV_TUNER -UnflaggedApi: android.Manifest.permission#ACCESS_ULTRASOUND: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_ULTRASOUND -UnflaggedApi: android.Manifest.permission#ACCESS_VIBRATOR_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESS_VIBRATOR_STATE -UnflaggedApi: android.Manifest.permission#ACTIVITY_EMBEDDING: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACTIVITY_EMBEDDING -UnflaggedApi: android.Manifest.permission#ADD_ALWAYS_UNLOCKED_DISPLAY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY -UnflaggedApi: android.Manifest.permission#ADD_TRUSTED_DISPLAY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ADD_TRUSTED_DISPLAY -UnflaggedApi: android.Manifest.permission#ADJUST_RUNTIME_PERMISSIONS_POLICY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY -UnflaggedApi: android.Manifest.permission#ALLOCATE_AGGRESSIVE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ALLOCATE_AGGRESSIVE -UnflaggedApi: android.Manifest.permission#ALLOW_ANY_CODEC_FOR_PLAYBACK: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK -UnflaggedApi: android.Manifest.permission#ALLOW_PLACE_IN_MULTI_PANE_SETTINGS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ALLOW_PLACE_IN_MULTI_PANE_SETTINGS -UnflaggedApi: android.Manifest.permission#ALLOW_SLIPPERY_TOUCHES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES UnflaggedApi: android.Manifest.permission#ALWAYS_UPDATE_WALLPAPER: New API must be flagged with @FlaggedApi: field android.Manifest.permission.ALWAYS_UPDATE_WALLPAPER -UnflaggedApi: android.Manifest.permission#AMBIENT_WALLPAPER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.AMBIENT_WALLPAPER -UnflaggedApi: android.Manifest.permission#APPROVE_INCIDENT_REPORTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.APPROVE_INCIDENT_REPORTS -UnflaggedApi: android.Manifest.permission#ASSOCIATE_COMPANION_DEVICES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ASSOCIATE_COMPANION_DEVICES -UnflaggedApi: android.Manifest.permission#BACKGROUND_CAMERA: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BACKGROUND_CAMERA -UnflaggedApi: android.Manifest.permission#BACKUP: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BACKUP -UnflaggedApi: android.Manifest.permission#BATTERY_PREDICTION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BATTERY_PREDICTION -UnflaggedApi: android.Manifest.permission#BIND_AMBIENT_CONTEXT_DETECTION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_AMBIENT_CONTEXT_DETECTION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_ATTENTION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_ATTENTION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_AUGMENTED_AUTOFILL_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_AUGMENTED_AUTOFILL_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_CALL_DIAGNOSTIC_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_CALL_DIAGNOSTIC_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_CALL_STREAMING_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_CALL_STREAMING_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_CELL_BROADCAST_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_CELL_BROADCAST_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_CONTENT_CAPTURE_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_CONTENT_CAPTURE_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_CONTENT_SUGGESTIONS_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_CONTENT_SUGGESTIONS_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_DIRECTORY_SEARCH: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_DIRECTORY_SEARCH -UnflaggedApi: android.Manifest.permission#BIND_DISPLAY_HASHING_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_DISPLAY_HASHING_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_DOMAIN_VERIFICATION_AGENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_DOMAIN_VERIFICATION_AGENT -UnflaggedApi: android.Manifest.permission#BIND_EUICC_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_EUICC_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_EXTERNAL_STORAGE_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_EXTERNAL_STORAGE_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_FIELD_CLASSIFICATION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_FIELD_CLASSIFICATION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_GBA_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_GBA_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_HOTWORD_DETECTION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_HOTWORD_DETECTION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_IMS_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_IMS_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_KEYGUARD_APPWIDGET: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_KEYGUARD_APPWIDGET -UnflaggedApi: android.Manifest.permission#BIND_MUSIC_RECOGNITION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_MUSIC_RECOGNITION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_NETWORK_RECOMMENDATION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_NETWORK_RECOMMENDATION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_NOTIFICATION_ASSISTANT_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_PRINT_RECOMMENDATION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_PRINT_RECOMMENDATION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_REMOTE_LOCKSCREEN_VALIDATION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_REMOTE_LOCKSCREEN_VALIDATION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_RESOLVER_RANKER_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_RESOLVER_RANKER_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_RESUME_ON_REBOOT_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_RESUME_ON_REBOOT_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_ROTATION_RESOLVER_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_ROTATION_RESOLVER_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_SATELLITE_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_SATELLITE_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_SETTINGS_SUGGESTIONS_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_SOUND_TRIGGER_DETECTION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_SOUND_TRIGGER_DETECTION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_TELEPHONY_DATA_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_TELEPHONY_DATA_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_TELEPHONY_NETWORK_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_TELEPHONY_NETWORK_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_TEXTCLASSIFIER_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_TEXTCLASSIFIER_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_TIME_ZONE_PROVIDER_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_TIME_ZONE_PROVIDER_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_TRACE_REPORT_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_TRACE_REPORT_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_TRANSLATION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_TRANSLATION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_TRUST_AGENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_TRUST_AGENT -UnflaggedApi: android.Manifest.permission#BIND_TV_REMOTE_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_TV_REMOTE_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_VISUAL_QUERY_DETECTION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_VISUAL_QUERY_DETECTION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_WALLPAPER_EFFECTS_GENERATION_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_WALLPAPER_EFFECTS_GENERATION_SERVICE -UnflaggedApi: android.Manifest.permission#BIND_WEARABLE_SENSING_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BIND_WEARABLE_SENSING_SERVICE -UnflaggedApi: android.Manifest.permission#BLUETOOTH_MAP: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BLUETOOTH_MAP -UnflaggedApi: android.Manifest.permission#BRICK: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BRICK -UnflaggedApi: android.Manifest.permission#BRIGHTNESS_SLIDER_USAGE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BRIGHTNESS_SLIDER_USAGE -UnflaggedApi: android.Manifest.permission#BROADCAST_CLOSE_SYSTEM_DIALOGS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS -UnflaggedApi: android.Manifest.permission#BYPASS_ROLE_QUALIFICATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.BYPASS_ROLE_QUALIFICATION -UnflaggedApi: android.Manifest.permission#CALL_AUDIO_INTERCEPTION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CALL_AUDIO_INTERCEPTION -UnflaggedApi: android.Manifest.permission#CAMERA_DISABLE_TRANSMIT_LED: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CAMERA_DISABLE_TRANSMIT_LED -UnflaggedApi: android.Manifest.permission#CAMERA_OPEN_CLOSE_LISTENER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CAMERA_OPEN_CLOSE_LISTENER -UnflaggedApi: android.Manifest.permission#CAPTURE_AUDIO_HOTWORD: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CAPTURE_AUDIO_HOTWORD -UnflaggedApi: android.Manifest.permission#CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD -UnflaggedApi: android.Manifest.permission#CAPTURE_MEDIA_OUTPUT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CAPTURE_MEDIA_OUTPUT -UnflaggedApi: android.Manifest.permission#CAPTURE_TUNER_AUDIO_INPUT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CAPTURE_TUNER_AUDIO_INPUT -UnflaggedApi: android.Manifest.permission#CAPTURE_TV_INPUT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CAPTURE_TV_INPUT -UnflaggedApi: android.Manifest.permission#CAPTURE_VOICE_COMMUNICATION_OUTPUT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT -UnflaggedApi: android.Manifest.permission#CHANGE_APP_IDLE_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CHANGE_APP_IDLE_STATE -UnflaggedApi: android.Manifest.permission#CHANGE_APP_LAUNCH_TIME_ESTIMATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CHANGE_APP_LAUNCH_TIME_ESTIMATE -UnflaggedApi: android.Manifest.permission#CHANGE_DEVICE_IDLE_TEMP_WHITELIST: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST -UnflaggedApi: android.Manifest.permission#CHECK_REMOTE_LOCKSCREEN: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CHECK_REMOTE_LOCKSCREEN -UnflaggedApi: android.Manifest.permission#CLEAR_APP_USER_DATA: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CLEAR_APP_USER_DATA -UnflaggedApi: android.Manifest.permission#COMPANION_APPROVE_WIFI_CONNECTIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.COMPANION_APPROVE_WIFI_CONNECTIONS -UnflaggedApi: android.Manifest.permission#CONFIGURE_DISPLAY_BRIGHTNESS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS -UnflaggedApi: android.Manifest.permission#CONFIGURE_INTERACT_ACROSS_PROFILES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONFIGURE_INTERACT_ACROSS_PROFILES -UnflaggedApi: android.Manifest.permission#CONNECTIVITY_USE_RESTRICTED_NETWORKS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS -UnflaggedApi: android.Manifest.permission#CONTROL_DEVICE_LIGHTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONTROL_DEVICE_LIGHTS -UnflaggedApi: android.Manifest.permission#CONTROL_DISPLAY_COLOR_TRANSFORMS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS -UnflaggedApi: android.Manifest.permission#CONTROL_DISPLAY_SATURATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONTROL_DISPLAY_SATURATION -UnflaggedApi: android.Manifest.permission#CONTROL_INCALL_EXPERIENCE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONTROL_INCALL_EXPERIENCE -UnflaggedApi: android.Manifest.permission#CONTROL_KEYGUARD_SECURE_NOTIFICATIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS -UnflaggedApi: android.Manifest.permission#CONTROL_OEM_PAID_NETWORK_PREFERENCE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONTROL_OEM_PAID_NETWORK_PREFERENCE -UnflaggedApi: android.Manifest.permission#CONTROL_VPN: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CONTROL_VPN -UnflaggedApi: android.Manifest.permission#CREATE_USERS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CREATE_USERS -UnflaggedApi: android.Manifest.permission#CREATE_VIRTUAL_DEVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CREATE_VIRTUAL_DEVICE -UnflaggedApi: android.Manifest.permission#CRYPT_KEEPER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.CRYPT_KEEPER -UnflaggedApi: android.Manifest.permission#DEVICE_POWER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.DEVICE_POWER -UnflaggedApi: android.Manifest.permission#DISABLE_SYSTEM_SOUND_EFFECTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.DISABLE_SYSTEM_SOUND_EFFECTS -UnflaggedApi: android.Manifest.permission#DISPATCH_PROVISIONING_MESSAGE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.DISPATCH_PROVISIONING_MESSAGE -UnflaggedApi: android.Manifest.permission#DOMAIN_VERIFICATION_AGENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.DOMAIN_VERIFICATION_AGENT -UnflaggedApi: android.Manifest.permission#ENTER_CAR_MODE_PRIORITIZED: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ENTER_CAR_MODE_PRIORITIZED -UnflaggedApi: android.Manifest.permission#EXEMPT_FROM_AUDIO_RECORD_RESTRICTIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.EXEMPT_FROM_AUDIO_RECORD_RESTRICTIONS -UnflaggedApi: android.Manifest.permission#FORCE_BACK: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.FORCE_BACK -UnflaggedApi: android.Manifest.permission#FORCE_STOP_PACKAGES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.FORCE_STOP_PACKAGES -UnflaggedApi: android.Manifest.permission#GET_APP_METADATA: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.GET_APP_METADATA -UnflaggedApi: android.Manifest.permission#GET_APP_OPS_STATS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.GET_APP_OPS_STATS -UnflaggedApi: android.Manifest.permission#GET_HISTORICAL_APP_OPS_STATS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.GET_HISTORICAL_APP_OPS_STATS -UnflaggedApi: android.Manifest.permission#GET_PROCESS_STATE_AND_OOM_SCORE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.GET_PROCESS_STATE_AND_OOM_SCORE -UnflaggedApi: android.Manifest.permission#GET_RUNTIME_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.GET_RUNTIME_PERMISSIONS -UnflaggedApi: android.Manifest.permission#GET_TOP_ACTIVITY_INFO: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.GET_TOP_ACTIVITY_INFO -UnflaggedApi: android.Manifest.permission#GRANT_RUNTIME_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS -UnflaggedApi: android.Manifest.permission#GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS -UnflaggedApi: android.Manifest.permission#HANDLE_CAR_MODE_CHANGES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.HANDLE_CAR_MODE_CHANGES -UnflaggedApi: android.Manifest.permission#HARDWARE_TEST: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.HARDWARE_TEST -UnflaggedApi: android.Manifest.permission#HDMI_CEC: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.HDMI_CEC -UnflaggedApi: android.Manifest.permission#INJECT_EVENTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INJECT_EVENTS -UnflaggedApi: android.Manifest.permission#INSTALL_DPC_PACKAGES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INSTALL_DPC_PACKAGES -UnflaggedApi: android.Manifest.permission#INSTALL_DYNAMIC_SYSTEM: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM -UnflaggedApi: android.Manifest.permission#INSTALL_EXISTING_PACKAGES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INSTALL_EXISTING_PACKAGES -UnflaggedApi: android.Manifest.permission#INSTALL_GRANT_RUNTIME_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS -UnflaggedApi: android.Manifest.permission#INSTALL_LOCATION_TIME_ZONE_PROVIDER_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INSTALL_LOCATION_TIME_ZONE_PROVIDER_SERVICE -UnflaggedApi: android.Manifest.permission#INSTALL_PACKAGE_UPDATES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INSTALL_PACKAGE_UPDATES -UnflaggedApi: android.Manifest.permission#INSTALL_SELF_UPDATES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INSTALL_SELF_UPDATES -UnflaggedApi: android.Manifest.permission#INTENT_FILTER_VERIFICATION_AGENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT -UnflaggedApi: android.Manifest.permission#INTERACT_ACROSS_USERS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INTERACT_ACROSS_USERS -UnflaggedApi: android.Manifest.permission#INTERACT_ACROSS_USERS_FULL: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INTERACT_ACROSS_USERS_FULL -UnflaggedApi: android.Manifest.permission#INTERNAL_SYSTEM_WINDOW: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INTERNAL_SYSTEM_WINDOW -UnflaggedApi: android.Manifest.permission#INVOKE_CARRIER_SETUP: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.INVOKE_CARRIER_SETUP -UnflaggedApi: android.Manifest.permission#KILL_ALL_BACKGROUND_PROCESSES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.KILL_ALL_BACKGROUND_PROCESSES -UnflaggedApi: android.Manifest.permission#KILL_UID: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.KILL_UID -UnflaggedApi: android.Manifest.permission#LAUNCH_DEVICE_MANAGER_SETUP: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.LAUNCH_DEVICE_MANAGER_SETUP +UnflaggedApi: android.Manifest.permission#CAMERA_HEADLESS_SYSTEM_USER: + New API must be flagged with @FlaggedApi: field android.Manifest.permission.CAMERA_HEADLESS_SYSTEM_USER UnflaggedApi: android.Manifest.permission#LAUNCH_PERMISSION_SETTINGS: New API must be flagged with @FlaggedApi: field android.Manifest.permission.LAUNCH_PERMISSION_SETTINGS -UnflaggedApi: android.Manifest.permission#LOCAL_MAC_ADDRESS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.LOCAL_MAC_ADDRESS -UnflaggedApi: android.Manifest.permission#LOCATION_BYPASS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.LOCATION_BYPASS -UnflaggedApi: android.Manifest.permission#LOCK_DEVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.LOCK_DEVICE -UnflaggedApi: android.Manifest.permission#LOG_FOREGROUND_RESOURCE_USE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.LOG_FOREGROUND_RESOURCE_USE -UnflaggedApi: android.Manifest.permission#LOOP_RADIO: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.LOOP_RADIO -UnflaggedApi: android.Manifest.permission#MANAGE_ACCESSIBILITY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_ACCESSIBILITY -UnflaggedApi: android.Manifest.permission#MANAGE_ACTIVITY_TASKS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_ACTIVITY_TASKS -UnflaggedApi: android.Manifest.permission#MANAGE_APP_HIBERNATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_APP_HIBERNATION -UnflaggedApi: android.Manifest.permission#MANAGE_APP_OPS_RESTRICTIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_APP_OPS_RESTRICTIONS -UnflaggedApi: android.Manifest.permission#MANAGE_APP_PREDICTIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_APP_PREDICTIONS -UnflaggedApi: android.Manifest.permission#MANAGE_APP_TOKENS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_APP_TOKENS -UnflaggedApi: android.Manifest.permission#MANAGE_AUTO_FILL: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_AUTO_FILL -UnflaggedApi: android.Manifest.permission#MANAGE_BLUETOOTH_WHEN_WIRELESS_CONSENT_REQUIRED: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_BLUETOOTH_WHEN_WIRELESS_CONSENT_REQUIRED -UnflaggedApi: android.Manifest.permission#MANAGE_CARRIER_OEM_UNLOCK_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE -UnflaggedApi: android.Manifest.permission#MANAGE_CA_CERTIFICATES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_CA_CERTIFICATES -UnflaggedApi: android.Manifest.permission#MANAGE_CLIPBOARD_ACCESS_NOTIFICATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_CLIPBOARD_ACCESS_NOTIFICATION -UnflaggedApi: android.Manifest.permission#MANAGE_CLOUDSEARCH: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_CLOUDSEARCH -UnflaggedApi: android.Manifest.permission#MANAGE_CONTENT_CAPTURE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_CONTENT_CAPTURE -UnflaggedApi: android.Manifest.permission#MANAGE_CONTENT_SUGGESTIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_CONTENT_SUGGESTIONS -UnflaggedApi: android.Manifest.permission#MANAGE_DEBUGGING: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_DEBUGGING -UnflaggedApi: android.Manifest.permission#MANAGE_DEFAULT_APPLICATIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_DEFAULT_APPLICATIONS -UnflaggedApi: android.Manifest.permission#MANAGE_DEVICE_ADMINS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_DEVICE_ADMINS -UnflaggedApi: android.Manifest.permission#MANAGE_DEVICE_POLICY_APP_EXEMPTIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_DEVICE_POLICY_APP_EXEMPTIONS -UnflaggedApi: android.Manifest.permission#MANAGE_ETHERNET_NETWORKS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_ETHERNET_NETWORKS -UnflaggedApi: android.Manifest.permission#MANAGE_FACTORY_RESET_PROTECTION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_FACTORY_RESET_PROTECTION -UnflaggedApi: android.Manifest.permission#MANAGE_GAME_ACTIVITY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_GAME_ACTIVITY -UnflaggedApi: android.Manifest.permission#MANAGE_GAME_MODE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_GAME_MODE -UnflaggedApi: android.Manifest.permission#MANAGE_HOTWORD_DETECTION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_HOTWORD_DETECTION -UnflaggedApi: android.Manifest.permission#MANAGE_IPSEC_TUNNELS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_IPSEC_TUNNELS -UnflaggedApi: android.Manifest.permission#MANAGE_LOW_POWER_STANDBY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_LOW_POWER_STANDBY -UnflaggedApi: android.Manifest.permission#MANAGE_MUSIC_RECOGNITION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_MUSIC_RECOGNITION -UnflaggedApi: android.Manifest.permission#MANAGE_NOTIFICATION_LISTENERS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS -UnflaggedApi: android.Manifest.permission#MANAGE_ONE_TIME_PERMISSION_SESSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS -UnflaggedApi: android.Manifest.permission#MANAGE_PROFILE_AND_DEVICE_OWNERS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS -UnflaggedApi: android.Manifest.permission#MANAGE_ROLE_HOLDERS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_ROLE_HOLDERS -UnflaggedApi: android.Manifest.permission#MANAGE_ROLLBACKS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_ROLLBACKS -UnflaggedApi: android.Manifest.permission#MANAGE_ROTATION_RESOLVER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_ROTATION_RESOLVER -UnflaggedApi: android.Manifest.permission#MANAGE_SAFETY_CENTER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_SAFETY_CENTER -UnflaggedApi: android.Manifest.permission#MANAGE_SEARCH_UI: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_SEARCH_UI -UnflaggedApi: android.Manifest.permission#MANAGE_SENSOR_PRIVACY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_SENSOR_PRIVACY -UnflaggedApi: android.Manifest.permission#MANAGE_SMARTSPACE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_SMARTSPACE -UnflaggedApi: android.Manifest.permission#MANAGE_SOUND_TRIGGER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_SOUND_TRIGGER -UnflaggedApi: android.Manifest.permission#MANAGE_SPEECH_RECOGNITION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_SPEECH_RECOGNITION -UnflaggedApi: android.Manifest.permission#MANAGE_SUBSCRIPTION_PLANS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_SUBSCRIPTION_PLANS -UnflaggedApi: android.Manifest.permission#MANAGE_SUBSCRIPTION_USER_ASSOCIATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_SUBSCRIPTION_USER_ASSOCIATION -UnflaggedApi: android.Manifest.permission#MANAGE_TEST_NETWORKS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_TEST_NETWORKS -UnflaggedApi: android.Manifest.permission#MANAGE_TIME_AND_ZONE_DETECTION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION -UnflaggedApi: android.Manifest.permission#MANAGE_UI_TRANSLATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_UI_TRANSLATION -UnflaggedApi: android.Manifest.permission#MANAGE_USB: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_USB -UnflaggedApi: android.Manifest.permission#MANAGE_USERS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_USERS -UnflaggedApi: android.Manifest.permission#MANAGE_USER_OEM_UNLOCK_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_USER_OEM_UNLOCK_STATE -UnflaggedApi: android.Manifest.permission#MANAGE_WALLPAPER_EFFECTS_GENERATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_WALLPAPER_EFFECTS_GENERATION -UnflaggedApi: android.Manifest.permission#MANAGE_WEAK_ESCROW_TOKEN: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_WEAK_ESCROW_TOKEN -UnflaggedApi: android.Manifest.permission#MANAGE_WEARABLE_SENSING_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE -UnflaggedApi: android.Manifest.permission#MANAGE_WIFI_COUNTRY_CODE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_WIFI_COUNTRY_CODE -UnflaggedApi: android.Manifest.permission#MARK_DEVICE_ORGANIZATION_OWNED: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MARK_DEVICE_ORGANIZATION_OWNED -UnflaggedApi: android.Manifest.permission#MEDIA_RESOURCE_OVERRIDE_PID: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MEDIA_RESOURCE_OVERRIDE_PID -UnflaggedApi: android.Manifest.permission#MIGRATE_HEALTH_CONNECT_DATA: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MIGRATE_HEALTH_CONNECT_DATA -UnflaggedApi: android.Manifest.permission#MODIFY_APPWIDGET_BIND_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS -UnflaggedApi: android.Manifest.permission#MODIFY_AUDIO_ROUTING: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MODIFY_AUDIO_ROUTING -UnflaggedApi: android.Manifest.permission#MODIFY_AUDIO_SETTINGS_PRIVILEGED: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED -UnflaggedApi: android.Manifest.permission#MODIFY_CELL_BROADCASTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MODIFY_CELL_BROADCASTS -UnflaggedApi: android.Manifest.permission#MODIFY_DAY_NIGHT_MODE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MODIFY_DAY_NIGHT_MODE -UnflaggedApi: android.Manifest.permission#MODIFY_PARENTAL_CONTROLS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MODIFY_PARENTAL_CONTROLS -UnflaggedApi: android.Manifest.permission#MODIFY_QUIET_MODE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MODIFY_QUIET_MODE -UnflaggedApi: android.Manifest.permission#MODIFY_SETTINGS_OVERRIDEABLE_BY_RESTORE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MODIFY_SETTINGS_OVERRIDEABLE_BY_RESTORE -UnflaggedApi: android.Manifest.permission#MONITOR_DEVICE_CONFIG_ACCESS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MONITOR_DEVICE_CONFIG_ACCESS -UnflaggedApi: android.Manifest.permission#MOVE_PACKAGE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.MOVE_PACKAGE -UnflaggedApi: android.Manifest.permission#NETWORK_AIRPLANE_MODE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_AIRPLANE_MODE -UnflaggedApi: android.Manifest.permission#NETWORK_CARRIER_PROVISIONING: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_CARRIER_PROVISIONING -UnflaggedApi: android.Manifest.permission#NETWORK_FACTORY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_FACTORY -UnflaggedApi: android.Manifest.permission#NETWORK_MANAGED_PROVISIONING: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_MANAGED_PROVISIONING -UnflaggedApi: android.Manifest.permission#NETWORK_SCAN: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_SCAN -UnflaggedApi: android.Manifest.permission#NETWORK_SETTINGS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_SETTINGS -UnflaggedApi: android.Manifest.permission#NETWORK_SETUP_WIZARD: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_SETUP_WIZARD -UnflaggedApi: android.Manifest.permission#NETWORK_SIGNAL_STRENGTH_WAKEUP: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP -UnflaggedApi: android.Manifest.permission#NETWORK_STACK: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_STACK -UnflaggedApi: android.Manifest.permission#NETWORK_STATS_PROVIDER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NETWORK_STATS_PROVIDER -UnflaggedApi: android.Manifest.permission#NFC_SET_CONTROLLER_ALWAYS_ON: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON -UnflaggedApi: android.Manifest.permission#NOTIFICATION_DURING_SETUP: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NOTIFICATION_DURING_SETUP -UnflaggedApi: android.Manifest.permission#NOTIFY_TV_INPUTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.NOTIFY_TV_INPUTS -UnflaggedApi: android.Manifest.permission#OBSERVE_APP_USAGE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.OBSERVE_APP_USAGE -UnflaggedApi: android.Manifest.permission#OBSERVE_NETWORK_POLICY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.OBSERVE_NETWORK_POLICY -UnflaggedApi: android.Manifest.permission#OBSERVE_ROLE_HOLDERS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.OBSERVE_ROLE_HOLDERS -UnflaggedApi: android.Manifest.permission#OBSERVE_SENSOR_PRIVACY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.OBSERVE_SENSOR_PRIVACY -UnflaggedApi: android.Manifest.permission#OPEN_ACCESSIBILITY_DETAILS_SETTINGS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS -UnflaggedApi: android.Manifest.permission#OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD -UnflaggedApi: android.Manifest.permission#PACKAGE_VERIFICATION_AGENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PACKAGE_VERIFICATION_AGENT -UnflaggedApi: android.Manifest.permission#PACKET_KEEPALIVE_OFFLOAD: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD -UnflaggedApi: android.Manifest.permission#PEERS_MAC_ADDRESS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PEERS_MAC_ADDRESS -UnflaggedApi: android.Manifest.permission#PERFORM_CDMA_PROVISIONING: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PERFORM_CDMA_PROVISIONING -UnflaggedApi: android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION -UnflaggedApi: android.Manifest.permission#PERFORM_SIM_ACTIVATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PERFORM_SIM_ACTIVATION -UnflaggedApi: android.Manifest.permission#POWER_SAVER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.POWER_SAVER -UnflaggedApi: android.Manifest.permission#PROVIDE_DEFAULT_ENABLED_CREDENTIAL_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PROVIDE_DEFAULT_ENABLED_CREDENTIAL_SERVICE -UnflaggedApi: android.Manifest.permission#PROVIDE_RESOLVER_RANKER_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PROVIDE_RESOLVER_RANKER_SERVICE -UnflaggedApi: android.Manifest.permission#PROVIDE_TRUST_AGENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PROVIDE_TRUST_AGENT -UnflaggedApi: android.Manifest.permission#PROVISION_DEMO_DEVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.PROVISION_DEMO_DEVICE -UnflaggedApi: android.Manifest.permission#QUERY_ADMIN_POLICY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.QUERY_ADMIN_POLICY -UnflaggedApi: android.Manifest.permission#QUERY_CLONED_APPS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.QUERY_CLONED_APPS -UnflaggedApi: android.Manifest.permission#QUERY_USERS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.QUERY_USERS -UnflaggedApi: android.Manifest.permission#RADIO_SCAN_WITHOUT_LOCATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RADIO_SCAN_WITHOUT_LOCATION -UnflaggedApi: android.Manifest.permission#READ_ACTIVE_EMERGENCY_SESSION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION -UnflaggedApi: android.Manifest.permission#READ_APP_SPECIFIC_LOCALES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_APP_SPECIFIC_LOCALES -UnflaggedApi: android.Manifest.permission#READ_CARRIER_APP_INFO: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_CARRIER_APP_INFO -UnflaggedApi: android.Manifest.permission#READ_CELL_BROADCASTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_CELL_BROADCASTS -UnflaggedApi: android.Manifest.permission#READ_CLIPBOARD_IN_BACKGROUND: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_CLIPBOARD_IN_BACKGROUND -UnflaggedApi: android.Manifest.permission#READ_CONTENT_RATING_SYSTEMS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_CONTENT_RATING_SYSTEMS -UnflaggedApi: android.Manifest.permission#READ_DEVICE_CONFIG: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_DEVICE_CONFIG -UnflaggedApi: android.Manifest.permission#READ_DREAM_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_DREAM_STATE -UnflaggedApi: android.Manifest.permission#READ_GLOBAL_APP_SEARCH_DATA: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_GLOBAL_APP_SEARCH_DATA UnflaggedApi: android.Manifest.permission#READ_INSTALLED_SESSION_PATHS: New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_INSTALLED_SESSION_PATHS -UnflaggedApi: android.Manifest.permission#READ_INSTALL_SESSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_INSTALL_SESSIONS -UnflaggedApi: android.Manifest.permission#READ_NETWORK_USAGE_HISTORY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_NETWORK_USAGE_HISTORY -UnflaggedApi: android.Manifest.permission#READ_OEM_UNLOCK_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_OEM_UNLOCK_STATE -UnflaggedApi: android.Manifest.permission#READ_PEOPLE_DATA: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_PEOPLE_DATA -UnflaggedApi: android.Manifest.permission#READ_PRINT_SERVICES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_PRINT_SERVICES -UnflaggedApi: android.Manifest.permission#READ_PRINT_SERVICE_RECOMMENDATIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS -UnflaggedApi: android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE -UnflaggedApi: android.Manifest.permission#READ_PROJECTION_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_PROJECTION_STATE -UnflaggedApi: android.Manifest.permission#READ_RESTRICTED_STATS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_RESTRICTED_STATS -UnflaggedApi: android.Manifest.permission#READ_RUNTIME_PROFILES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_RUNTIME_PROFILES -UnflaggedApi: android.Manifest.permission#READ_SAFETY_CENTER_STATUS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_SAFETY_CENTER_STATUS -UnflaggedApi: android.Manifest.permission#READ_SEARCH_INDEXABLES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_SEARCH_INDEXABLES -UnflaggedApi: android.Manifest.permission#READ_SYSTEM_UPDATE_INFO: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_SYSTEM_UPDATE_INFO -UnflaggedApi: android.Manifest.permission#READ_WALLPAPER_INTERNAL: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_WALLPAPER_INTERNAL -UnflaggedApi: android.Manifest.permission#READ_WIFI_CREDENTIAL: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_WIFI_CREDENTIAL -UnflaggedApi: android.Manifest.permission#READ_WRITE_SYNC_DISABLED_MODE_CONFIG: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG -UnflaggedApi: android.Manifest.permission#REAL_GET_TASKS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REAL_GET_TASKS -UnflaggedApi: android.Manifest.permission#RECEIVE_BLUETOOTH_MAP: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RECEIVE_BLUETOOTH_MAP -UnflaggedApi: android.Manifest.permission#RECEIVE_DATA_ACTIVITY_CHANGE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RECEIVE_DATA_ACTIVITY_CHANGE -UnflaggedApi: android.Manifest.permission#RECEIVE_DEVICE_CUSTOMIZATION_READY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY -UnflaggedApi: android.Manifest.permission#RECEIVE_EMERGENCY_BROADCAST: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST -UnflaggedApi: android.Manifest.permission#RECEIVE_WIFI_CREDENTIAL_CHANGE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE -UnflaggedApi: android.Manifest.permission#RECORD_BACKGROUND_AUDIO: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RECORD_BACKGROUND_AUDIO -UnflaggedApi: android.Manifest.permission#RECOVERY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RECOVERY -UnflaggedApi: android.Manifest.permission#RECOVER_KEYSTORE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RECOVER_KEYSTORE -UnflaggedApi: android.Manifest.permission#REGISTER_CALL_PROVIDER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REGISTER_CALL_PROVIDER -UnflaggedApi: android.Manifest.permission#REGISTER_CONNECTION_MANAGER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REGISTER_CONNECTION_MANAGER UnflaggedApi: android.Manifest.permission#REGISTER_NSD_OFFLOAD_ENGINE: New API must be flagged with @FlaggedApi: field android.Manifest.permission.REGISTER_NSD_OFFLOAD_ENGINE -UnflaggedApi: android.Manifest.permission#REGISTER_SIM_SUBSCRIPTION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REGISTER_SIM_SUBSCRIPTION -UnflaggedApi: android.Manifest.permission#REGISTER_STATS_PULL_ATOM: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REGISTER_STATS_PULL_ATOM -UnflaggedApi: android.Manifest.permission#REMOTE_DISPLAY_PROVIDER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REMOTE_DISPLAY_PROVIDER -UnflaggedApi: android.Manifest.permission#REMOVE_DRM_CERTIFICATES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REMOVE_DRM_CERTIFICATES -UnflaggedApi: android.Manifest.permission#REMOVE_TASKS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REMOVE_TASKS -UnflaggedApi: android.Manifest.permission#RENOUNCE_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RENOUNCE_PERMISSIONS UnflaggedApi: android.Manifest.permission#REPORT_USAGE_STATS: New API must be flagged with @FlaggedApi: field android.Manifest.permission.REPORT_USAGE_STATS -UnflaggedApi: android.Manifest.permission#REQUEST_NOTIFICATION_ASSISTANT_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE -UnflaggedApi: android.Manifest.permission#RESET_PASSWORD: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RESET_PASSWORD -UnflaggedApi: android.Manifest.permission#RESTART_WIFI_SUBSYSTEM: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RESTART_WIFI_SUBSYSTEM -UnflaggedApi: android.Manifest.permission#RESTORE_RUNTIME_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS -UnflaggedApi: android.Manifest.permission#RESTRICTED_VR_ACCESS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RESTRICTED_VR_ACCESS -UnflaggedApi: android.Manifest.permission#RETRIEVE_WINDOW_CONTENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.RETRIEVE_WINDOW_CONTENT -UnflaggedApi: android.Manifest.permission#REVIEW_ACCESSIBILITY_SERVICES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REVIEW_ACCESSIBILITY_SERVICES -UnflaggedApi: android.Manifest.permission#REVOKE_RUNTIME_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS -UnflaggedApi: android.Manifest.permission#ROTATE_SURFACE_FLINGER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.ROTATE_SURFACE_FLINGER -UnflaggedApi: android.Manifest.permission#SATELLITE_COMMUNICATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SATELLITE_COMMUNICATION -UnflaggedApi: android.Manifest.permission#SCHEDULE_PRIORITIZED_ALARM: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SCHEDULE_PRIORITIZED_ALARM -UnflaggedApi: android.Manifest.permission#SECURE_ELEMENT_PRIVILEGED_OPERATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SECURE_ELEMENT_PRIVILEGED_OPERATION -UnflaggedApi: android.Manifest.permission#SEND_CATEGORY_CAR_NOTIFICATIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SEND_CATEGORY_CAR_NOTIFICATIONS -UnflaggedApi: android.Manifest.permission#SEND_DEVICE_CUSTOMIZATION_READY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SEND_DEVICE_CUSTOMIZATION_READY -UnflaggedApi: android.Manifest.permission#SEND_SAFETY_CENTER_UPDATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SEND_SAFETY_CENTER_UPDATE -UnflaggedApi: android.Manifest.permission#SEND_SHOW_SUSPENDED_APP_DETAILS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SEND_SHOW_SUSPENDED_APP_DETAILS -UnflaggedApi: android.Manifest.permission#SEND_SMS_NO_CONFIRMATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SEND_SMS_NO_CONFIRMATION -UnflaggedApi: android.Manifest.permission#SERIAL_PORT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SERIAL_PORT -UnflaggedApi: android.Manifest.permission#SET_ACTIVITY_WATCHER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_ACTIVITY_WATCHER -UnflaggedApi: android.Manifest.permission#SET_CLIP_SOURCE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_CLIP_SOURCE -UnflaggedApi: android.Manifest.permission#SET_DEFAULT_ACCOUNT_FOR_CONTACTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS -UnflaggedApi: android.Manifest.permission#SET_HARMFUL_APP_WARNINGS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_HARMFUL_APP_WARNINGS -UnflaggedApi: android.Manifest.permission#SET_LOW_POWER_STANDBY_PORTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_LOW_POWER_STANDBY_PORTS -UnflaggedApi: android.Manifest.permission#SET_MEDIA_KEY_LISTENER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_MEDIA_KEY_LISTENER -UnflaggedApi: android.Manifest.permission#SET_ORIENTATION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_ORIENTATION -UnflaggedApi: android.Manifest.permission#SET_POINTER_SPEED: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_POINTER_SPEED -UnflaggedApi: android.Manifest.permission#SET_SCREEN_COMPATIBILITY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_SCREEN_COMPATIBILITY -UnflaggedApi: android.Manifest.permission#SET_SYSTEM_AUDIO_CAPTION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_SYSTEM_AUDIO_CAPTION -UnflaggedApi: android.Manifest.permission#SET_UNRESTRICTED_KEEP_CLEAR_AREAS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_UNRESTRICTED_KEEP_CLEAR_AREAS -UnflaggedApi: android.Manifest.permission#SET_VOLUME_KEY_LONG_PRESS_LISTENER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER -UnflaggedApi: android.Manifest.permission#SET_WALLPAPER_COMPONENT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_WALLPAPER_COMPONENT -UnflaggedApi: android.Manifest.permission#SET_WALLPAPER_DIM_AMOUNT: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SET_WALLPAPER_DIM_AMOUNT -UnflaggedApi: android.Manifest.permission#SHOW_KEYGUARD_MESSAGE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SHOW_KEYGUARD_MESSAGE -UnflaggedApi: android.Manifest.permission#SHUTDOWN: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SHUTDOWN -UnflaggedApi: android.Manifest.permission#SIGNAL_REBOOT_READINESS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SIGNAL_REBOOT_READINESS -UnflaggedApi: android.Manifest.permission#SOUND_TRIGGER_RUN_IN_BATTERY_SAVER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SOUND_TRIGGER_RUN_IN_BATTERY_SAVER -UnflaggedApi: android.Manifest.permission#STAGE_HEALTH_CONNECT_REMOTE_DATA: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.STAGE_HEALTH_CONNECT_REMOTE_DATA -UnflaggedApi: android.Manifest.permission#START_ACTIVITIES_FROM_BACKGROUND: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND -UnflaggedApi: android.Manifest.permission#START_CROSS_PROFILE_ACTIVITIES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.START_CROSS_PROFILE_ACTIVITIES -UnflaggedApi: android.Manifest.permission#START_REVIEW_PERMISSION_DECISIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.START_REVIEW_PERMISSION_DECISIONS -UnflaggedApi: android.Manifest.permission#START_TASKS_FROM_RECENTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.START_TASKS_FROM_RECENTS -UnflaggedApi: android.Manifest.permission#STATUS_BAR_SERVICE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.STATUS_BAR_SERVICE -UnflaggedApi: android.Manifest.permission#STOP_APP_SWITCHES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.STOP_APP_SWITCHES -UnflaggedApi: android.Manifest.permission#SUBSTITUTE_NOTIFICATION_APP_NAME: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SUBSTITUTE_NOTIFICATION_APP_NAME -UnflaggedApi: android.Manifest.permission#SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON -UnflaggedApi: android.Manifest.permission#SUGGEST_EXTERNAL_TIME: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SUGGEST_EXTERNAL_TIME -UnflaggedApi: android.Manifest.permission#SUSPEND_APPS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SUSPEND_APPS -UnflaggedApi: android.Manifest.permission#SYSTEM_APPLICATION_OVERLAY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SYSTEM_APPLICATION_OVERLAY -UnflaggedApi: android.Manifest.permission#SYSTEM_CAMERA: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.SYSTEM_CAMERA -UnflaggedApi: android.Manifest.permission#TETHER_PRIVILEGED: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.TETHER_PRIVILEGED -UnflaggedApi: android.Manifest.permission#TIS_EXTENSION_INTERFACE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.TIS_EXTENSION_INTERFACE -UnflaggedApi: android.Manifest.permission#TOGGLE_AUTOMOTIVE_PROJECTION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION -UnflaggedApi: android.Manifest.permission#TRIGGER_LOST_MODE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.TRIGGER_LOST_MODE -UnflaggedApi: android.Manifest.permission#TV_INPUT_HARDWARE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.TV_INPUT_HARDWARE -UnflaggedApi: android.Manifest.permission#TV_VIRTUAL_REMOTE_CONTROLLER: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.TV_VIRTUAL_REMOTE_CONTROLLER -UnflaggedApi: android.Manifest.permission#UNLIMITED_SHORTCUTS_API_CALLS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.UNLIMITED_SHORTCUTS_API_CALLS -UnflaggedApi: android.Manifest.permission#UPDATE_APP_OPS_STATS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.UPDATE_APP_OPS_STATS -UnflaggedApi: android.Manifest.permission#UPDATE_DEVICE_MANAGEMENT_RESOURCES: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES -UnflaggedApi: android.Manifest.permission#UPDATE_DOMAIN_VERIFICATION_USER_SELECTION: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.UPDATE_DOMAIN_VERIFICATION_USER_SELECTION -UnflaggedApi: android.Manifest.permission#UPDATE_FONTS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.UPDATE_FONTS -UnflaggedApi: android.Manifest.permission#UPDATE_LOCK: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.UPDATE_LOCK -UnflaggedApi: android.Manifest.permission#UPGRADE_RUNTIME_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS -UnflaggedApi: android.Manifest.permission#USER_ACTIVITY: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.USER_ACTIVITY -UnflaggedApi: android.Manifest.permission#USE_COLORIZED_NOTIFICATIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.USE_COLORIZED_NOTIFICATIONS -UnflaggedApi: android.Manifest.permission#USE_RESERVED_DISK: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.USE_RESERVED_DISK -UnflaggedApi: android.Manifest.permission#UWB_PRIVILEGED: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.UWB_PRIVILEGED -UnflaggedApi: android.Manifest.permission#WHITELIST_AUTO_REVOKE_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS -UnflaggedApi: android.Manifest.permission#WHITELIST_RESTRICTED_PERMISSIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS -UnflaggedApi: android.Manifest.permission#WIFI_ACCESS_COEX_UNSAFE_CHANNELS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WIFI_ACCESS_COEX_UNSAFE_CHANNELS -UnflaggedApi: android.Manifest.permission#WIFI_SET_DEVICE_MOBILITY_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WIFI_SET_DEVICE_MOBILITY_STATE -UnflaggedApi: android.Manifest.permission#WIFI_UPDATE_COEX_UNSAFE_CHANNELS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WIFI_UPDATE_COEX_UNSAFE_CHANNELS -UnflaggedApi: android.Manifest.permission#WIFI_UPDATE_USABILITY_STATS_SCORE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE -UnflaggedApi: android.Manifest.permission#WRITE_ALLOWLISTED_DEVICE_CONFIG: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG -UnflaggedApi: android.Manifest.permission#WRITE_DEVICE_CONFIG: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WRITE_DEVICE_CONFIG -UnflaggedApi: android.Manifest.permission#WRITE_DREAM_STATE: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WRITE_DREAM_STATE -UnflaggedApi: android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS -UnflaggedApi: android.Manifest.permission#WRITE_OBB: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WRITE_OBB -UnflaggedApi: android.Manifest.permission#WRITE_SECURITY_LOG: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WRITE_SECURITY_LOG -UnflaggedApi: android.Manifest.permission#WRITE_SMS: - New API must be flagged with @FlaggedApi: field android.Manifest.permission.WRITE_SMS -UnflaggedApi: android.Manifest.permission_group#UNDEFINED: - New API must be flagged with @FlaggedApi: field android.Manifest.permission_group.UNDEFINED -UnflaggedApi: android.R.array#config_keySystemUuidMapping: - New API must be flagged with @FlaggedApi: field android.R.array.config_keySystemUuidMapping -UnflaggedApi: android.R.array#config_optionalIpSecAlgorithms: - New API must be flagged with @FlaggedApi: field android.R.array.config_optionalIpSecAlgorithms -UnflaggedApi: android.R.attr#allowClearUserDataOnFailedRestore: - New API must be flagged with @FlaggedApi: field android.R.attr.allowClearUserDataOnFailedRestore -UnflaggedApi: android.R.attr#gameSessionService: - New API must be flagged with @FlaggedApi: field android.R.attr.gameSessionService -UnflaggedApi: android.R.attr#hotwordDetectionService: - New API must be flagged with @FlaggedApi: field android.R.attr.hotwordDetectionService -UnflaggedApi: android.R.attr#isVrOnly: - New API must be flagged with @FlaggedApi: field android.R.attr.isVrOnly -UnflaggedApi: android.R.attr#minExtensionVersion: - New API must be flagged with @FlaggedApi: field android.R.attr.minExtensionVersion -UnflaggedApi: android.R.attr#playHomeTransitionSound: - New API must be flagged with @FlaggedApi: field android.R.attr.playHomeTransitionSound -UnflaggedApi: android.R.attr#requiredSystemPropertyName: - New API must be flagged with @FlaggedApi: field android.R.attr.requiredSystemPropertyName -UnflaggedApi: android.R.attr#requiredSystemPropertyValue: - New API must be flagged with @FlaggedApi: field android.R.attr.requiredSystemPropertyValue -UnflaggedApi: android.R.attr#sdkVersion: - New API must be flagged with @FlaggedApi: field android.R.attr.sdkVersion -UnflaggedApi: android.R.attr#supportsAmbientMode: - New API must be flagged with @FlaggedApi: field android.R.attr.supportsAmbientMode -UnflaggedApi: android.R.attr#userRestriction: - New API must be flagged with @FlaggedApi: field android.R.attr.userRestriction -UnflaggedApi: android.R.attr#visualQueryDetectionService: - New API must be flagged with @FlaggedApi: field android.R.attr.visualQueryDetectionService -UnflaggedApi: android.R.bool#config_enableDefaultNotes: - New API must be flagged with @FlaggedApi: field android.R.bool.config_enableDefaultNotes -UnflaggedApi: android.R.bool#config_enableDefaultNotesForWorkProfile: - New API must be flagged with @FlaggedApi: field android.R.bool.config_enableDefaultNotesForWorkProfile -UnflaggedApi: android.R.bool#config_enableQrCodeScannerOnLockScreen: - New API must be flagged with @FlaggedApi: field android.R.bool.config_enableQrCodeScannerOnLockScreen -UnflaggedApi: android.R.bool#config_safetyProtectionEnabled: - New API must be flagged with @FlaggedApi: field android.R.bool.config_safetyProtectionEnabled -UnflaggedApi: android.R.bool#config_sendPackageName: - New API must be flagged with @FlaggedApi: field android.R.bool.config_sendPackageName -UnflaggedApi: android.R.bool#config_showDefaultAssistant: - New API must be flagged with @FlaggedApi: field android.R.bool.config_showDefaultAssistant -UnflaggedApi: android.R.bool#config_showDefaultEmergency: - New API must be flagged with @FlaggedApi: field android.R.bool.config_showDefaultEmergency -UnflaggedApi: android.R.bool#config_showDefaultHome: - New API must be flagged with @FlaggedApi: field android.R.bool.config_showDefaultHome -UnflaggedApi: android.R.color#system_notification_accent_color: - New API must be flagged with @FlaggedApi: field android.R.color.system_notification_accent_color -UnflaggedApi: android.R.dimen#config_restrictedIconSize: - New API must be flagged with @FlaggedApi: field android.R.dimen.config_restrictedIconSize -UnflaggedApi: android.R.dimen#config_viewConfigurationHandwritingGestureLineMargin: - New API must be flagged with @FlaggedApi: field android.R.dimen.config_viewConfigurationHandwritingGestureLineMargin -UnflaggedApi: android.R.drawable#ic_info: - New API must be flagged with @FlaggedApi: field android.R.drawable.ic_info -UnflaggedApi: android.R.drawable#ic_safety_protection: - New API must be flagged with @FlaggedApi: field android.R.drawable.ic_safety_protection -UnflaggedApi: android.R.raw#loaderror: - New API must be flagged with @FlaggedApi: field android.R.raw.loaderror -UnflaggedApi: android.R.raw#nodomain: - New API must be flagged with @FlaggedApi: field android.R.raw.nodomain -UnflaggedApi: android.R.string#config_customMediaKeyDispatcher: - New API must be flagged with @FlaggedApi: field android.R.string.config_customMediaKeyDispatcher -UnflaggedApi: android.R.string#config_customMediaSessionPolicyProvider: - New API must be flagged with @FlaggedApi: field android.R.string.config_customMediaSessionPolicyProvider -UnflaggedApi: android.R.string#config_defaultAssistant: - New API must be flagged with @FlaggedApi: field android.R.string.config_defaultAssistant -UnflaggedApi: android.R.string#config_defaultAutomotiveNavigation: - New API must be flagged with @FlaggedApi: field android.R.string.config_defaultAutomotiveNavigation -UnflaggedApi: android.R.string#config_defaultBrowser: - New API must be flagged with @FlaggedApi: field android.R.string.config_defaultBrowser -UnflaggedApi: android.R.string#config_defaultCallRedirection: - New API must be flagged with @FlaggedApi: field android.R.string.config_defaultCallRedirection -UnflaggedApi: android.R.string#config_defaultCallScreening: - New API must be flagged with @FlaggedApi: field android.R.string.config_defaultCallScreening -UnflaggedApi: android.R.string#config_defaultDialer: - New API must be flagged with @FlaggedApi: field android.R.string.config_defaultDialer -UnflaggedApi: android.R.string#config_defaultNotes: - New API must be flagged with @FlaggedApi: field android.R.string.config_defaultNotes UnflaggedApi: android.R.string#config_defaultRetailDemo: New API must be flagged with @FlaggedApi: field android.R.string.config_defaultRetailDemo -UnflaggedApi: android.R.string#config_defaultSms: - New API must be flagged with @FlaggedApi: field android.R.string.config_defaultSms -UnflaggedApi: android.R.string#config_devicePolicyManagement: - New API must be flagged with @FlaggedApi: field android.R.string.config_devicePolicyManagement -UnflaggedApi: android.R.string#config_feedbackIntentExtraKey: - New API must be flagged with @FlaggedApi: field android.R.string.config_feedbackIntentExtraKey -UnflaggedApi: android.R.string#config_feedbackIntentNameKey: - New API must be flagged with @FlaggedApi: field android.R.string.config_feedbackIntentNameKey -UnflaggedApi: android.R.string#config_helpIntentExtraKey: - New API must be flagged with @FlaggedApi: field android.R.string.config_helpIntentExtraKey -UnflaggedApi: android.R.string#config_helpIntentNameKey: - New API must be flagged with @FlaggedApi: field android.R.string.config_helpIntentNameKey -UnflaggedApi: android.R.string#config_helpPackageNameKey: - New API must be flagged with @FlaggedApi: field android.R.string.config_helpPackageNameKey -UnflaggedApi: android.R.string#config_helpPackageNameValue: - New API must be flagged with @FlaggedApi: field android.R.string.config_helpPackageNameValue -UnflaggedApi: android.R.string#config_systemActivityRecognizer: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemActivityRecognizer -UnflaggedApi: android.R.string#config_systemAmbientAudioIntelligence: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemAmbientAudioIntelligence -UnflaggedApi: android.R.string#config_systemAppProtectionService: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemAppProtectionService -UnflaggedApi: android.R.string#config_systemAudioIntelligence: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemAudioIntelligence -UnflaggedApi: android.R.string#config_systemAutomotiveCalendarSyncManager: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemAutomotiveCalendarSyncManager -UnflaggedApi: android.R.string#config_systemAutomotiveCluster: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemAutomotiveCluster -UnflaggedApi: android.R.string#config_systemAutomotiveProjection: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemAutomotiveProjection -UnflaggedApi: android.R.string#config_systemCallStreaming: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemCallStreaming -UnflaggedApi: android.R.string#config_systemCompanionDeviceProvider: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemCompanionDeviceProvider -UnflaggedApi: android.R.string#config_systemContacts: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemContacts -UnflaggedApi: android.R.string#config_systemFinancedDeviceController: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemFinancedDeviceController -UnflaggedApi: android.R.string#config_systemGallery: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemGallery -UnflaggedApi: android.R.string#config_systemNotificationIntelligence: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemNotificationIntelligence -UnflaggedApi: android.R.string#config_systemSettingsIntelligence: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemSettingsIntelligence -UnflaggedApi: android.R.string#config_systemShell: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemShell -UnflaggedApi: android.R.string#config_systemSpeechRecognizer: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemSpeechRecognizer -UnflaggedApi: android.R.string#config_systemSupervision: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemSupervision -UnflaggedApi: android.R.string#config_systemTelevisionNotificationHandler: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemTelevisionNotificationHandler -UnflaggedApi: android.R.string#config_systemTextIntelligence: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemTextIntelligence -UnflaggedApi: android.R.string#config_systemUi: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemUi -UnflaggedApi: android.R.string#config_systemUiIntelligence: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemUiIntelligence -UnflaggedApi: android.R.string#config_systemVisualIntelligence: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemVisualIntelligence -UnflaggedApi: android.R.string#config_systemWearHealthService: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemWearHealthService -UnflaggedApi: android.R.string#config_systemWellbeing: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemWellbeing -UnflaggedApi: android.R.string#config_systemWifiCoexManager: - New API must be flagged with @FlaggedApi: field android.R.string.config_systemWifiCoexManager -UnflaggedApi: android.R.string#safety_protection_display_text: - New API must be flagged with @FlaggedApi: field android.R.string.safety_protection_display_text -UnflaggedApi: android.R.style#Theme_DeviceDefault_DocumentsUI: - New API must be flagged with @FlaggedApi: field android.R.style.Theme_DeviceDefault_DocumentsUI -UnflaggedApi: android.R.style#Theme_Leanback_FormWizard: - New API must be flagged with @FlaggedApi: field android.R.style.Theme_Leanback_FormWizard UnflaggedApi: android.app.ActivityManager#getExternalHistoricalProcessStartReasons(String, int): New API must be flagged with @FlaggedApi: method android.app.ActivityManager.getExternalHistoricalProcessStartReasons(String,int) UnflaggedApi: android.app.AppOpsManager#OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO: New API must be flagged with @FlaggedApi: field android.app.AppOpsManager.OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO -UnflaggedApi: android.app.AppOpsManager.AttributedHistoricalOps#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.AttributedHistoricalOps.equals(Object) -UnflaggedApi: android.app.AppOpsManager.AttributedHistoricalOps#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.AttributedHistoricalOps.hashCode() -UnflaggedApi: android.app.AppOpsManager.HistoricalOp#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.HistoricalOp.equals(Object) -UnflaggedApi: android.app.AppOpsManager.HistoricalOp#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.HistoricalOp.hashCode() -UnflaggedApi: android.app.AppOpsManager.HistoricalOps#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.HistoricalOps.equals(Object) -UnflaggedApi: android.app.AppOpsManager.HistoricalOps#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.HistoricalOps.hashCode() -UnflaggedApi: android.app.AppOpsManager.HistoricalOps#toString(): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.HistoricalOps.toString() -UnflaggedApi: android.app.AppOpsManager.HistoricalPackageOps#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.HistoricalPackageOps.equals(Object) -UnflaggedApi: android.app.AppOpsManager.HistoricalPackageOps#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.HistoricalPackageOps.hashCode() -UnflaggedApi: android.app.AppOpsManager.HistoricalUidOps#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.HistoricalUidOps.equals(Object) -UnflaggedApi: android.app.AppOpsManager.HistoricalUidOps#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.AppOpsManager.HistoricalUidOps.hashCode() -UnflaggedApi: android.app.GameModeConfiguration#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.GameModeConfiguration.equals(Object) -UnflaggedApi: android.app.GameModeConfiguration#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.GameModeConfiguration.hashCode() -UnflaggedApi: android.app.StatusBarManager.DisableInfo#toString(): - New API must be flagged with @FlaggedApi: method android.app.StatusBarManager.DisableInfo.toString() -UnflaggedApi: android.app.Vr2dDisplayProperties#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.Vr2dDisplayProperties.equals(Object) -UnflaggedApi: android.app.Vr2dDisplayProperties#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.Vr2dDisplayProperties.hashCode() -UnflaggedApi: android.app.Vr2dDisplayProperties#toString(): - New API must be flagged with @FlaggedApi: method android.app.Vr2dDisplayProperties.toString() -UnflaggedApi: android.app.admin.AccountTypePolicyKey#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.AccountTypePolicyKey.equals(Object) -UnflaggedApi: android.app.admin.AccountTypePolicyKey#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.AccountTypePolicyKey.hashCode() -UnflaggedApi: android.app.admin.AccountTypePolicyKey#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.AccountTypePolicyKey.toString() -UnflaggedApi: android.app.admin.Authority#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.Authority.equals(Object) -UnflaggedApi: android.app.admin.Authority#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.Authority.hashCode() -UnflaggedApi: android.app.admin.DeviceAdminAuthority#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.DeviceAdminAuthority.equals(Object) -UnflaggedApi: android.app.admin.DeviceAdminAuthority#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.DeviceAdminAuthority.hashCode() -UnflaggedApi: android.app.admin.DeviceAdminAuthority#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.DeviceAdminAuthority.toString() -UnflaggedApi: android.app.admin.DevicePolicyDrawableResource#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.DevicePolicyDrawableResource.equals(Object) -UnflaggedApi: android.app.admin.DevicePolicyDrawableResource#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.DevicePolicyDrawableResource.hashCode() -UnflaggedApi: android.app.admin.DevicePolicyKeyguardService#onDestroy(): - New API must be flagged with @FlaggedApi: method android.app.admin.DevicePolicyKeyguardService.onDestroy() -UnflaggedApi: android.app.admin.DevicePolicyResources.Strings: - New API must be flagged with @FlaggedApi: class android.app.admin.DevicePolicyResources.Strings -UnflaggedApi: android.app.admin.DevicePolicyResources.Strings.DefaultAppSettings: - New API must be flagged with @FlaggedApi: class android.app.admin.DevicePolicyResources.Strings.DefaultAppSettings -UnflaggedApi: android.app.admin.DevicePolicyResources.Strings.DefaultAppSettings#HOME_MISSING_WORK_PROFILE_SUPPORT_MESSAGE: - New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyResources.Strings.DefaultAppSettings.HOME_MISSING_WORK_PROFILE_SUPPORT_MESSAGE -UnflaggedApi: android.app.admin.DevicePolicyResources.Strings.DefaultAppSettings#WORK_PROFILE_DEFAULT_APPS_TITLE: - New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyResources.Strings.DefaultAppSettings.WORK_PROFILE_DEFAULT_APPS_TITLE -UnflaggedApi: android.app.admin.DevicePolicyResources.Strings.PermissionSettings: - New API must be flagged with @FlaggedApi: class android.app.admin.DevicePolicyResources.Strings.PermissionSettings -UnflaggedApi: android.app.admin.DevicePolicyResources.Strings.PermissionSettings#BACKGROUND_ACCESS_DISABLED_BY_ADMIN_MESSAGE: - New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyResources.Strings.PermissionSettings.BACKGROUND_ACCESS_DISABLED_BY_ADMIN_MESSAGE -UnflaggedApi: android.app.admin.DevicePolicyResources.Strings.PermissionSettings#BACKGROUND_ACCESS_ENABLED_BY_ADMIN_MESSAGE: - New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyResources.Strings.PermissionSettings.BACKGROUND_ACCESS_ENABLED_BY_ADMIN_MESSAGE -UnflaggedApi: android.app.admin.DevicePolicyResources.Strings.PermissionSettings#FOREGROUND_ACCESS_ENABLED_BY_ADMIN_MESSAGE: - New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyResources.Strings.PermissionSettings.FOREGROUND_ACCESS_ENABLED_BY_ADMIN_MESSAGE -UnflaggedApi: android.app.admin.DevicePolicyResources.Strings.PermissionSettings#LOCATION_AUTO_GRANTED_MESSAGE: - New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyResources.Strings.PermissionSettings.LOCATION_AUTO_GRANTED_MESSAGE -UnflaggedApi: android.app.admin.DevicePolicyState#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.DevicePolicyState.toString() -UnflaggedApi: android.app.admin.DevicePolicyStringResource#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.DevicePolicyStringResource.equals(Object) -UnflaggedApi: android.app.admin.DevicePolicyStringResource#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.DevicePolicyStringResource.hashCode() -UnflaggedApi: android.app.admin.DpcAuthority#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.DpcAuthority.equals(Object) -UnflaggedApi: android.app.admin.DpcAuthority#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.DpcAuthority.hashCode() -UnflaggedApi: android.app.admin.DpcAuthority#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.DpcAuthority.toString() -UnflaggedApi: android.app.admin.EnforcingAdmin#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.EnforcingAdmin.equals(Object) -UnflaggedApi: android.app.admin.EnforcingAdmin#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.EnforcingAdmin.hashCode() -UnflaggedApi: android.app.admin.EnforcingAdmin#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.EnforcingAdmin.toString() -UnflaggedApi: android.app.admin.IntentFilterPolicyKey#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.IntentFilterPolicyKey.equals(Object) -UnflaggedApi: android.app.admin.IntentFilterPolicyKey#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.IntentFilterPolicyKey.hashCode() -UnflaggedApi: android.app.admin.IntentFilterPolicyKey#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.IntentFilterPolicyKey.toString() -UnflaggedApi: android.app.admin.LockTaskPolicy#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.LockTaskPolicy.equals(Object) -UnflaggedApi: android.app.admin.LockTaskPolicy#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.LockTaskPolicy.hashCode() -UnflaggedApi: android.app.admin.LockTaskPolicy#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.LockTaskPolicy.toString() -UnflaggedApi: android.app.admin.NoArgsPolicyKey#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.NoArgsPolicyKey.toString() -UnflaggedApi: android.app.admin.PackagePermissionPolicyKey#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.PackagePermissionPolicyKey.equals(Object) -UnflaggedApi: android.app.admin.PackagePermissionPolicyKey#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.PackagePermissionPolicyKey.hashCode() -UnflaggedApi: android.app.admin.PackagePermissionPolicyKey#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.PackagePermissionPolicyKey.toString() -UnflaggedApi: android.app.admin.PackagePolicyKey#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.PackagePolicyKey.equals(Object) -UnflaggedApi: android.app.admin.PackagePolicyKey#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.PackagePolicyKey.hashCode() -UnflaggedApi: android.app.admin.PackagePolicyKey#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.PackagePolicyKey.toString() -UnflaggedApi: android.app.admin.PolicyKey#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.PolicyKey.equals(Object) -UnflaggedApi: android.app.admin.PolicyKey#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.PolicyKey.hashCode() -UnflaggedApi: android.app.admin.PolicyState#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.PolicyState.toString() -UnflaggedApi: android.app.admin.RoleAuthority#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.RoleAuthority.equals(Object) -UnflaggedApi: android.app.admin.RoleAuthority#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.RoleAuthority.hashCode() -UnflaggedApi: android.app.admin.RoleAuthority#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.RoleAuthority.toString() -UnflaggedApi: android.app.admin.UnknownAuthority#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.admin.UnknownAuthority.equals(Object) -UnflaggedApi: android.app.admin.UnknownAuthority#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.admin.UnknownAuthority.hashCode() -UnflaggedApi: android.app.admin.UnknownAuthority#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.UnknownAuthority.toString() -UnflaggedApi: android.app.admin.UserRestrictionPolicyKey#toString(): - New API must be flagged with @FlaggedApi: method android.app.admin.UserRestrictionPolicyKey.toString() -UnflaggedApi: android.app.ambientcontext.AmbientContextEvent#toString(): - New API must be flagged with @FlaggedApi: method android.app.ambientcontext.AmbientContextEvent.toString() -UnflaggedApi: android.app.ambientcontext.AmbientContextEventRequest#toString(): - New API must be flagged with @FlaggedApi: method android.app.ambientcontext.AmbientContextEventRequest.toString() -UnflaggedApi: android.app.assist.ActivityId#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.assist.ActivityId.equals(Object) -UnflaggedApi: android.app.assist.ActivityId#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.assist.ActivityId.hashCode() -UnflaggedApi: android.app.assist.ActivityId#toString(): - New API must be flagged with @FlaggedApi: method android.app.assist.ActivityId.toString() -UnflaggedApi: android.app.assist.AssistStructure.ViewNode#ViewNode(): - New API must be flagged with @FlaggedApi: constructor android.app.assist.AssistStructure.ViewNode() -UnflaggedApi: android.app.backup.RestoreDescription#toString(): - New API must be flagged with @FlaggedApi: method android.app.backup.RestoreDescription.toString() -UnflaggedApi: android.app.cloudsearch.SearchRequest#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.cloudsearch.SearchRequest.equals(Object) -UnflaggedApi: android.app.cloudsearch.SearchRequest#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.cloudsearch.SearchRequest.hashCode() -UnflaggedApi: android.app.cloudsearch.SearchRequest#toString(): - New API must be flagged with @FlaggedApi: method android.app.cloudsearch.SearchRequest.toString() -UnflaggedApi: android.app.cloudsearch.SearchResponse#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.cloudsearch.SearchResponse.equals(Object) -UnflaggedApi: android.app.cloudsearch.SearchResponse#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.cloudsearch.SearchResponse.hashCode() -UnflaggedApi: android.app.cloudsearch.SearchResult#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.cloudsearch.SearchResult.equals(Object) -UnflaggedApi: android.app.cloudsearch.SearchResult#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.cloudsearch.SearchResult.hashCode() -UnflaggedApi: android.app.prediction.AppPredictionContext#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.prediction.AppPredictionContext.equals(Object) -UnflaggedApi: android.app.prediction.AppPredictionSessionId#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.prediction.AppPredictionSessionId.equals(Object) -UnflaggedApi: android.app.prediction.AppPredictionSessionId#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.prediction.AppPredictionSessionId.hashCode() -UnflaggedApi: android.app.prediction.AppPredictionSessionId#toString(): - New API must be flagged with @FlaggedApi: method android.app.prediction.AppPredictionSessionId.toString() -UnflaggedApi: android.app.prediction.AppPredictor#finalize(): - New API must be flagged with @FlaggedApi: method android.app.prediction.AppPredictor.finalize() -UnflaggedApi: android.app.prediction.AppTarget#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.prediction.AppTarget.equals(Object) -UnflaggedApi: android.app.prediction.AppTargetEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.prediction.AppTargetEvent.equals(Object) -UnflaggedApi: android.app.prediction.AppTargetId#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.prediction.AppTargetId.equals(Object) -UnflaggedApi: android.app.prediction.AppTargetId#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.prediction.AppTargetId.hashCode() -UnflaggedApi: android.app.search.SearchAction#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.search.SearchAction.equals(Object) -UnflaggedApi: android.app.search.SearchAction#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.search.SearchAction.hashCode() -UnflaggedApi: android.app.search.SearchAction#toString(): - New API must be flagged with @FlaggedApi: method android.app.search.SearchAction.toString() -UnflaggedApi: android.app.search.SearchSessionId#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.search.SearchSessionId.equals(Object) -UnflaggedApi: android.app.search.SearchSessionId#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.search.SearchSessionId.hashCode() -UnflaggedApi: android.app.search.SearchSessionId#toString(): - New API must be flagged with @FlaggedApi: method android.app.search.SearchSessionId.toString() -UnflaggedApi: android.app.search.SearchTargetEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.search.SearchTargetEvent.equals(Object) -UnflaggedApi: android.app.search.SearchTargetEvent#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.search.SearchTargetEvent.hashCode() -UnflaggedApi: android.app.smartspace.SmartspaceAction#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceAction.equals(Object) -UnflaggedApi: android.app.smartspace.SmartspaceAction#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceAction.hashCode() -UnflaggedApi: android.app.smartspace.SmartspaceAction#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceAction.toString() -UnflaggedApi: android.app.smartspace.SmartspaceConfig#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceConfig.equals(Object) -UnflaggedApi: android.app.smartspace.SmartspaceConfig#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceConfig.hashCode() -UnflaggedApi: android.app.smartspace.SmartspaceSessionId#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceSessionId.equals(Object) -UnflaggedApi: android.app.smartspace.SmartspaceSessionId#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceSessionId.hashCode() -UnflaggedApi: android.app.smartspace.SmartspaceSessionId#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceSessionId.toString() -UnflaggedApi: android.app.smartspace.SmartspaceTarget#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceTarget.equals(Object) -UnflaggedApi: android.app.smartspace.SmartspaceTarget#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceTarget.hashCode() -UnflaggedApi: android.app.smartspace.SmartspaceTarget#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceTarget.toString() -UnflaggedApi: android.app.smartspace.SmartspaceTargetEvent#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.SmartspaceTargetEvent.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.BaseTemplateData#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.BaseTemplateData.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.BaseTemplateData#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.BaseTemplateData.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.BaseTemplateData#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.BaseTemplateData.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemInfo.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemInfo.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemInfo#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemInfo.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.BaseTemplateData.SubItemLoggingInfo.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.CarouselTemplateData#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.CarouselTemplateData.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.CarouselTemplateData#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.CarouselTemplateData.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.CarouselTemplateData#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.CarouselTemplateData.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.CarouselTemplateData.CarouselItem.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.CombinedCardsTemplateData#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.CombinedCardsTemplateData.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.CombinedCardsTemplateData#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.CombinedCardsTemplateData.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.CombinedCardsTemplateData#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.CombinedCardsTemplateData.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.HeadToHeadTemplateData#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.HeadToHeadTemplateData.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.HeadToHeadTemplateData#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.HeadToHeadTemplateData.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.HeadToHeadTemplateData#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.HeadToHeadTemplateData.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.Icon#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.Icon.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.Icon#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.Icon.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.Icon#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.Icon.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.SubCardTemplateData#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.SubCardTemplateData.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.SubCardTemplateData#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.SubCardTemplateData.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.SubCardTemplateData#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.SubCardTemplateData.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.SubImageTemplateData#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.SubImageTemplateData.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.SubImageTemplateData#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.SubImageTemplateData.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.SubImageTemplateData#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.SubImageTemplateData.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.SubListTemplateData#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.SubListTemplateData.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.SubListTemplateData#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.SubListTemplateData.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.SubListTemplateData#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.SubListTemplateData.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.TapAction#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.TapAction.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.TapAction#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.TapAction.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.TapAction#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.TapAction.toString() -UnflaggedApi: android.app.smartspace.uitemplatedata.Text#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.Text.equals(Object) -UnflaggedApi: android.app.smartspace.uitemplatedata.Text#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.Text.hashCode() -UnflaggedApi: android.app.smartspace.uitemplatedata.Text#toString(): - New API must be flagged with @FlaggedApi: method android.app.smartspace.uitemplatedata.Text.toString() -UnflaggedApi: android.app.time.ExternalTimeSuggestion#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.ExternalTimeSuggestion.equals(Object) -UnflaggedApi: android.app.time.ExternalTimeSuggestion#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.ExternalTimeSuggestion.hashCode() -UnflaggedApi: android.app.time.ExternalTimeSuggestion#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.ExternalTimeSuggestion.toString() -UnflaggedApi: android.app.time.TimeCapabilities#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.TimeCapabilities.equals(Object) -UnflaggedApi: android.app.time.TimeCapabilities#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeCapabilities.hashCode() -UnflaggedApi: android.app.time.TimeCapabilities#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeCapabilities.toString() -UnflaggedApi: android.app.time.TimeCapabilitiesAndConfig#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.TimeCapabilitiesAndConfig.equals(Object) -UnflaggedApi: android.app.time.TimeCapabilitiesAndConfig#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeCapabilitiesAndConfig.hashCode() -UnflaggedApi: android.app.time.TimeCapabilitiesAndConfig#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeCapabilitiesAndConfig.toString() -UnflaggedApi: android.app.time.TimeConfiguration#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.TimeConfiguration.equals(Object) -UnflaggedApi: android.app.time.TimeConfiguration#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeConfiguration.hashCode() -UnflaggedApi: android.app.time.TimeConfiguration#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeConfiguration.toString() -UnflaggedApi: android.app.time.TimeState#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.TimeState.equals(Object) -UnflaggedApi: android.app.time.TimeState#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeState.hashCode() -UnflaggedApi: android.app.time.TimeState#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeState.toString() -UnflaggedApi: android.app.time.TimeZoneCapabilities#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneCapabilities.equals(Object) -UnflaggedApi: android.app.time.TimeZoneCapabilities#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneCapabilities.hashCode() -UnflaggedApi: android.app.time.TimeZoneCapabilities#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneCapabilities.toString() -UnflaggedApi: android.app.time.TimeZoneCapabilitiesAndConfig#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneCapabilitiesAndConfig.equals(Object) -UnflaggedApi: android.app.time.TimeZoneCapabilitiesAndConfig#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneCapabilitiesAndConfig.hashCode() -UnflaggedApi: android.app.time.TimeZoneCapabilitiesAndConfig#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneCapabilitiesAndConfig.toString() -UnflaggedApi: android.app.time.TimeZoneConfiguration#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneConfiguration.equals(Object) -UnflaggedApi: android.app.time.TimeZoneConfiguration#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneConfiguration.hashCode() -UnflaggedApi: android.app.time.TimeZoneConfiguration#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneConfiguration.toString() -UnflaggedApi: android.app.time.TimeZoneState#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneState.equals(Object) -UnflaggedApi: android.app.time.TimeZoneState#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneState.hashCode() -UnflaggedApi: android.app.time.TimeZoneState#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.TimeZoneState.toString() -UnflaggedApi: android.app.time.UnixEpochTime#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.time.UnixEpochTime.equals(Object) -UnflaggedApi: android.app.time.UnixEpochTime#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.time.UnixEpochTime.hashCode() -UnflaggedApi: android.app.time.UnixEpochTime#toString(): - New API must be flagged with @FlaggedApi: method android.app.time.UnixEpochTime.toString() -UnflaggedApi: android.app.usage.BroadcastResponseStats#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.usage.BroadcastResponseStats.equals(Object) -UnflaggedApi: android.app.usage.BroadcastResponseStats#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.usage.BroadcastResponseStats.hashCode() -UnflaggedApi: android.app.usage.BroadcastResponseStats#toString(): - New API must be flagged with @FlaggedApi: method android.app.usage.BroadcastResponseStats.toString() -UnflaggedApi: android.app.usage.CacheQuotaHint#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.usage.CacheQuotaHint.equals(Object) -UnflaggedApi: android.app.usage.CacheQuotaHint#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.usage.CacheQuotaHint.hashCode() -UnflaggedApi: android.app.usage.CacheQuotaService#onCreate(): - New API must be flagged with @FlaggedApi: method android.app.usage.CacheQuotaService.onCreate() -UnflaggedApi: android.app.usage.UsageEvents.Event#NOTIFICATION_INTERRUPTION: - New API must be flagged with @FlaggedApi: field android.app.usage.UsageEvents.Event.NOTIFICATION_INTERRUPTION -UnflaggedApi: android.app.usage.UsageEvents.Event#NOTIFICATION_SEEN: - New API must be flagged with @FlaggedApi: field android.app.usage.UsageEvents.Event.NOTIFICATION_SEEN -UnflaggedApi: android.app.usage.UsageEvents.Event#SLICE_PINNED: - New API must be flagged with @FlaggedApi: field android.app.usage.UsageEvents.Event.SLICE_PINNED -UnflaggedApi: android.app.usage.UsageEvents.Event#SLICE_PINNED_PRIV: - New API must be flagged with @FlaggedApi: field android.app.usage.UsageEvents.Event.SLICE_PINNED_PRIV -UnflaggedApi: android.app.usage.UsageEvents.Event#SYSTEM_INTERACTION: - New API must be flagged with @FlaggedApi: field android.app.usage.UsageEvents.Event.SYSTEM_INTERACTION -UnflaggedApi: android.app.usage.UsageEvents.Event#getInstanceId(): - New API must be flagged with @FlaggedApi: method android.app.usage.UsageEvents.Event.getInstanceId() -UnflaggedApi: android.app.usage.UsageEvents.Event#getNotificationChannelId(): - New API must be flagged with @FlaggedApi: method android.app.usage.UsageEvents.Event.getNotificationChannelId() -UnflaggedApi: android.app.usage.UsageEvents.Event#getTaskRootClassName(): - New API must be flagged with @FlaggedApi: method android.app.usage.UsageEvents.Event.getTaskRootClassName() -UnflaggedApi: android.app.usage.UsageEvents.Event#getTaskRootPackageName(): - New API must be flagged with @FlaggedApi: method android.app.usage.UsageEvents.Event.getTaskRootPackageName() -UnflaggedApi: android.app.usage.UsageEvents.Event#isInstantApp(): - New API must be flagged with @FlaggedApi: method android.app.usage.UsageEvents.Event.isInstantApp() -UnflaggedApi: android.app.wallpapereffectsgeneration.CinematicEffectRequest#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.wallpapereffectsgeneration.CinematicEffectRequest.equals(Object) -UnflaggedApi: android.app.wallpapereffectsgeneration.CinematicEffectRequest#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.wallpapereffectsgeneration.CinematicEffectRequest.hashCode() -UnflaggedApi: android.app.wallpapereffectsgeneration.CinematicEffectResponse#equals(Object): - New API must be flagged with @FlaggedApi: method android.app.wallpapereffectsgeneration.CinematicEffectResponse.equals(Object) -UnflaggedApi: android.app.wallpapereffectsgeneration.CinematicEffectResponse#hashCode(): - New API must be flagged with @FlaggedApi: method android.app.wallpapereffectsgeneration.CinematicEffectResponse.hashCode() UnflaggedApi: android.companion.virtual.VirtualDeviceManager.VirtualDevice#getPersistentDeviceId(): New API must be flagged with @FlaggedApi: method android.companion.virtual.VirtualDeviceManager.VirtualDevice.getPersistentDeviceId() -UnflaggedApi: android.companion.virtual.VirtualDeviceParams#equals(Object): - New API must be flagged with @FlaggedApi: method android.companion.virtual.VirtualDeviceParams.equals(Object) -UnflaggedApi: android.companion.virtual.VirtualDeviceParams#hashCode(): - New API must be flagged with @FlaggedApi: method android.companion.virtual.VirtualDeviceParams.hashCode() -UnflaggedApi: android.companion.virtual.VirtualDeviceParams#toString(): - New API must be flagged with @FlaggedApi: method android.companion.virtual.VirtualDeviceParams.toString() -UnflaggedApi: android.companion.virtual.sensor.VirtualSensorConfig#toString(): - New API must be flagged with @FlaggedApi: method android.companion.virtual.sensor.VirtualSensorConfig.toString() +UnflaggedApi: android.content.Context#THREAD_NETWORK_SERVICE: + New API must be flagged with @FlaggedApi: field android.content.Context.THREAD_NETWORK_SERVICE UnflaggedApi: android.content.Intent#ACTION_UNARCHIVE_PACKAGE: New API must be flagged with @FlaggedApi: field android.content.Intent.ACTION_UNARCHIVE_PACKAGE -UnflaggedApi: android.content.integrity.Rule#equals(Object): - New API must be flagged with @FlaggedApi: method android.content.integrity.Rule.equals(Object) -UnflaggedApi: android.content.integrity.Rule#hashCode(): - New API must be flagged with @FlaggedApi: method android.content.integrity.Rule.hashCode() -UnflaggedApi: android.content.integrity.Rule#toString(): - New API must be flagged with @FlaggedApi: method android.content.integrity.Rule.toString() -UnflaggedApi: android.content.pm.PackageArchiver: - New API must be flagged with @FlaggedApi: class android.content.pm.PackageArchiver -UnflaggedApi: android.content.pm.PackageArchiver#EXTRA_UNARCHIVE_ALL_USERS: - New API must be flagged with @FlaggedApi: field android.content.pm.PackageArchiver.EXTRA_UNARCHIVE_ALL_USERS -UnflaggedApi: android.content.pm.PackageArchiver#EXTRA_UNARCHIVE_PACKAGE_NAME: - New API must be flagged with @FlaggedApi: field android.content.pm.PackageArchiver.EXTRA_UNARCHIVE_PACKAGE_NAME -UnflaggedApi: android.content.pm.PackageArchiver#requestArchive(String, android.content.IntentSender): - New API must be flagged with @FlaggedApi: method android.content.pm.PackageArchiver.requestArchive(String,android.content.IntentSender) -UnflaggedApi: android.content.pm.PackageArchiver#requestUnarchive(String): - New API must be flagged with @FlaggedApi: method android.content.pm.PackageArchiver.requestUnarchive(String) -UnflaggedApi: android.content.pm.PackageInfo#isArchived: - New API must be flagged with @FlaggedApi: field android.content.pm.PackageInfo.isArchived UnflaggedApi: android.content.pm.PackageInstaller#readInstallInfo(android.os.ParcelFileDescriptor, String, int): New API must be flagged with @FlaggedApi: method android.content.pm.PackageInstaller.readInstallInfo(android.os.ParcelFileDescriptor,String,int) UnflaggedApi: android.content.pm.PackageInstaller.InstallInfo#calculateInstalledSize(android.content.pm.PackageInstaller.SessionParams, android.os.ParcelFileDescriptor): @@ -1579,320 +233,6 @@ UnflaggedApi: android.content.pm.PackageManager#EXTRA_REQUEST_PERMISSIONS_DEVICE New API must be flagged with @FlaggedApi: field android.content.pm.PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID UnflaggedApi: android.content.pm.PackageManager#MATCH_ARCHIVED_PACKAGES: New API must be flagged with @FlaggedApi: field android.content.pm.PackageManager.MATCH_ARCHIVED_PACKAGES -UnflaggedApi: android.content.pm.PackageManager#getPackageArchiver(): - New API must be flagged with @FlaggedApi: method android.content.pm.PackageManager.getPackageArchiver() -UnflaggedApi: android.content.pm.SuspendDialogInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.content.pm.SuspendDialogInfo.equals(Object) -UnflaggedApi: android.content.pm.SuspendDialogInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.content.pm.SuspendDialogInfo.hashCode() -UnflaggedApi: android.content.pm.SuspendDialogInfo#toString(): - New API must be flagged with @FlaggedApi: method android.content.pm.SuspendDialogInfo.toString() -UnflaggedApi: android.content.pm.UserProperties#toString(): - New API must be flagged with @FlaggedApi: method android.content.pm.UserProperties.toString() -UnflaggedApi: android.content.pm.verify.domain.DomainOwner#equals(Object): - New API must be flagged with @FlaggedApi: method android.content.pm.verify.domain.DomainOwner.equals(Object) -UnflaggedApi: android.content.pm.verify.domain.DomainOwner#hashCode(): - New API must be flagged with @FlaggedApi: method android.content.pm.verify.domain.DomainOwner.hashCode() -UnflaggedApi: android.content.pm.verify.domain.DomainOwner#toString(): - New API must be flagged with @FlaggedApi: method android.content.pm.verify.domain.DomainOwner.toString() -UnflaggedApi: android.content.pm.verify.domain.DomainVerificationInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.content.pm.verify.domain.DomainVerificationInfo.equals(Object) -UnflaggedApi: android.content.pm.verify.domain.DomainVerificationInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.content.pm.verify.domain.DomainVerificationInfo.hashCode() -UnflaggedApi: android.content.pm.verify.domain.DomainVerificationInfo#toString(): - New API must be flagged with @FlaggedApi: method android.content.pm.verify.domain.DomainVerificationInfo.toString() -UnflaggedApi: android.content.pm.verify.domain.DomainVerificationRequest#equals(Object): - New API must be flagged with @FlaggedApi: method android.content.pm.verify.domain.DomainVerificationRequest.equals(Object) -UnflaggedApi: android.content.pm.verify.domain.DomainVerificationRequest#hashCode(): - New API must be flagged with @FlaggedApi: method android.content.pm.verify.domain.DomainVerificationRequest.hashCode() -UnflaggedApi: android.hardware.biometrics.BiometricManager.Authenticators#BIOMETRIC_CONVENIENCE: - New API must be flagged with @FlaggedApi: field android.hardware.biometrics.BiometricManager.Authenticators.BIOMETRIC_CONVENIENCE -UnflaggedApi: android.hardware.biometrics.BiometricManager.Authenticators#EMPTY_SET: - New API must be flagged with @FlaggedApi: field android.hardware.biometrics.BiometricManager.Authenticators.EMPTY_SET -UnflaggedApi: android.hardware.display.AmbientBrightnessDayStats#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.display.AmbientBrightnessDayStats.equals(Object) -UnflaggedApi: android.hardware.display.AmbientBrightnessDayStats#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.display.AmbientBrightnessDayStats.hashCode() -UnflaggedApi: android.hardware.display.AmbientBrightnessDayStats#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.display.AmbientBrightnessDayStats.toString() -UnflaggedApi: android.hardware.display.BrightnessChangeEvent#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.display.BrightnessChangeEvent.toString() -UnflaggedApi: android.hardware.display.BrightnessConfiguration#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.display.BrightnessConfiguration.equals(Object) -UnflaggedApi: android.hardware.display.BrightnessConfiguration#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.display.BrightnessConfiguration.hashCode() -UnflaggedApi: android.hardware.display.BrightnessConfiguration#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.display.BrightnessConfiguration.toString() -UnflaggedApi: android.hardware.display.BrightnessCorrection#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.display.BrightnessCorrection.equals(Object) -UnflaggedApi: android.hardware.display.BrightnessCorrection#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.display.BrightnessCorrection.hashCode() -UnflaggedApi: android.hardware.display.BrightnessCorrection#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.display.BrightnessCorrection.toString() -UnflaggedApi: android.hardware.hdmi.HdmiDeviceInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.hdmi.HdmiDeviceInfo.equals(Object) -UnflaggedApi: android.hardware.hdmi.HdmiDeviceInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.hdmi.HdmiDeviceInfo.hashCode() -UnflaggedApi: android.hardware.hdmi.HdmiDeviceInfo#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.hdmi.HdmiDeviceInfo.toString() -UnflaggedApi: android.hardware.hdmi.HdmiPortInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.hdmi.HdmiPortInfo.equals(Object) -UnflaggedApi: android.hardware.hdmi.HdmiPortInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.hdmi.HdmiPortInfo.hashCode() -UnflaggedApi: android.hardware.hdmi.HdmiPortInfo#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.hdmi.HdmiPortInfo.toString() -UnflaggedApi: android.hardware.location.ContextHubClient#finalize(): - New API must be flagged with @FlaggedApi: method android.hardware.location.ContextHubClient.finalize() -UnflaggedApi: android.hardware.location.ContextHubInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.location.ContextHubInfo.equals(Object) -UnflaggedApi: android.hardware.location.ContextHubInfo#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.ContextHubInfo.toString() -UnflaggedApi: android.hardware.location.ContextHubIntentEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.location.ContextHubIntentEvent.equals(Object) -UnflaggedApi: android.hardware.location.ContextHubIntentEvent#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.ContextHubIntentEvent.toString() -UnflaggedApi: android.hardware.location.ContextHubMessage#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.ContextHubMessage.toString() -UnflaggedApi: android.hardware.location.GeofenceHardwareMonitorEvent#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.GeofenceHardwareMonitorEvent.toString() -UnflaggedApi: android.hardware.location.MemoryRegion#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.location.MemoryRegion.equals(Object) -UnflaggedApi: android.hardware.location.MemoryRegion#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.MemoryRegion.toString() -UnflaggedApi: android.hardware.location.NanoApp#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.NanoApp.toString() -UnflaggedApi: android.hardware.location.NanoAppFilter#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.NanoAppFilter.toString() -UnflaggedApi: android.hardware.location.NanoAppInstanceInfo#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.NanoAppInstanceInfo.toString() -UnflaggedApi: android.hardware.location.NanoAppMessage#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.location.NanoAppMessage.equals(Object) -UnflaggedApi: android.hardware.location.NanoAppMessage#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.NanoAppMessage.toString() -UnflaggedApi: android.hardware.location.NanoAppRpcService#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.location.NanoAppRpcService.equals(Object) -UnflaggedApi: android.hardware.location.NanoAppRpcService#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.location.NanoAppRpcService.hashCode() -UnflaggedApi: android.hardware.location.NanoAppRpcService#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.location.NanoAppRpcService.toString() -UnflaggedApi: android.hardware.radio.ProgramList.Filter#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.ProgramList.Filter.equals(Object) -UnflaggedApi: android.hardware.radio.ProgramList.Filter#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.ProgramList.Filter.hashCode() -UnflaggedApi: android.hardware.radio.ProgramList.Filter#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.ProgramList.Filter.toString() -UnflaggedApi: android.hardware.radio.ProgramSelector#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.ProgramSelector.equals(Object) -UnflaggedApi: android.hardware.radio.ProgramSelector#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.ProgramSelector.hashCode() -UnflaggedApi: android.hardware.radio.ProgramSelector#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.ProgramSelector.toString() -UnflaggedApi: android.hardware.radio.ProgramSelector.Identifier#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.ProgramSelector.Identifier.equals(Object) -UnflaggedApi: android.hardware.radio.ProgramSelector.Identifier#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.ProgramSelector.Identifier.hashCode() -UnflaggedApi: android.hardware.radio.ProgramSelector.Identifier#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.ProgramSelector.Identifier.toString() -UnflaggedApi: android.hardware.radio.RadioManager.AmBandConfig#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.AmBandConfig.equals(Object) -UnflaggedApi: android.hardware.radio.RadioManager.AmBandConfig#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.AmBandConfig.hashCode() -UnflaggedApi: android.hardware.radio.RadioManager.AmBandConfig#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.AmBandConfig.toString() -UnflaggedApi: android.hardware.radio.RadioManager.AmBandDescriptor#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.AmBandDescriptor.equals(Object) -UnflaggedApi: android.hardware.radio.RadioManager.AmBandDescriptor#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.AmBandDescriptor.hashCode() -UnflaggedApi: android.hardware.radio.RadioManager.AmBandDescriptor#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.AmBandDescriptor.toString() -UnflaggedApi: android.hardware.radio.RadioManager.BandConfig#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.BandConfig.equals(Object) -UnflaggedApi: android.hardware.radio.RadioManager.BandConfig#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.BandConfig.hashCode() -UnflaggedApi: android.hardware.radio.RadioManager.BandConfig#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.BandConfig.toString() -UnflaggedApi: android.hardware.radio.RadioManager.BandDescriptor#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.BandDescriptor.equals(Object) -UnflaggedApi: android.hardware.radio.RadioManager.BandDescriptor#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.BandDescriptor.hashCode() -UnflaggedApi: android.hardware.radio.RadioManager.BandDescriptor#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.BandDescriptor.toString() -UnflaggedApi: android.hardware.radio.RadioManager.FmBandConfig#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.FmBandConfig.equals(Object) -UnflaggedApi: android.hardware.radio.RadioManager.FmBandConfig#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.FmBandConfig.hashCode() -UnflaggedApi: android.hardware.radio.RadioManager.FmBandConfig#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.FmBandConfig.toString() -UnflaggedApi: android.hardware.radio.RadioManager.FmBandDescriptor#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.FmBandDescriptor.equals(Object) -UnflaggedApi: android.hardware.radio.RadioManager.FmBandDescriptor#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.FmBandDescriptor.hashCode() -UnflaggedApi: android.hardware.radio.RadioManager.FmBandDescriptor#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.FmBandDescriptor.toString() -UnflaggedApi: android.hardware.radio.RadioManager.ModuleProperties#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.ModuleProperties.equals(Object) -UnflaggedApi: android.hardware.radio.RadioManager.ModuleProperties#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.ModuleProperties.hashCode() -UnflaggedApi: android.hardware.radio.RadioManager.ModuleProperties#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.ModuleProperties.toString() -UnflaggedApi: android.hardware.radio.RadioManager.ProgramInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.ProgramInfo.equals(Object) -UnflaggedApi: android.hardware.radio.RadioManager.ProgramInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.ProgramInfo.hashCode() -UnflaggedApi: android.hardware.radio.RadioManager.ProgramInfo#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioManager.ProgramInfo.toString() -UnflaggedApi: android.hardware.radio.RadioMetadata#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioMetadata.equals(Object) -UnflaggedApi: android.hardware.radio.RadioMetadata#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioMetadata.hashCode() -UnflaggedApi: android.hardware.radio.RadioMetadata#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.radio.RadioMetadata.toString() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.Keyphrase#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.Keyphrase.equals(Object) -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.Keyphrase#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.Keyphrase.hashCode() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.Keyphrase#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.Keyphrase.toString() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra.equals(Object) -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra.hashCode() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra.toString() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel.equals(Object) -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel.hashCode() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel.toString() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.ModelParamRange#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.ModelParamRange.equals(Object) -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.ModelParamRange#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.ModelParamRange.toString() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.ModuleProperties#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.ModuleProperties.equals(Object) -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.ModuleProperties#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.ModuleProperties.hashCode() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.ModuleProperties#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.ModuleProperties.toString() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.RecognitionEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.RecognitionEvent.equals(Object) -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.RecognitionEvent#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.RecognitionEvent.hashCode() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.RecognitionEvent#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.RecognitionEvent.toString() -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.SoundModel#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.SoundModel.equals(Object) -UnflaggedApi: android.hardware.soundtrigger.SoundTrigger.SoundModel#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.soundtrigger.SoundTrigger.SoundModel.hashCode() -UnflaggedApi: android.hardware.usb.DisplayPortAltModeInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.hardware.usb.DisplayPortAltModeInfo.equals(Object) -UnflaggedApi: android.hardware.usb.DisplayPortAltModeInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.hardware.usb.DisplayPortAltModeInfo.hashCode() -UnflaggedApi: android.hardware.usb.DisplayPortAltModeInfo#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.usb.DisplayPortAltModeInfo.toString() -UnflaggedApi: android.hardware.usb.UsbPort#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.usb.UsbPort.toString() -UnflaggedApi: android.hardware.usb.UsbPortStatus#toString(): - New API must be flagged with @FlaggedApi: method android.hardware.usb.UsbPortStatus.toString() -UnflaggedApi: android.location.CorrelationVector#equals(Object): - New API must be flagged with @FlaggedApi: method android.location.CorrelationVector.equals(Object) -UnflaggedApi: android.location.CorrelationVector#hashCode(): - New API must be flagged with @FlaggedApi: method android.location.CorrelationVector.hashCode() -UnflaggedApi: android.location.CorrelationVector#toString(): - New API must be flagged with @FlaggedApi: method android.location.CorrelationVector.toString() -UnflaggedApi: android.location.Country#equals(Object): - New API must be flagged with @FlaggedApi: method android.location.Country.equals(Object) -UnflaggedApi: android.location.Country#hashCode(): - New API must be flagged with @FlaggedApi: method android.location.Country.hashCode() -UnflaggedApi: android.location.Country#toString(): - New API must be flagged with @FlaggedApi: method android.location.Country.toString() -UnflaggedApi: android.location.GnssExcessPathInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.location.GnssExcessPathInfo.equals(Object) -UnflaggedApi: android.location.GnssExcessPathInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.location.GnssExcessPathInfo.hashCode() -UnflaggedApi: android.location.GnssExcessPathInfo#toString(): - New API must be flagged with @FlaggedApi: method android.location.GnssExcessPathInfo.toString() -UnflaggedApi: android.location.GnssMeasurementCorrections#toString(): - New API must be flagged with @FlaggedApi: method android.location.GnssMeasurementCorrections.toString() -UnflaggedApi: android.location.GnssMeasurementRequest#getWorkSource(): - New API must be flagged with @FlaggedApi: method android.location.GnssMeasurementRequest.getWorkSource() -UnflaggedApi: android.location.GnssMeasurementRequest.Builder#setWorkSource(android.os.WorkSource): - New API must be flagged with @FlaggedApi: method android.location.GnssMeasurementRequest.Builder.setWorkSource(android.os.WorkSource) -UnflaggedApi: android.location.GnssReflectingPlane#equals(Object): - New API must be flagged with @FlaggedApi: method android.location.GnssReflectingPlane.equals(Object) -UnflaggedApi: android.location.GnssReflectingPlane#hashCode(): - New API must be flagged with @FlaggedApi: method android.location.GnssReflectingPlane.hashCode() -UnflaggedApi: android.location.GnssReflectingPlane#toString(): - New API must be flagged with @FlaggedApi: method android.location.GnssReflectingPlane.toString() -UnflaggedApi: android.location.GnssRequest#equals(Object): - New API must be flagged with @FlaggedApi: method android.location.GnssRequest.equals(Object) -UnflaggedApi: android.location.GnssRequest#hashCode(): - New API must be flagged with @FlaggedApi: method android.location.GnssRequest.hashCode() -UnflaggedApi: android.location.GnssRequest#toString(): - New API must be flagged with @FlaggedApi: method android.location.GnssRequest.toString() -UnflaggedApi: android.location.GnssSingleSatCorrection#equals(Object): - New API must be flagged with @FlaggedApi: method android.location.GnssSingleSatCorrection.equals(Object) -UnflaggedApi: android.location.GnssSingleSatCorrection#hashCode(): - New API must be flagged with @FlaggedApi: method android.location.GnssSingleSatCorrection.hashCode() -UnflaggedApi: android.location.GnssSingleSatCorrection#toString(): - New API must be flagged with @FlaggedApi: method android.location.GnssSingleSatCorrection.toString() -UnflaggedApi: android.location.GpsClock#toString(): - New API must be flagged with @FlaggedApi: method android.location.GpsClock.toString() -UnflaggedApi: android.location.GpsMeasurement#toString(): - New API must be flagged with @FlaggedApi: method android.location.GpsMeasurement.toString() -UnflaggedApi: android.location.GpsMeasurementsEvent#toString(): - New API must be flagged with @FlaggedApi: method android.location.GpsMeasurementsEvent.toString() -UnflaggedApi: android.location.GpsNavigationMessage#toString(): - New API must be flagged with @FlaggedApi: method android.location.GpsNavigationMessage.toString() -UnflaggedApi: android.location.GpsNavigationMessageEvent#toString(): - New API must be flagged with @FlaggedApi: method android.location.GpsNavigationMessageEvent.toString() -UnflaggedApi: android.location.LastLocationRequest#equals(Object): - New API must be flagged with @FlaggedApi: method android.location.LastLocationRequest.equals(Object) -UnflaggedApi: android.location.LastLocationRequest#hashCode(): - New API must be flagged with @FlaggedApi: method android.location.LastLocationRequest.hashCode() -UnflaggedApi: android.location.LastLocationRequest#toString(): - New API must be flagged with @FlaggedApi: method android.location.LastLocationRequest.toString() -UnflaggedApi: android.location.SatellitePvt#toString(): - New API must be flagged with @FlaggedApi: method android.location.SatellitePvt.toString() -UnflaggedApi: android.location.SatellitePvt.ClockInfo#toString(): - New API must be flagged with @FlaggedApi: method android.location.SatellitePvt.ClockInfo.toString() -UnflaggedApi: android.location.SatellitePvt.PositionEcef#toString(): - New API must be flagged with @FlaggedApi: method android.location.SatellitePvt.PositionEcef.toString() -UnflaggedApi: android.location.SatellitePvt.VelocityEcef#toString(): - New API must be flagged with @FlaggedApi: method android.location.SatellitePvt.VelocityEcef.toString() -UnflaggedApi: android.location.provider.ProviderRequest#equals(Object): - New API must be flagged with @FlaggedApi: method android.location.provider.ProviderRequest.equals(Object) -UnflaggedApi: android.location.provider.ProviderRequest#hashCode(): - New API must be flagged with @FlaggedApi: method android.location.provider.ProviderRequest.hashCode() -UnflaggedApi: android.location.provider.ProviderRequest#toString(): - New API must be flagged with @FlaggedApi: method android.location.provider.ProviderRequest.toString() -UnflaggedApi: android.media.AudioDeviceAttributes#equals(Object): - New API must be flagged with @FlaggedApi: method android.media.AudioDeviceAttributes.equals(Object) -UnflaggedApi: android.media.AudioDeviceAttributes#hashCode(): - New API must be flagged with @FlaggedApi: method android.media.AudioDeviceAttributes.hashCode() -UnflaggedApi: android.media.AudioDeviceAttributes#toString(): - New API must be flagged with @FlaggedApi: method android.media.AudioDeviceAttributes.toString() -UnflaggedApi: android.media.AudioFocusInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.media.AudioFocusInfo.equals(Object) -UnflaggedApi: android.media.AudioFocusInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.media.AudioFocusInfo.hashCode() -UnflaggedApi: android.media.MediaRecorder.AudioSource#ECHO_REFERENCE: - New API must be flagged with @FlaggedApi: field android.media.MediaRecorder.AudioSource.ECHO_REFERENCE -UnflaggedApi: android.media.MediaRecorder.AudioSource#HOTWORD: - New API must be flagged with @FlaggedApi: field android.media.MediaRecorder.AudioSource.HOTWORD -UnflaggedApi: android.media.MediaRecorder.AudioSource#RADIO_TUNER: - New API must be flagged with @FlaggedApi: field android.media.MediaRecorder.AudioSource.RADIO_TUNER -UnflaggedApi: android.media.MediaRecorder.AudioSource#ULTRASOUND: - New API must be flagged with @FlaggedApi: field android.media.MediaRecorder.AudioSource.ULTRASOUND -UnflaggedApi: android.media.NearbyDevice#toString(): - New API must be flagged with @FlaggedApi: method android.media.NearbyDevice.toString() -UnflaggedApi: android.media.VolumeInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.media.VolumeInfo.equals(Object) -UnflaggedApi: android.media.VolumeInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.media.VolumeInfo.hashCode() -UnflaggedApi: android.media.VolumeInfo#toString(): - New API must be flagged with @FlaggedApi: method android.media.VolumeInfo.toString() UnflaggedApi: android.media.audiopolicy.AudioMix#CREATOR: New API must be flagged with @FlaggedApi: field android.media.audiopolicy.AudioMix.CREATOR UnflaggedApi: android.media.audiopolicy.AudioMix#describeContents(): @@ -1903,578 +243,22 @@ UnflaggedApi: android.media.audiopolicy.AudioMixingRule#CREATOR: New API must be flagged with @FlaggedApi: field android.media.audiopolicy.AudioMixingRule.CREATOR UnflaggedApi: android.media.audiopolicy.AudioMixingRule#describeContents(): New API must be flagged with @FlaggedApi: method android.media.audiopolicy.AudioMixingRule.describeContents() -UnflaggedApi: android.media.audiopolicy.AudioMixingRule#hashCode(): - New API must be flagged with @FlaggedApi: method android.media.audiopolicy.AudioMixingRule.hashCode() UnflaggedApi: android.media.audiopolicy.AudioMixingRule#writeToParcel(android.os.Parcel, int): New API must be flagged with @FlaggedApi: method android.media.audiopolicy.AudioMixingRule.writeToParcel(android.os.Parcel,int) UnflaggedApi: android.media.audiopolicy.AudioPolicy#updateMixingRules(java.util.List<android.util.Pair<android.media.audiopolicy.AudioMix,android.media.audiopolicy.AudioMixingRule>>): New API must be flagged with @FlaggedApi: method android.media.audiopolicy.AudioPolicy.updateMixingRules(java.util.List<android.util.Pair<android.media.audiopolicy.AudioMix,android.media.audiopolicy.AudioMixingRule>>) -UnflaggedApi: android.media.audiopolicy.AudioProductStrategy#equals(Object): - New API must be flagged with @FlaggedApi: method android.media.audiopolicy.AudioProductStrategy.equals(Object) -UnflaggedApi: android.media.audiopolicy.AudioProductStrategy#hashCode(): - New API must be flagged with @FlaggedApi: method android.media.audiopolicy.AudioProductStrategy.hashCode() -UnflaggedApi: android.media.audiopolicy.AudioProductStrategy#toString(): - New API must be flagged with @FlaggedApi: method android.media.audiopolicy.AudioProductStrategy.toString() -UnflaggedApi: android.media.audiopolicy.AudioVolumeGroup#equals(Object): - New API must be flagged with @FlaggedApi: method android.media.audiopolicy.AudioVolumeGroup.equals(Object) -UnflaggedApi: android.media.audiopolicy.AudioVolumeGroup#toString(): - New API must be flagged with @FlaggedApi: method android.media.audiopolicy.AudioVolumeGroup.toString() -UnflaggedApi: android.media.musicrecognition.MusicRecognitionService#onCreate(): - New API must be flagged with @FlaggedApi: method android.media.musicrecognition.MusicRecognitionService.onCreate() -UnflaggedApi: android.media.soundtrigger.SoundTriggerDetectionService#onUnbind(android.content.Intent): - New API must be flagged with @FlaggedApi: method android.media.soundtrigger.SoundTriggerDetectionService.onUnbind(android.content.Intent) -UnflaggedApi: android.media.tv.TunedInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.media.tv.TunedInfo.equals(Object) -UnflaggedApi: android.media.tv.TunedInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.media.tv.TunedInfo.hashCode() -UnflaggedApi: android.media.tv.TunedInfo#toString(): - New API must be flagged with @FlaggedApi: method android.media.tv.TunedInfo.toString() -UnflaggedApi: android.media.tv.TvInputHardwareInfo#toString(): - New API must be flagged with @FlaggedApi: method android.media.tv.TvInputHardwareInfo.toString() -UnflaggedApi: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle): - New API must be flagged with @FlaggedApi: method android.media.tv.TvRecordingClient.RecordingCallback.onEvent(String,String,android.os.Bundle) -UnflaggedApi: android.media.tv.TvStreamConfig#equals(Object): - New API must be flagged with @FlaggedApi: method android.media.tv.TvStreamConfig.equals(Object) -UnflaggedApi: android.media.tv.TvStreamConfig#toString(): - New API must be flagged with @FlaggedApi: method android.media.tv.TvStreamConfig.toString() -UnflaggedApi: android.net.MatchAllNetworkSpecifier#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.MatchAllNetworkSpecifier.equals(Object) -UnflaggedApi: android.net.MatchAllNetworkSpecifier#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.MatchAllNetworkSpecifier.hashCode() -UnflaggedApi: android.net.NetworkKey#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.NetworkKey.equals(Object) -UnflaggedApi: android.net.NetworkKey#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.NetworkKey.hashCode() -UnflaggedApi: android.net.NetworkKey#toString(): - New API must be flagged with @FlaggedApi: method android.net.NetworkKey.toString() -UnflaggedApi: android.net.RssiCurve#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.RssiCurve.equals(Object) -UnflaggedApi: android.net.RssiCurve#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.RssiCurve.hashCode() -UnflaggedApi: android.net.RssiCurve#toString(): - New API must be flagged with @FlaggedApi: method android.net.RssiCurve.toString() -UnflaggedApi: android.net.ScoredNetwork#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.ScoredNetwork.equals(Object) -UnflaggedApi: android.net.ScoredNetwork#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.ScoredNetwork.hashCode() -UnflaggedApi: android.net.ScoredNetwork#toString(): - New API must be flagged with @FlaggedApi: method android.net.ScoredNetwork.toString() -UnflaggedApi: android.net.WebAddress#toString(): - New API must be flagged with @FlaggedApi: method android.net.WebAddress.toString() -UnflaggedApi: android.net.WifiKey#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.WifiKey.equals(Object) -UnflaggedApi: android.net.WifiKey#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.WifiKey.hashCode() -UnflaggedApi: android.net.WifiKey#toString(): - New API must be flagged with @FlaggedApi: method android.net.WifiKey.toString() -UnflaggedApi: android.net.metrics.ApfProgramEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.metrics.ApfProgramEvent.equals(Object) -UnflaggedApi: android.net.metrics.ApfProgramEvent#toString(): - New API must be flagged with @FlaggedApi: method android.net.metrics.ApfProgramEvent.toString() -UnflaggedApi: android.net.metrics.ApfStats#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.metrics.ApfStats.equals(Object) -UnflaggedApi: android.net.metrics.ApfStats#toString(): - New API must be flagged with @FlaggedApi: method android.net.metrics.ApfStats.toString() -UnflaggedApi: android.net.metrics.DhcpClientEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.metrics.DhcpClientEvent.equals(Object) -UnflaggedApi: android.net.metrics.DhcpClientEvent#toString(): - New API must be flagged with @FlaggedApi: method android.net.metrics.DhcpClientEvent.toString() -UnflaggedApi: android.net.metrics.DhcpErrorEvent#toString(): - New API must be flagged with @FlaggedApi: method android.net.metrics.DhcpErrorEvent.toString() -UnflaggedApi: android.net.metrics.IpManagerEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.metrics.IpManagerEvent.equals(Object) -UnflaggedApi: android.net.metrics.IpManagerEvent#toString(): - New API must be flagged with @FlaggedApi: method android.net.metrics.IpManagerEvent.toString() -UnflaggedApi: android.net.metrics.IpReachabilityEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.metrics.IpReachabilityEvent.equals(Object) -UnflaggedApi: android.net.metrics.IpReachabilityEvent#toString(): - New API must be flagged with @FlaggedApi: method android.net.metrics.IpReachabilityEvent.toString() -UnflaggedApi: android.net.metrics.NetworkEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.metrics.NetworkEvent.equals(Object) -UnflaggedApi: android.net.metrics.NetworkEvent#toString(): - New API must be flagged with @FlaggedApi: method android.net.metrics.NetworkEvent.toString() -UnflaggedApi: android.net.metrics.RaEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.metrics.RaEvent.equals(Object) -UnflaggedApi: android.net.metrics.RaEvent#toString(): - New API must be flagged with @FlaggedApi: method android.net.metrics.RaEvent.toString() -UnflaggedApi: android.net.metrics.ValidationProbeEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.metrics.ValidationProbeEvent.equals(Object) -UnflaggedApi: android.net.metrics.ValidationProbeEvent#toString(): - New API must be flagged with @FlaggedApi: method android.net.metrics.ValidationProbeEvent.toString() -UnflaggedApi: android.net.vcn.VcnNetworkPolicyResult#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.vcn.VcnNetworkPolicyResult.equals(Object) -UnflaggedApi: android.net.vcn.VcnNetworkPolicyResult#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.vcn.VcnNetworkPolicyResult.hashCode() -UnflaggedApi: android.net.vcn.VcnNetworkPolicyResult#toString(): - New API must be flagged with @FlaggedApi: method android.net.vcn.VcnNetworkPolicyResult.toString() -UnflaggedApi: android.net.wifi.nl80211.DeviceWiphyCapabilities#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.DeviceWiphyCapabilities.equals(Object) -UnflaggedApi: android.net.wifi.nl80211.DeviceWiphyCapabilities#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.DeviceWiphyCapabilities.hashCode() -UnflaggedApi: android.net.wifi.nl80211.DeviceWiphyCapabilities#toString(): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.DeviceWiphyCapabilities.toString() -UnflaggedApi: android.net.wifi.nl80211.NativeWifiClient#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.NativeWifiClient.equals(Object) -UnflaggedApi: android.net.wifi.nl80211.NativeWifiClient#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.NativeWifiClient.hashCode() -UnflaggedApi: android.net.wifi.nl80211.PnoNetwork#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.PnoNetwork.equals(Object) -UnflaggedApi: android.net.wifi.nl80211.PnoNetwork#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.PnoNetwork.hashCode() -UnflaggedApi: android.net.wifi.nl80211.PnoSettings#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.PnoSettings.equals(Object) -UnflaggedApi: android.net.wifi.nl80211.PnoSettings#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.PnoSettings.hashCode() -UnflaggedApi: android.net.wifi.nl80211.RadioChainInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.RadioChainInfo.equals(Object) -UnflaggedApi: android.net.wifi.nl80211.RadioChainInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.nl80211.RadioChainInfo.hashCode() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.HotspotNetwork#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.HotspotNetwork.equals(Object) -UnflaggedApi: android.net.wifi.sharedconnectivity.app.HotspotNetwork#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.HotspotNetwork.hashCode() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.HotspotNetwork#toString(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.HotspotNetwork.toString() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus.equals(Object) -UnflaggedApi: android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus.hashCode() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus#toString(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus.toString() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.KnownNetwork#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.KnownNetwork.equals(Object) -UnflaggedApi: android.net.wifi.sharedconnectivity.app.KnownNetwork#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.KnownNetwork.hashCode() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.KnownNetwork#toString(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.KnownNetwork.toString() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.equals(Object) -UnflaggedApi: android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.hashCode() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus#toString(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.toString() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.NetworkProviderInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.equals(Object) -UnflaggedApi: android.net.wifi.sharedconnectivity.app.NetworkProviderInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.hashCode() UnflaggedApi: android.net.wifi.sharedconnectivity.app.NetworkProviderInfo#isBatteryCharging(): New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.isBatteryCharging() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.NetworkProviderInfo#toString(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.toString() UnflaggedApi: android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.Builder#setBatteryCharging(boolean): New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.Builder.setBatteryCharging(boolean) -UnflaggedApi: android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState#equals(Object): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.equals(Object) -UnflaggedApi: android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState#hashCode(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.hashCode() -UnflaggedApi: android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState#toString(): - New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState.toString() -UnflaggedApi: android.os.BatterySaverPolicyConfig#toString(): - New API must be flagged with @FlaggedApi: method android.os.BatterySaverPolicyConfig.toString() UnflaggedApi: android.os.BugreportParams#BUGREPORT_MODE_ONBOARDING: New API must be flagged with @FlaggedApi: field android.os.BugreportParams.BUGREPORT_MODE_ONBOARDING -UnflaggedApi: android.os.Build.VERSION#KNOWN_CODENAMES: - New API must be flagged with @FlaggedApi: field android.os.Build.VERSION.KNOWN_CODENAMES -UnflaggedApi: android.os.Build.VERSION#PREVIEW_SDK_FINGERPRINT: - New API must be flagged with @FlaggedApi: field android.os.Build.VERSION.PREVIEW_SDK_FINGERPRINT -UnflaggedApi: android.os.IncidentManager.PendingReport#equals(Object): - New API must be flagged with @FlaggedApi: method android.os.IncidentManager.PendingReport.equals(Object) -UnflaggedApi: android.os.IncidentManager.PendingReport#toString(): - New API must be flagged with @FlaggedApi: method android.os.IncidentManager.PendingReport.toString() -UnflaggedApi: android.os.IncidentReportArgs#toString(): - New API must be flagged with @FlaggedApi: method android.os.IncidentReportArgs.toString() -UnflaggedApi: android.os.NewUserRequest#toString(): - New API must be flagged with @FlaggedApi: method android.os.NewUserRequest.toString() -UnflaggedApi: android.os.NewUserResponse#toString(): - New API must be flagged with @FlaggedApi: method android.os.NewUserResponse.toString() -UnflaggedApi: android.os.PowerManager.LowPowerStandbyPolicy#equals(Object): - New API must be flagged with @FlaggedApi: method android.os.PowerManager.LowPowerStandbyPolicy.equals(Object) -UnflaggedApi: android.os.PowerManager.LowPowerStandbyPolicy#hashCode(): - New API must be flagged with @FlaggedApi: method android.os.PowerManager.LowPowerStandbyPolicy.hashCode() -UnflaggedApi: android.os.PowerManager.LowPowerStandbyPolicy#toString(): - New API must be flagged with @FlaggedApi: method android.os.PowerManager.LowPowerStandbyPolicy.toString() -UnflaggedApi: android.os.PowerManager.LowPowerStandbyPortDescription#equals(Object): - New API must be flagged with @FlaggedApi: method android.os.PowerManager.LowPowerStandbyPortDescription.equals(Object) -UnflaggedApi: android.os.PowerManager.LowPowerStandbyPortDescription#hashCode(): - New API must be flagged with @FlaggedApi: method android.os.PowerManager.LowPowerStandbyPortDescription.hashCode() -UnflaggedApi: android.os.PowerManager.LowPowerStandbyPortDescription#toString(): - New API must be flagged with @FlaggedApi: method android.os.PowerManager.LowPowerStandbyPortDescription.toString() -UnflaggedApi: android.os.ServiceSpecificException#toString(): - New API must be flagged with @FlaggedApi: method android.os.ServiceSpecificException.toString() -UnflaggedApi: android.os.WorkSource.WorkChain#equals(Object): - New API must be flagged with @FlaggedApi: method android.os.WorkSource.WorkChain.equals(Object) -UnflaggedApi: android.os.WorkSource.WorkChain#hashCode(): - New API must be flagged with @FlaggedApi: method android.os.WorkSource.WorkChain.hashCode() -UnflaggedApi: android.os.WorkSource.WorkChain#toString(): - New API must be flagged with @FlaggedApi: method android.os.WorkSource.WorkChain.toString() -UnflaggedApi: android.os.connectivity.CellularBatteryStats#equals(Object): - New API must be flagged with @FlaggedApi: method android.os.connectivity.CellularBatteryStats.equals(Object) -UnflaggedApi: android.os.connectivity.CellularBatteryStats#hashCode(): - New API must be flagged with @FlaggedApi: method android.os.connectivity.CellularBatteryStats.hashCode() -UnflaggedApi: android.os.connectivity.WifiActivityEnergyInfo#toString(): - New API must be flagged with @FlaggedApi: method android.os.connectivity.WifiActivityEnergyInfo.toString() -UnflaggedApi: android.os.connectivity.WifiBatteryStats#equals(Object): - New API must be flagged with @FlaggedApi: method android.os.connectivity.WifiBatteryStats.equals(Object) -UnflaggedApi: android.os.connectivity.WifiBatteryStats#hashCode(): - New API must be flagged with @FlaggedApi: method android.os.connectivity.WifiBatteryStats.hashCode() -UnflaggedApi: android.permission.AdminPermissionControlParams#toString(): - New API must be flagged with @FlaggedApi: method android.permission.AdminPermissionControlParams.toString() -UnflaggedApi: android.permission.PermissionGroupUsage#equals(Object): - New API must be flagged with @FlaggedApi: method android.permission.PermissionGroupUsage.equals(Object) -UnflaggedApi: android.permission.PermissionGroupUsage#hashCode(): - New API must be flagged with @FlaggedApi: method android.permission.PermissionGroupUsage.hashCode() -UnflaggedApi: android.permission.PermissionGroupUsage#toString(): - New API must be flagged with @FlaggedApi: method android.permission.PermissionGroupUsage.toString() -UnflaggedApi: android.permission.PermissionManager.SplitPermissionInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.permission.PermissionManager.SplitPermissionInfo.equals(Object) -UnflaggedApi: android.permission.PermissionManager.SplitPermissionInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.permission.PermissionManager.SplitPermissionInfo.hashCode() -UnflaggedApi: android.printservice.PrintServiceInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.printservice.PrintServiceInfo.equals(Object) -UnflaggedApi: android.printservice.PrintServiceInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.printservice.PrintServiceInfo.hashCode() -UnflaggedApi: android.printservice.PrintServiceInfo#toString(): - New API must be flagged with @FlaggedApi: method android.printservice.PrintServiceInfo.toString() -UnflaggedApi: android.printservice.recommendation.RecommendationService#attachBaseContext(android.content.Context): - New API must be flagged with @FlaggedApi: method android.printservice.recommendation.RecommendationService.attachBaseContext(android.content.Context) -UnflaggedApi: android.provider.CallLog.CallComposerLoggingException#toString(): - New API must be flagged with @FlaggedApi: method android.provider.CallLog.CallComposerLoggingException.toString() -UnflaggedApi: android.provider.ContactsContract.MetadataSync#CONTENT_ITEM_TYPE: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSync.CONTENT_ITEM_TYPE -UnflaggedApi: android.provider.ContactsContract.MetadataSync#CONTENT_TYPE: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSync.CONTENT_TYPE -UnflaggedApi: android.provider.ContactsContract.MetadataSync#CONTENT_URI: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSync.CONTENT_URI -UnflaggedApi: android.provider.ContactsContract.MetadataSync#METADATA_AUTHORITY: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSync.METADATA_AUTHORITY -UnflaggedApi: android.provider.ContactsContract.MetadataSync#METADATA_AUTHORITY_URI: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSync.METADATA_AUTHORITY_URI -UnflaggedApi: android.provider.ContactsContract.MetadataSync#_COUNT: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSync._COUNT -UnflaggedApi: android.provider.ContactsContract.MetadataSync#_ID: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSync._ID -UnflaggedApi: android.provider.ContactsContract.MetadataSyncColumns#ACCOUNT_NAME: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncColumns.ACCOUNT_NAME -UnflaggedApi: android.provider.ContactsContract.MetadataSyncColumns#ACCOUNT_TYPE: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncColumns.ACCOUNT_TYPE -UnflaggedApi: android.provider.ContactsContract.MetadataSyncColumns#DATA: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncColumns.DATA -UnflaggedApi: android.provider.ContactsContract.MetadataSyncColumns#DATA_SET: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncColumns.DATA_SET -UnflaggedApi: android.provider.ContactsContract.MetadataSyncColumns#DELETED: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncColumns.DELETED -UnflaggedApi: android.provider.ContactsContract.MetadataSyncColumns#RAW_CONTACT_BACKUP_ID: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncColumns.RAW_CONTACT_BACKUP_ID -UnflaggedApi: android.provider.ContactsContract.MetadataSyncState#CONTENT_ITEM_TYPE: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncState.CONTENT_ITEM_TYPE -UnflaggedApi: android.provider.ContactsContract.MetadataSyncState#CONTENT_TYPE: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncState.CONTENT_TYPE -UnflaggedApi: android.provider.ContactsContract.MetadataSyncState#CONTENT_URI: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncState.CONTENT_URI -UnflaggedApi: android.provider.ContactsContract.MetadataSyncState#_COUNT: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncState._COUNT -UnflaggedApi: android.provider.ContactsContract.MetadataSyncState#_ID: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncState._ID -UnflaggedApi: android.provider.ContactsContract.MetadataSyncStateColumns#ACCOUNT_NAME: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncStateColumns.ACCOUNT_NAME -UnflaggedApi: android.provider.ContactsContract.MetadataSyncStateColumns#ACCOUNT_TYPE: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncStateColumns.ACCOUNT_TYPE -UnflaggedApi: android.provider.ContactsContract.MetadataSyncStateColumns#DATA_SET: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncStateColumns.DATA_SET -UnflaggedApi: android.provider.ContactsContract.MetadataSyncStateColumns#STATE: - New API must be flagged with @FlaggedApi: field android.provider.ContactsContract.MetadataSyncStateColumns.STATE -UnflaggedApi: android.provider.ContactsContract.Settings#setDefaultAccount(android.content.ContentResolver, android.accounts.Account): - New API must be flagged with @FlaggedApi: method android.provider.ContactsContract.Settings.setDefaultAccount(android.content.ContentResolver,android.accounts.Account) -UnflaggedApi: android.provider.ContactsContract.SimContacts#addSimAccount(android.content.ContentResolver, String, String, int, int): - New API must be flagged with @FlaggedApi: method android.provider.ContactsContract.SimContacts.addSimAccount(android.content.ContentResolver,String,String,int,int) -UnflaggedApi: android.provider.ContactsContract.SimContacts#removeSimAccounts(android.content.ContentResolver, int): - New API must be flagged with @FlaggedApi: method android.provider.ContactsContract.SimContacts.removeSimAccounts(android.content.ContentResolver,int) -UnflaggedApi: android.provider.SearchIndexableData#toString(): - New API must be flagged with @FlaggedApi: method android.provider.SearchIndexableData.toString() -UnflaggedApi: android.provider.SearchIndexableResource#toString(): - New API must be flagged with @FlaggedApi: method android.provider.SearchIndexableResource.toString() -UnflaggedApi: android.provider.SearchIndexablesProvider#attachInfo(android.content.Context, android.content.pm.ProviderInfo): - New API must be flagged with @FlaggedApi: method android.provider.SearchIndexablesProvider.attachInfo(android.content.Context,android.content.pm.ProviderInfo) UnflaggedApi: android.provider.Settings#ACTION_APP_PERMISSIONS_SETTINGS: New API must be flagged with @FlaggedApi: field android.provider.Settings.ACTION_APP_PERMISSIONS_SETTINGS UnflaggedApi: android.provider.Settings.System#putString(android.content.ContentResolver, String, String, boolean, boolean): New API must be flagged with @FlaggedApi: method android.provider.Settings.System.putString(android.content.ContentResolver,String,String,boolean,boolean) UnflaggedApi: android.provider.Settings.System#resetToDefaults(android.content.ContentResolver, String): New API must be flagged with @FlaggedApi: method android.provider.Settings.System.resetToDefaults(android.content.ContentResolver,String) -UnflaggedApi: android.provider.SimPhonebookContract.SimRecords#QUERY_ARG_PIN2: - New API must be flagged with @FlaggedApi: field android.provider.SimPhonebookContract.SimRecords.QUERY_ARG_PIN2 -UnflaggedApi: android.provider.Telephony.Carriers#APN_SET_ID: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.APN_SET_ID -UnflaggedApi: android.provider.Telephony.Carriers#CARRIER_EDITED: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.CARRIER_EDITED -UnflaggedApi: android.provider.Telephony.Carriers#EDITED_STATUS: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.EDITED_STATUS -UnflaggedApi: android.provider.Telephony.Carriers#MATCH_ALL_APN_SET_ID: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.MATCH_ALL_APN_SET_ID -UnflaggedApi: android.provider.Telephony.Carriers#MAX_CONNECTIONS: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.MAX_CONNECTIONS -UnflaggedApi: android.provider.Telephony.Carriers#MODEM_PERSIST: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.MODEM_PERSIST -UnflaggedApi: android.provider.Telephony.Carriers#MTU_V4: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.MTU_V4 -UnflaggedApi: android.provider.Telephony.Carriers#MTU_V6: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.MTU_V6 -UnflaggedApi: android.provider.Telephony.Carriers#NO_APN_SET_ID: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.NO_APN_SET_ID -UnflaggedApi: android.provider.Telephony.Carriers#TIME_LIMIT_FOR_MAX_CONNECTIONS: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.TIME_LIMIT_FOR_MAX_CONNECTIONS -UnflaggedApi: android.provider.Telephony.Carriers#UNEDITED: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.UNEDITED -UnflaggedApi: android.provider.Telephony.Carriers#USER_DELETED: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.USER_DELETED -UnflaggedApi: android.provider.Telephony.Carriers#USER_EDITABLE: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.USER_EDITABLE -UnflaggedApi: android.provider.Telephony.Carriers#USER_EDITED: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.USER_EDITED -UnflaggedApi: android.provider.Telephony.Carriers#USER_VISIBLE: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.USER_VISIBLE -UnflaggedApi: android.provider.Telephony.Carriers#WAIT_TIME_RETRY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Carriers.WAIT_TIME_RETRY -UnflaggedApi: android.provider.Telephony.CellBroadcasts: - New API must be flagged with @FlaggedApi: class android.provider.Telephony.CellBroadcasts -UnflaggedApi: android.provider.Telephony.CellBroadcasts#AUTHORITY_LEGACY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.AUTHORITY_LEGACY -UnflaggedApi: android.provider.Telephony.CellBroadcasts#AUTHORITY_LEGACY_URI: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.AUTHORITY_LEGACY_URI -UnflaggedApi: android.provider.Telephony.CellBroadcasts#CALL_METHOD_GET_PREFERENCE: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.CALL_METHOD_GET_PREFERENCE -UnflaggedApi: android.provider.Telephony.CellBroadcasts#CID: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.CID -UnflaggedApi: android.provider.Telephony.CellBroadcasts#CMAS_CATEGORY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.CMAS_CATEGORY -UnflaggedApi: android.provider.Telephony.CellBroadcasts#CMAS_CERTAINTY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.CMAS_CERTAINTY -UnflaggedApi: android.provider.Telephony.CellBroadcasts#CMAS_MESSAGE_CLASS: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.CMAS_MESSAGE_CLASS -UnflaggedApi: android.provider.Telephony.CellBroadcasts#CMAS_RESPONSE_TYPE: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.CMAS_RESPONSE_TYPE -UnflaggedApi: android.provider.Telephony.CellBroadcasts#CMAS_SEVERITY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.CMAS_SEVERITY -UnflaggedApi: android.provider.Telephony.CellBroadcasts#CMAS_URGENCY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.CMAS_URGENCY -UnflaggedApi: android.provider.Telephony.CellBroadcasts#CONTENT_URI: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.CONTENT_URI -UnflaggedApi: android.provider.Telephony.CellBroadcasts#DATA_CODING_SCHEME: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.DATA_CODING_SCHEME -UnflaggedApi: android.provider.Telephony.CellBroadcasts#DEFAULT_SORT_ORDER: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.DEFAULT_SORT_ORDER -UnflaggedApi: android.provider.Telephony.CellBroadcasts#DELIVERY_TIME: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.DELIVERY_TIME -UnflaggedApi: android.provider.Telephony.CellBroadcasts#ETWS_IS_PRIMARY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.ETWS_IS_PRIMARY -UnflaggedApi: android.provider.Telephony.CellBroadcasts#ETWS_WARNING_TYPE: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.ETWS_WARNING_TYPE -UnflaggedApi: android.provider.Telephony.CellBroadcasts#GEOGRAPHICAL_SCOPE: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.GEOGRAPHICAL_SCOPE -UnflaggedApi: android.provider.Telephony.CellBroadcasts#GEOMETRIES: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.GEOMETRIES -UnflaggedApi: android.provider.Telephony.CellBroadcasts#LAC: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.LAC -UnflaggedApi: android.provider.Telephony.CellBroadcasts#LANGUAGE_CODE: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.LANGUAGE_CODE -UnflaggedApi: android.provider.Telephony.CellBroadcasts#LOCATION_CHECK_TIME: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.LOCATION_CHECK_TIME -UnflaggedApi: android.provider.Telephony.CellBroadcasts#MAXIMUM_WAIT_TIME: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.MAXIMUM_WAIT_TIME -UnflaggedApi: android.provider.Telephony.CellBroadcasts#MESSAGE_BODY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.MESSAGE_BODY -UnflaggedApi: android.provider.Telephony.CellBroadcasts#MESSAGE_BROADCASTED: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.MESSAGE_BROADCASTED -UnflaggedApi: android.provider.Telephony.CellBroadcasts#MESSAGE_DISPLAYED: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.MESSAGE_DISPLAYED -UnflaggedApi: android.provider.Telephony.CellBroadcasts#MESSAGE_FORMAT: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.MESSAGE_FORMAT -UnflaggedApi: android.provider.Telephony.CellBroadcasts#MESSAGE_HISTORY_URI: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.MESSAGE_HISTORY_URI -UnflaggedApi: android.provider.Telephony.CellBroadcasts#MESSAGE_PRIORITY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.MESSAGE_PRIORITY -UnflaggedApi: android.provider.Telephony.CellBroadcasts#MESSAGE_READ: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.MESSAGE_READ -UnflaggedApi: android.provider.Telephony.CellBroadcasts#PLMN: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.PLMN -UnflaggedApi: android.provider.Telephony.CellBroadcasts#RECEIVED_TIME: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.RECEIVED_TIME -UnflaggedApi: android.provider.Telephony.CellBroadcasts#SERIAL_NUMBER: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.SERIAL_NUMBER -UnflaggedApi: android.provider.Telephony.CellBroadcasts#SERVICE_CATEGORY: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.SERVICE_CATEGORY -UnflaggedApi: android.provider.Telephony.CellBroadcasts#SLOT_INDEX: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.SLOT_INDEX -UnflaggedApi: android.provider.Telephony.CellBroadcasts#SUBSCRIPTION_ID: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.SUBSCRIPTION_ID -UnflaggedApi: android.provider.Telephony.CellBroadcasts#_COUNT: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts._COUNT -UnflaggedApi: android.provider.Telephony.CellBroadcasts#_ID: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts._ID -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference: - New API must be flagged with @FlaggedApi: class android.provider.Telephony.CellBroadcasts.Preference -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_ALERT_VIBRATION_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_ALERT_VIBRATION_PREF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_AREA_UPDATE_INFO_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_AREA_UPDATE_INFO_PREF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_CMAS_AMBER_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_CMAS_AMBER_PREF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_CMAS_EXTREME_THREAT_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_CMAS_EXTREME_THREAT_PREF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_CMAS_IN_SECOND_LANGUAGE_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_CMAS_IN_SECOND_LANGUAGE_PREF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_CMAS_PRESIDENTIAL_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_CMAS_PRESIDENTIAL_PREF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_CMAS_SEVERE_THREAT_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_CMAS_SEVERE_THREAT_PREF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_EMERGENCY_PERF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_EMERGENCY_PERF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_PUBLIC_SAFETY_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_PUBLIC_SAFETY_PREF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_STATE_LOCAL_TEST_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_STATE_LOCAL_TEST_PREF -UnflaggedApi: android.provider.Telephony.CellBroadcasts.Preference#ENABLE_TEST_ALERT_PREF: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.CellBroadcasts.Preference.ENABLE_TEST_ALERT_PREF -UnflaggedApi: android.provider.Telephony.Sms.Intents#ACTION_SMS_EMERGENCY_CB_RECEIVED: - New API must be flagged with @FlaggedApi: field android.provider.Telephony.Sms.Intents.ACTION_SMS_EMERGENCY_CB_RECEIVED -UnflaggedApi: android.service.ambientcontext.AmbientContextDetectionResult#toString(): - New API must be flagged with @FlaggedApi: method android.service.ambientcontext.AmbientContextDetectionResult.toString() -UnflaggedApi: android.service.ambientcontext.AmbientContextDetectionServiceStatus#toString(): - New API must be flagged with @FlaggedApi: method android.service.ambientcontext.AmbientContextDetectionServiceStatus.toString() -UnflaggedApi: android.service.appprediction.AppPredictionService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.appprediction.AppPredictionService.onCreate() -UnflaggedApi: android.service.assist.classification.FieldClassificationRequest#toString(): - New API must be flagged with @FlaggedApi: method android.service.assist.classification.FieldClassificationRequest.toString() -UnflaggedApi: android.service.assist.classification.FieldClassificationResponse#toString(): - New API must be flagged with @FlaggedApi: method android.service.assist.classification.FieldClassificationResponse.toString() -UnflaggedApi: android.service.assist.classification.FieldClassificationService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.assist.classification.FieldClassificationService.onCreate() -UnflaggedApi: android.service.autofill.AutofillFieldClassificationService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.autofill.AutofillFieldClassificationService.onCreate() -UnflaggedApi: android.service.autofill.Dataset.Builder#setContent(android.view.autofill.AutofillId, android.content.ClipData): - New API must be flagged with @FlaggedApi: method android.service.autofill.Dataset.Builder.setContent(android.view.autofill.AutofillId,android.content.ClipData) -UnflaggedApi: android.service.autofill.augmented.AugmentedAutofillService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.autofill.augmented.AugmentedAutofillService.onCreate() -UnflaggedApi: android.service.autofill.augmented.AugmentedAutofillService#onUnbind(android.content.Intent): - New API must be flagged with @FlaggedApi: method android.service.autofill.augmented.AugmentedAutofillService.onUnbind(android.content.Intent) -UnflaggedApi: android.service.autofill.augmented.FillRequest#toString(): - New API must be flagged with @FlaggedApi: method android.service.autofill.augmented.FillRequest.toString() -UnflaggedApi: android.service.autofill.augmented.FillWindow#finalize(): - New API must be flagged with @FlaggedApi: method android.service.autofill.augmented.FillWindow.finalize() -UnflaggedApi: android.service.autofill.augmented.PresentationParams.Area#toString(): - New API must be flagged with @FlaggedApi: method android.service.autofill.augmented.PresentationParams.Area.toString() -UnflaggedApi: android.service.cloudsearch.CloudSearchService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.cloudsearch.CloudSearchService.onCreate() -UnflaggedApi: android.service.contentcapture.ActivityEvent#toString(): - New API must be flagged with @FlaggedApi: method android.service.contentcapture.ActivityEvent.toString() -UnflaggedApi: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]): - New API must be flagged with @FlaggedApi: method android.service.contentcapture.ContentCaptureService.dump(java.io.FileDescriptor,java.io.PrintWriter,String[]) -UnflaggedApi: android.service.contentcapture.ContentCaptureService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.contentcapture.ContentCaptureService.onCreate() -UnflaggedApi: android.service.contentsuggestions.ContentSuggestionsService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.contentsuggestions.ContentSuggestionsService.onCreate() -UnflaggedApi: android.service.displayhash.DisplayHashParams#toString(): - New API must be flagged with @FlaggedApi: method android.service.displayhash.DisplayHashParams.toString() -UnflaggedApi: android.service.displayhash.DisplayHashingService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.displayhash.DisplayHashingService.onCreate() -UnflaggedApi: android.service.euicc.EuiccProfileInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.euicc.EuiccProfileInfo.equals(Object) -UnflaggedApi: android.service.euicc.EuiccProfileInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.euicc.EuiccProfileInfo.hashCode() -UnflaggedApi: android.service.euicc.EuiccProfileInfo#toString(): - New API must be flagged with @FlaggedApi: method android.service.euicc.EuiccProfileInfo.toString() -UnflaggedApi: android.service.euicc.EuiccService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.euicc.EuiccService.onCreate() -UnflaggedApi: android.service.euicc.EuiccService#onDestroy(): - New API must be flagged with @FlaggedApi: method android.service.euicc.EuiccService.onDestroy() -UnflaggedApi: android.service.games.CreateGameSessionRequest#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.games.CreateGameSessionRequest.equals(Object) -UnflaggedApi: android.service.games.CreateGameSessionRequest#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.games.CreateGameSessionRequest.hashCode() -UnflaggedApi: android.service.games.CreateGameSessionRequest#toString(): - New API must be flagged with @FlaggedApi: method android.service.games.CreateGameSessionRequest.toString() -UnflaggedApi: android.service.games.GameSessionService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.games.GameSessionService.onCreate() -UnflaggedApi: android.service.games.GameStartedEvent#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.games.GameStartedEvent.equals(Object) -UnflaggedApi: android.service.games.GameStartedEvent#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.games.GameStartedEvent.hashCode() -UnflaggedApi: android.service.games.GameStartedEvent#toString(): - New API must be flagged with @FlaggedApi: method android.service.games.GameStartedEvent.toString() -UnflaggedApi: android.service.notification.Adjustment#toString(): - New API must be flagged with @FlaggedApi: method android.service.notification.Adjustment.toString() -UnflaggedApi: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context): - New API must be flagged with @FlaggedApi: method android.service.notification.NotificationAssistantService.attachBaseContext(android.content.Context) -UnflaggedApi: android.service.notification.NotificationStats#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.notification.NotificationStats.equals(Object) -UnflaggedApi: android.service.notification.NotificationStats#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.notification.NotificationStats.hashCode() -UnflaggedApi: android.service.notification.NotificationStats#toString(): - New API must be flagged with @FlaggedApi: method android.service.notification.NotificationStats.toString() -UnflaggedApi: android.service.notification.SnoozeCriterion#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.notification.SnoozeCriterion.equals(Object) -UnflaggedApi: android.service.notification.SnoozeCriterion#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.notification.SnoozeCriterion.hashCode() -UnflaggedApi: android.service.resolver.ResolverRankerService#onDestroy(): - New API must be flagged with @FlaggedApi: method android.service.resolver.ResolverRankerService.onDestroy() -UnflaggedApi: android.service.resolver.ResolverTarget#toString(): - New API must be flagged with @FlaggedApi: method android.service.resolver.ResolverTarget.toString() -UnflaggedApi: android.service.rotationresolver.RotationResolutionRequest#toString(): - New API must be flagged with @FlaggedApi: method android.service.rotationresolver.RotationResolutionRequest.toString() -UnflaggedApi: android.service.search.SearchUiService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.search.SearchUiService.onCreate() -UnflaggedApi: android.service.smartspace.SmartspaceService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.smartspace.SmartspaceService.onCreate() -UnflaggedApi: android.service.textclassifier.TextClassifierService#onUnbind(android.content.Intent): - New API must be flagged with @FlaggedApi: method android.service.textclassifier.TextClassifierService.onUnbind(android.content.Intent) -UnflaggedApi: android.service.timezone.TimeZoneProviderStatus#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.timezone.TimeZoneProviderStatus.equals(Object) -UnflaggedApi: android.service.timezone.TimeZoneProviderStatus#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.timezone.TimeZoneProviderStatus.hashCode() -UnflaggedApi: android.service.timezone.TimeZoneProviderStatus#toString(): - New API must be flagged with @FlaggedApi: method android.service.timezone.TimeZoneProviderStatus.toString() -UnflaggedApi: android.service.timezone.TimeZoneProviderSuggestion#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.timezone.TimeZoneProviderSuggestion.equals(Object) -UnflaggedApi: android.service.timezone.TimeZoneProviderSuggestion#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.timezone.TimeZoneProviderSuggestion.hashCode() -UnflaggedApi: android.service.timezone.TimeZoneProviderSuggestion#toString(): - New API must be flagged with @FlaggedApi: method android.service.timezone.TimeZoneProviderSuggestion.toString() -UnflaggedApi: android.service.translation.TranslationService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.translation.TranslationService.onCreate() -UnflaggedApi: android.service.trust.TrustAgentService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.trust.TrustAgentService.onCreate() -UnflaggedApi: android.service.voice.AlwaysOnHotwordDetector#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.voice.AlwaysOnHotwordDetector.equals(Object) -UnflaggedApi: android.service.voice.AlwaysOnHotwordDetector#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.voice.AlwaysOnHotwordDetector.hashCode() -UnflaggedApi: android.service.voice.AlwaysOnHotwordDetector.ModelParamRange#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.voice.AlwaysOnHotwordDetector.ModelParamRange.equals(Object) -UnflaggedApi: android.service.voice.AlwaysOnHotwordDetector.ModelParamRange#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.voice.AlwaysOnHotwordDetector.ModelParamRange.hashCode() -UnflaggedApi: android.service.voice.AlwaysOnHotwordDetector.ModelParamRange#toString(): - New API must be flagged with @FlaggedApi: method android.service.voice.AlwaysOnHotwordDetector.ModelParamRange.toString() -UnflaggedApi: android.service.voice.HotwordAudioStream#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordAudioStream.equals(Object) -UnflaggedApi: android.service.voice.HotwordAudioStream#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordAudioStream.hashCode() -UnflaggedApi: android.service.voice.HotwordAudioStream#toString(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordAudioStream.toString() -UnflaggedApi: android.service.voice.HotwordDetectedResult#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordDetectedResult.equals(Object) -UnflaggedApi: android.service.voice.HotwordDetectedResult#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordDetectedResult.hashCode() -UnflaggedApi: android.service.voice.HotwordDetectedResult#toString(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordDetectedResult.toString() -UnflaggedApi: android.service.voice.HotwordDetectionService#getSystemService(String): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordDetectionService.getSystemService(String) -UnflaggedApi: android.service.voice.HotwordDetectionServiceFailure#toString(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordDetectionServiceFailure.toString() -UnflaggedApi: android.service.voice.HotwordRejectedResult#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordRejectedResult.equals(Object) -UnflaggedApi: android.service.voice.HotwordRejectedResult#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordRejectedResult.hashCode() -UnflaggedApi: android.service.voice.HotwordRejectedResult#toString(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordRejectedResult.toString() UnflaggedApi: android.service.voice.HotwordTrainingAudio: New API must be flagged with @FlaggedApi: class android.service.voice.HotwordTrainingAudio UnflaggedApi: android.service.voice.HotwordTrainingAudio#CONTENTS_FILE_DESCRIPTOR: @@ -2487,8 +271,6 @@ UnflaggedApi: android.service.voice.HotwordTrainingAudio#PARCELABLE_WRITE_RETURN New API must be flagged with @FlaggedApi: field android.service.voice.HotwordTrainingAudio.PARCELABLE_WRITE_RETURN_VALUE UnflaggedApi: android.service.voice.HotwordTrainingAudio#describeContents(): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.describeContents() -UnflaggedApi: android.service.voice.HotwordTrainingAudio#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.equals(Object) UnflaggedApi: android.service.voice.HotwordTrainingAudio#getAudioFormat(): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.getAudioFormat() UnflaggedApi: android.service.voice.HotwordTrainingAudio#getAudioType(): @@ -2497,10 +279,6 @@ UnflaggedApi: android.service.voice.HotwordTrainingAudio#getHotwordAudio(): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.getHotwordAudio() UnflaggedApi: android.service.voice.HotwordTrainingAudio#getHotwordOffsetMillis(): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.getHotwordOffsetMillis() -UnflaggedApi: android.service.voice.HotwordTrainingAudio#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.hashCode() -UnflaggedApi: android.service.voice.HotwordTrainingAudio#toString(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.toString() UnflaggedApi: android.service.voice.HotwordTrainingAudio#writeToParcel(android.os.Parcel, int): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.writeToParcel(android.os.Parcel,int) UnflaggedApi: android.service.voice.HotwordTrainingAudio.Builder: @@ -2513,8 +291,6 @@ UnflaggedApi: android.service.voice.HotwordTrainingAudio.Builder#setAudioFormat( New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.Builder.setAudioFormat(android.media.AudioFormat) UnflaggedApi: android.service.voice.HotwordTrainingAudio.Builder#setAudioType(int): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.Builder.setAudioType(int) -UnflaggedApi: android.service.voice.HotwordTrainingAudio.Builder#setHotwordAudio(byte...): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.Builder.setHotwordAudio(byte...) UnflaggedApi: android.service.voice.HotwordTrainingAudio.Builder#setHotwordOffsetMillis(int): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingAudio.Builder.setHotwordOffsetMillis(int) UnflaggedApi: android.service.voice.HotwordTrainingData: @@ -2537,18 +313,12 @@ UnflaggedApi: android.service.voice.HotwordTrainingData#TIMEOUT_STAGE_VERY_EARLY New API must be flagged with @FlaggedApi: field android.service.voice.HotwordTrainingData.TIMEOUT_STAGE_VERY_EARLY UnflaggedApi: android.service.voice.HotwordTrainingData#describeContents(): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.describeContents() -UnflaggedApi: android.service.voice.HotwordTrainingData#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.equals(Object) UnflaggedApi: android.service.voice.HotwordTrainingData#getMaxTrainingDataSize(): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.getMaxTrainingDataSize() UnflaggedApi: android.service.voice.HotwordTrainingData#getTimeoutStage(): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.getTimeoutStage() UnflaggedApi: android.service.voice.HotwordTrainingData#getTrainingAudios(): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.getTrainingAudios() -UnflaggedApi: android.service.voice.HotwordTrainingData#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.hashCode() -UnflaggedApi: android.service.voice.HotwordTrainingData#toString(): - New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.toString() UnflaggedApi: android.service.voice.HotwordTrainingData#writeToParcel(android.os.Parcel, int): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.writeToParcel(android.os.Parcel,int) UnflaggedApi: android.service.voice.HotwordTrainingData.Builder: @@ -2563,330 +333,10 @@ UnflaggedApi: android.service.voice.HotwordTrainingData.Builder#setTimeoutStage( New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.Builder.setTimeoutStage(int) UnflaggedApi: android.service.voice.HotwordTrainingData.Builder#setTrainingAudios(java.util.List<android.service.voice.HotwordTrainingAudio>): New API must be flagged with @FlaggedApi: method android.service.voice.HotwordTrainingData.Builder.setTrainingAudios(java.util.List<android.service.voice.HotwordTrainingAudio>) -UnflaggedApi: android.service.voice.SoundTriggerFailure#toString(): - New API must be flagged with @FlaggedApi: method android.service.voice.SoundTriggerFailure.toString() -UnflaggedApi: android.service.voice.VisualQueryDetectionService#getSystemService(String): - New API must be flagged with @FlaggedApi: method android.service.voice.VisualQueryDetectionService.getSystemService(String) -UnflaggedApi: android.service.voice.VisualQueryDetectionService#openFileInput(String): - New API must be flagged with @FlaggedApi: method android.service.voice.VisualQueryDetectionService.openFileInput(String) -UnflaggedApi: android.service.voice.VisualQueryDetectionServiceFailure#toString(): - New API must be flagged with @FlaggedApi: method android.service.voice.VisualQueryDetectionServiceFailure.toString() -UnflaggedApi: android.service.wallpaper.WallpaperService.Engine#isInAmbientMode(): - New API must be flagged with @FlaggedApi: method android.service.wallpaper.WallpaperService.Engine.isInAmbientMode() -UnflaggedApi: android.service.wallpaper.WallpaperService.Engine#onAmbientModeChanged(boolean, long): - New API must be flagged with @FlaggedApi: method android.service.wallpaper.WallpaperService.Engine.onAmbientModeChanged(boolean,long) -UnflaggedApi: android.service.wallpapereffectsgeneration.WallpaperEffectsGenerationService#onCreate(): - New API must be flagged with @FlaggedApi: method android.service.wallpapereffectsgeneration.WallpaperEffectsGenerationService.onCreate() -UnflaggedApi: android.service.watchdog.ExplicitHealthCheckService.PackageConfig#equals(Object): - New API must be flagged with @FlaggedApi: method android.service.watchdog.ExplicitHealthCheckService.PackageConfig.equals(Object) -UnflaggedApi: android.service.watchdog.ExplicitHealthCheckService.PackageConfig#hashCode(): - New API must be flagged with @FlaggedApi: method android.service.watchdog.ExplicitHealthCheckService.PackageConfig.hashCode() -UnflaggedApi: android.service.watchdog.ExplicitHealthCheckService.PackageConfig#toString(): - New API must be flagged with @FlaggedApi: method android.service.watchdog.ExplicitHealthCheckService.PackageConfig.toString() -UnflaggedApi: android.telecom.AudioState#equals(Object): - New API must be flagged with @FlaggedApi: method android.telecom.AudioState.equals(Object) -UnflaggedApi: android.telecom.AudioState#toString(): - New API must be flagged with @FlaggedApi: method android.telecom.AudioState.toString() -UnflaggedApi: android.telecom.BluetoothCallQualityReport#equals(Object): - New API must be flagged with @FlaggedApi: method android.telecom.BluetoothCallQualityReport.equals(Object) -UnflaggedApi: android.telecom.BluetoothCallQualityReport#hashCode(): - New API must be flagged with @FlaggedApi: method android.telecom.BluetoothCallQualityReport.hashCode() -UnflaggedApi: android.telecom.CallScreeningService.CallResponse.Builder#setShouldScreenCallViaAudioProcessing(boolean): - New API must be flagged with @FlaggedApi: method android.telecom.CallScreeningService.CallResponse.Builder.setShouldScreenCallViaAudioProcessing(boolean) -UnflaggedApi: android.telecom.Connection.CallFilteringCompletionInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telecom.Connection.CallFilteringCompletionInfo.toString() UnflaggedApi: android.telecom.StreamingCall#EXTRA_CALL_ID: New API must be flagged with @FlaggedApi: field android.telecom.StreamingCall.EXTRA_CALL_ID -UnflaggedApi: android.telephony.CallAttributes#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.CallAttributes.equals(Object) -UnflaggedApi: android.telephony.CallAttributes#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.CallAttributes.hashCode() -UnflaggedApi: android.telephony.CallAttributes#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.CallAttributes.toString() -UnflaggedApi: android.telephony.CallQuality#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.CallQuality.equals(Object) -UnflaggedApi: android.telephony.CallQuality#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.CallQuality.hashCode() -UnflaggedApi: android.telephony.CallQuality#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.CallQuality.toString() -UnflaggedApi: android.telephony.CallState#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.CallState.equals(Object) -UnflaggedApi: android.telephony.CallState#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.CallState.hashCode() -UnflaggedApi: android.telephony.CallState#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.CallState.toString() -UnflaggedApi: android.telephony.CarrierRestrictionRules#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.CarrierRestrictionRules.toString() -UnflaggedApi: android.telephony.CbGeoUtils.Circle#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.CbGeoUtils.Circle.toString() -UnflaggedApi: android.telephony.CbGeoUtils.LatLng#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.CbGeoUtils.LatLng.toString() -UnflaggedApi: android.telephony.CbGeoUtils.Polygon#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.CbGeoUtils.Polygon.toString() -UnflaggedApi: android.telephony.CellBroadcastIdRange#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.CellBroadcastIdRange.equals(Object) -UnflaggedApi: android.telephony.CellBroadcastIdRange#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.CellBroadcastIdRange.hashCode() -UnflaggedApi: android.telephony.CellBroadcastIdRange#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.CellBroadcastIdRange.toString() -UnflaggedApi: android.telephony.DataSpecificRegistrationInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.DataSpecificRegistrationInfo.equals(Object) -UnflaggedApi: android.telephony.DataSpecificRegistrationInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.DataSpecificRegistrationInfo.hashCode() -UnflaggedApi: android.telephony.DataSpecificRegistrationInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.DataSpecificRegistrationInfo.toString() -UnflaggedApi: android.telephony.DataThrottlingRequest#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.DataThrottlingRequest.toString() -UnflaggedApi: android.telephony.ImsiEncryptionInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ImsiEncryptionInfo.toString() -UnflaggedApi: android.telephony.LinkCapacityEstimate#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.LinkCapacityEstimate.equals(Object) -UnflaggedApi: android.telephony.LinkCapacityEstimate#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.LinkCapacityEstimate.hashCode() -UnflaggedApi: android.telephony.LinkCapacityEstimate#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.LinkCapacityEstimate.toString() -UnflaggedApi: android.telephony.LteVopsSupportInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.LteVopsSupportInfo.toString() -UnflaggedApi: android.telephony.ModemActivityInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ModemActivityInfo.equals(Object) -UnflaggedApi: android.telephony.ModemActivityInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ModemActivityInfo.hashCode() -UnflaggedApi: android.telephony.ModemActivityInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ModemActivityInfo.toString() UnflaggedApi: android.telephony.NetworkRegistrationInfo.Builder#setIsNonTerrestrialNetwork(boolean): New API must be flagged with @FlaggedApi: method android.telephony.NetworkRegistrationInfo.Builder.setIsNonTerrestrialNetwork(boolean) -UnflaggedApi: android.telephony.NetworkService#onUnbind(android.content.Intent): - New API must be flagged with @FlaggedApi: method android.telephony.NetworkService.onUnbind(android.content.Intent) -UnflaggedApi: android.telephony.NrVopsSupportInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.NrVopsSupportInfo.toString() -UnflaggedApi: android.telephony.PhoneCapability#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.PhoneCapability.equals(Object) -UnflaggedApi: android.telephony.PhoneCapability#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.PhoneCapability.hashCode() -UnflaggedApi: android.telephony.PhoneCapability#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.PhoneCapability.toString() -UnflaggedApi: android.telephony.PhoneNumberRange#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.PhoneNumberRange.equals(Object) -UnflaggedApi: android.telephony.PhoneNumberRange#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.PhoneNumberRange.hashCode() -UnflaggedApi: android.telephony.PhoneNumberRange#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.PhoneNumberRange.toString() -UnflaggedApi: android.telephony.PinResult#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.PinResult.equals(Object) -UnflaggedApi: android.telephony.PinResult#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.PinResult.hashCode() -UnflaggedApi: android.telephony.PinResult#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.PinResult.toString() -UnflaggedApi: android.telephony.PreciseCallState#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.PreciseCallState.equals(Object) -UnflaggedApi: android.telephony.PreciseCallState#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.PreciseCallState.hashCode() -UnflaggedApi: android.telephony.PreciseCallState#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.PreciseCallState.toString() -UnflaggedApi: android.telephony.SmsCbCmasInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.SmsCbCmasInfo.toString() -UnflaggedApi: android.telephony.SmsCbEtwsInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.SmsCbEtwsInfo.toString() -UnflaggedApi: android.telephony.SmsCbLocation#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.SmsCbLocation.equals(Object) -UnflaggedApi: android.telephony.SmsCbLocation#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.SmsCbLocation.hashCode() -UnflaggedApi: android.telephony.SmsCbLocation#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.SmsCbLocation.toString() -UnflaggedApi: android.telephony.SmsCbMessage#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.SmsCbMessage.toString() -UnflaggedApi: android.telephony.TelephonyHistogram#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.TelephonyHistogram.toString() -UnflaggedApi: android.telephony.TelephonyManager.ModemActivityInfoException#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.TelephonyManager.ModemActivityInfoException.toString() -UnflaggedApi: android.telephony.ThermalMitigationRequest#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ThermalMitigationRequest.toString() -UnflaggedApi: android.telephony.UiccAccessRule#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.UiccAccessRule.equals(Object) -UnflaggedApi: android.telephony.UiccAccessRule#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.UiccAccessRule.hashCode() -UnflaggedApi: android.telephony.UiccAccessRule#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.UiccAccessRule.toString() -UnflaggedApi: android.telephony.UiccSlotInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.UiccSlotInfo.equals(Object) -UnflaggedApi: android.telephony.UiccSlotInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.UiccSlotInfo.hashCode() -UnflaggedApi: android.telephony.UiccSlotInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.UiccSlotInfo.toString() -UnflaggedApi: android.telephony.UiccSlotMapping#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.UiccSlotMapping.equals(Object) -UnflaggedApi: android.telephony.UiccSlotMapping#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.UiccSlotMapping.hashCode() -UnflaggedApi: android.telephony.UiccSlotMapping#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.UiccSlotMapping.toString() -UnflaggedApi: android.telephony.VopsSupportInfo#writeToParcel(android.os.Parcel, int): - New API must be flagged with @FlaggedApi: method android.telephony.VopsSupportInfo.writeToParcel(android.os.Parcel,int) -UnflaggedApi: android.telephony.cdma.CdmaSmsCbProgramData#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.cdma.CdmaSmsCbProgramData.toString() -UnflaggedApi: android.telephony.data.DataCallResponse#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.data.DataCallResponse.equals(Object) -UnflaggedApi: android.telephony.data.DataCallResponse#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.data.DataCallResponse.hashCode() -UnflaggedApi: android.telephony.data.DataCallResponse#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.data.DataCallResponse.toString() -UnflaggedApi: android.telephony.data.DataProfile#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.data.DataProfile.equals(Object) -UnflaggedApi: android.telephony.data.DataProfile#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.data.DataProfile.hashCode() -UnflaggedApi: android.telephony.data.DataProfile#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.data.DataProfile.toString() -UnflaggedApi: android.telephony.data.DataService#onDestroy(): - New API must be flagged with @FlaggedApi: method android.telephony.data.DataService.onDestroy() -UnflaggedApi: android.telephony.data.DataService#onUnbind(android.content.Intent): - New API must be flagged with @FlaggedApi: method android.telephony.data.DataService.onUnbind(android.content.Intent) -UnflaggedApi: android.telephony.data.EpsBearerQosSessionAttributes#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.data.EpsBearerQosSessionAttributes.equals(Object) -UnflaggedApi: android.telephony.data.EpsBearerQosSessionAttributes#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.data.EpsBearerQosSessionAttributes.hashCode() -UnflaggedApi: android.telephony.data.NrQosSessionAttributes#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.data.NrQosSessionAttributes.equals(Object) -UnflaggedApi: android.telephony.data.NrQosSessionAttributes#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.data.NrQosSessionAttributes.hashCode() -UnflaggedApi: android.telephony.data.ThrottleStatus#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.data.ThrottleStatus.equals(Object) -UnflaggedApi: android.telephony.data.ThrottleStatus#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.data.ThrottleStatus.hashCode() -UnflaggedApi: android.telephony.data.ThrottleStatus#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.data.ThrottleStatus.toString() -UnflaggedApi: android.telephony.euicc.EuiccNotification#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.euicc.EuiccNotification.equals(Object) -UnflaggedApi: android.telephony.euicc.EuiccNotification#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.euicc.EuiccNotification.hashCode() -UnflaggedApi: android.telephony.euicc.EuiccNotification#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.euicc.EuiccNotification.toString() -UnflaggedApi: android.telephony.euicc.EuiccRulesAuthTable#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.euicc.EuiccRulesAuthTable.equals(Object) -UnflaggedApi: android.telephony.gba.UaSecurityProtocolIdentifier#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.gba.UaSecurityProtocolIdentifier.equals(Object) -UnflaggedApi: android.telephony.gba.UaSecurityProtocolIdentifier#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.gba.UaSecurityProtocolIdentifier.hashCode() -UnflaggedApi: android.telephony.gba.UaSecurityProtocolIdentifier#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.gba.UaSecurityProtocolIdentifier.toString() -UnflaggedApi: android.telephony.ims.AudioCodecAttributes#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.AudioCodecAttributes.toString() -UnflaggedApi: android.telephony.ims.DelegateRegistrationState#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.DelegateRegistrationState.equals(Object) -UnflaggedApi: android.telephony.ims.DelegateRegistrationState#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.DelegateRegistrationState.hashCode() -UnflaggedApi: android.telephony.ims.DelegateRegistrationState#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.DelegateRegistrationState.toString() -UnflaggedApi: android.telephony.ims.DelegateRequest#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.DelegateRequest.equals(Object) -UnflaggedApi: android.telephony.ims.DelegateRequest#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.DelegateRequest.hashCode() -UnflaggedApi: android.telephony.ims.DelegateRequest#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.DelegateRequest.toString() -UnflaggedApi: android.telephony.ims.FeatureTagState#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.FeatureTagState.equals(Object) -UnflaggedApi: android.telephony.ims.FeatureTagState#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.FeatureTagState.hashCode() -UnflaggedApi: android.telephony.ims.FeatureTagState#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.FeatureTagState.toString() -UnflaggedApi: android.telephony.ims.ImsCallForwardInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsCallForwardInfo.toString() -UnflaggedApi: android.telephony.ims.ImsCallProfile#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsCallProfile.toString() -UnflaggedApi: android.telephony.ims.ImsConferenceState#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsConferenceState.toString() -UnflaggedApi: android.telephony.ims.ImsExternalCallState#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsExternalCallState.toString() -UnflaggedApi: android.telephony.ims.ImsMmTelManager.RegistrationCallback#onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsMmTelManager.RegistrationCallback.onTechnologyChangeFailed(int,android.telephony.ims.ImsReasonInfo) -UnflaggedApi: android.telephony.ims.ImsMmTelManager.RegistrationCallback#onUnregistered(android.telephony.ims.ImsReasonInfo): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsMmTelManager.RegistrationCallback.onUnregistered(android.telephony.ims.ImsReasonInfo) -UnflaggedApi: android.telephony.ims.ImsSsData#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsSsData.toString() -UnflaggedApi: android.telephony.ims.ImsSsInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsSsInfo.toString() -UnflaggedApi: android.telephony.ims.ImsStreamMediaProfile#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsStreamMediaProfile.toString() -UnflaggedApi: android.telephony.ims.ImsSuppServiceNotification#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.ImsSuppServiceNotification.toString() -UnflaggedApi: android.telephony.ims.MediaQualityStatus#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.MediaQualityStatus.equals(Object) -UnflaggedApi: android.telephony.ims.MediaQualityStatus#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.MediaQualityStatus.hashCode() -UnflaggedApi: android.telephony.ims.MediaQualityStatus#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.MediaQualityStatus.toString() -UnflaggedApi: android.telephony.ims.MediaThreshold#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.MediaThreshold.equals(Object) -UnflaggedApi: android.telephony.ims.MediaThreshold#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.MediaThreshold.hashCode() -UnflaggedApi: android.telephony.ims.MediaThreshold#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.MediaThreshold.toString() -UnflaggedApi: android.telephony.ims.PublishAttributes#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.PublishAttributes.equals(Object) -UnflaggedApi: android.telephony.ims.PublishAttributes#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.PublishAttributes.hashCode() -UnflaggedApi: android.telephony.ims.PublishAttributes#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.PublishAttributes.toString() -UnflaggedApi: android.telephony.ims.RcsClientConfiguration#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RcsClientConfiguration.equals(Object) -UnflaggedApi: android.telephony.ims.RcsClientConfiguration#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RcsClientConfiguration.hashCode() -UnflaggedApi: android.telephony.ims.RcsContactPresenceTuple#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RcsContactPresenceTuple.toString() -UnflaggedApi: android.telephony.ims.RcsContactPresenceTuple.ServiceCapabilities#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RcsContactPresenceTuple.ServiceCapabilities.toString() -UnflaggedApi: android.telephony.ims.RcsContactUceCapability#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RcsContactUceCapability.toString() -UnflaggedApi: android.telephony.ims.RtpHeaderExtension#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RtpHeaderExtension.equals(Object) -UnflaggedApi: android.telephony.ims.RtpHeaderExtension#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RtpHeaderExtension.hashCode() -UnflaggedApi: android.telephony.ims.RtpHeaderExtension#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RtpHeaderExtension.toString() -UnflaggedApi: android.telephony.ims.RtpHeaderExtensionType#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RtpHeaderExtensionType.equals(Object) -UnflaggedApi: android.telephony.ims.RtpHeaderExtensionType#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RtpHeaderExtensionType.hashCode() -UnflaggedApi: android.telephony.ims.RtpHeaderExtensionType#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.RtpHeaderExtensionType.toString() -UnflaggedApi: android.telephony.ims.SipDelegateConfiguration#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipDelegateConfiguration.equals(Object) -UnflaggedApi: android.telephony.ims.SipDelegateConfiguration#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipDelegateConfiguration.hashCode() -UnflaggedApi: android.telephony.ims.SipDelegateConfiguration#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipDelegateConfiguration.toString() -UnflaggedApi: android.telephony.ims.SipDelegateConfiguration.IpSecConfiguration#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipDelegateConfiguration.IpSecConfiguration.equals(Object) -UnflaggedApi: android.telephony.ims.SipDelegateConfiguration.IpSecConfiguration#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipDelegateConfiguration.IpSecConfiguration.hashCode() -UnflaggedApi: android.telephony.ims.SipDelegateConfiguration.IpSecConfiguration#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipDelegateConfiguration.IpSecConfiguration.toString() -UnflaggedApi: android.telephony.ims.SipDialogState#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipDialogState.equals(Object) -UnflaggedApi: android.telephony.ims.SipDialogState#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipDialogState.hashCode() -UnflaggedApi: android.telephony.ims.SipMessage#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipMessage.equals(Object) -UnflaggedApi: android.telephony.ims.SipMessage#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipMessage.hashCode() -UnflaggedApi: android.telephony.ims.SipMessage#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SipMessage.toString() -UnflaggedApi: android.telephony.ims.SrvccCall#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SrvccCall.equals(Object) -UnflaggedApi: android.telephony.ims.SrvccCall#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SrvccCall.hashCode() -UnflaggedApi: android.telephony.ims.SrvccCall#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.SrvccCall.toString() -UnflaggedApi: android.telephony.ims.feature.CapabilityChangeRequest#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.feature.CapabilityChangeRequest.toString() -UnflaggedApi: android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair.toString() -UnflaggedApi: android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair.equals(Object) -UnflaggedApi: android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair.hashCode() -UnflaggedApi: android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair.toString() -UnflaggedApi: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String): - New API must be flagged with @FlaggedApi: method android.telephony.mbms.DownloadRequest.Builder.setServiceId(String) UnflaggedApi: android.telephony.mbms.vendor.MbmsDownloadServiceBase#DESCRIPTOR: New API must be flagged with @FlaggedApi: field android.telephony.mbms.vendor.MbmsDownloadServiceBase.DESCRIPTOR UnflaggedApi: android.telephony.mbms.vendor.MbmsStreamingServiceBase#DESCRIPTOR: @@ -2901,18 +351,12 @@ UnflaggedApi: android.telephony.satellite.AntennaDirection#PARCELABLE_WRITE_RETU New API must be flagged with @FlaggedApi: field android.telephony.satellite.AntennaDirection.PARCELABLE_WRITE_RETURN_VALUE UnflaggedApi: android.telephony.satellite.AntennaDirection#describeContents(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaDirection.describeContents() -UnflaggedApi: android.telephony.satellite.AntennaDirection#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaDirection.equals(Object) UnflaggedApi: android.telephony.satellite.AntennaDirection#getX(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaDirection.getX() UnflaggedApi: android.telephony.satellite.AntennaDirection#getY(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaDirection.getY() UnflaggedApi: android.telephony.satellite.AntennaDirection#getZ(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaDirection.getZ() -UnflaggedApi: android.telephony.satellite.AntennaDirection#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaDirection.hashCode() -UnflaggedApi: android.telephony.satellite.AntennaDirection#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaDirection.toString() UnflaggedApi: android.telephony.satellite.AntennaDirection#writeToParcel(android.os.Parcel, int): New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaDirection.writeToParcel(android.os.Parcel,int) UnflaggedApi: android.telephony.satellite.AntennaPosition: @@ -2925,16 +369,10 @@ UnflaggedApi: android.telephony.satellite.AntennaPosition#PARCELABLE_WRITE_RETUR New API must be flagged with @FlaggedApi: field android.telephony.satellite.AntennaPosition.PARCELABLE_WRITE_RETURN_VALUE UnflaggedApi: android.telephony.satellite.AntennaPosition#describeContents(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaPosition.describeContents() -UnflaggedApi: android.telephony.satellite.AntennaPosition#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaPosition.equals(Object) UnflaggedApi: android.telephony.satellite.AntennaPosition#getAntennaDirection(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaPosition.getAntennaDirection() UnflaggedApi: android.telephony.satellite.AntennaPosition#getSuggestedHoldPosition(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaPosition.getSuggestedHoldPosition() -UnflaggedApi: android.telephony.satellite.AntennaPosition#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaPosition.hashCode() -UnflaggedApi: android.telephony.satellite.AntennaPosition#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaPosition.toString() UnflaggedApi: android.telephony.satellite.AntennaPosition#writeToParcel(android.os.Parcel, int): New API must be flagged with @FlaggedApi: method android.telephony.satellite.AntennaPosition.writeToParcel(android.os.Parcel,int) UnflaggedApi: android.telephony.satellite.PointingInfo: @@ -2947,16 +385,10 @@ UnflaggedApi: android.telephony.satellite.PointingInfo#PARCELABLE_WRITE_RETURN_V New API must be flagged with @FlaggedApi: field android.telephony.satellite.PointingInfo.PARCELABLE_WRITE_RETURN_VALUE UnflaggedApi: android.telephony.satellite.PointingInfo#describeContents(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.PointingInfo.describeContents() -UnflaggedApi: android.telephony.satellite.PointingInfo#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.PointingInfo.equals(Object) UnflaggedApi: android.telephony.satellite.PointingInfo#getSatelliteAzimuthDegrees(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.PointingInfo.getSatelliteAzimuthDegrees() UnflaggedApi: android.telephony.satellite.PointingInfo#getSatelliteElevationDegrees(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.PointingInfo.getSatelliteElevationDegrees() -UnflaggedApi: android.telephony.satellite.PointingInfo#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.PointingInfo.hashCode() -UnflaggedApi: android.telephony.satellite.PointingInfo#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.PointingInfo.toString() UnflaggedApi: android.telephony.satellite.PointingInfo#writeToParcel(android.os.Parcel, int): New API must be flagged with @FlaggedApi: method android.telephony.satellite.PointingInfo.writeToParcel(android.os.Parcel,int) UnflaggedApi: android.telephony.satellite.SatelliteCapabilities: @@ -2969,20 +401,14 @@ UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#PARCELABLE_WRITE New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteCapabilities.PARCELABLE_WRITE_RETURN_VALUE UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#describeContents(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteCapabilities.describeContents() -UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#equals(Object): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteCapabilities.equals(Object) UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#getAntennaPositionMap(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteCapabilities.getAntennaPositionMap() UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#getMaxBytesPerOutgoingDatagram(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteCapabilities.getMaxBytesPerOutgoingDatagram() UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#getSupportedRadioTechnologies(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteCapabilities.getSupportedRadioTechnologies() -UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#hashCode(): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteCapabilities.hashCode() UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#isPointingRequired(): New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteCapabilities.isPointingRequired() -UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#toString(): - New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteCapabilities.toString() UnflaggedApi: android.telephony.satellite.SatelliteCapabilities#writeToParcel(android.os.Parcel, int): New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteCapabilities.writeToParcel(android.os.Parcel,int) UnflaggedApi: android.telephony.satellite.SatelliteDatagram: @@ -3037,8 +463,6 @@ UnflaggedApi: android.telephony.satellite.SatelliteManager#NT_RADIO_TECHNOLOGY_P New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.NT_RADIO_TECHNOLOGY_PROPRIETARY UnflaggedApi: android.telephony.satellite.SatelliteManager#NT_RADIO_TECHNOLOGY_UNKNOWN: New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.NT_RADIO_TECHNOLOGY_UNKNOWN -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_ACCESS_BARRED: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_ACCESS_BARRED UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE: New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED: @@ -3057,20 +481,6 @@ UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_DATAGRAM_TR New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_DATAGRAM_TRANSFER_STATE_UNKNOWN: New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_UNKNOWN -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_ERROR: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_ERROR -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_ERROR_NONE: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_ERROR_NONE -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_INVALID_ARGUMENTS: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_INVALID_ARGUMENTS -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_INVALID_MODEM_STATE: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_INVALID_MODEM_STATE -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_INVALID_TELEPHONY_STATE: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_MODEM_BUSY: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_BUSY -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_MODEM_ERROR: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_ERROR UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_MODEM_STATE_DATAGRAM_RETRYING: New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_RETRYING UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING: @@ -3085,28 +495,6 @@ UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_MODEM_STATE New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_MODEM_STATE_UNKNOWN: New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_NETWORK_ERROR: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_NETWORK_ERROR -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_NETWORK_TIMEOUT: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_NETWORK_TIMEOUT -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_NOT_AUTHORIZED: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_NOT_AUTHORIZED -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_NOT_REACHABLE: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_NOT_REACHABLE -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_NOT_SUPPORTED: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_NOT_SUPPORTED -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_NO_RESOURCES: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_NO_RESOURCES -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_RADIO_NOT_AVAILABLE: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_RADIO_NOT_AVAILABLE -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_REQUEST_ABORTED: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_REQUEST_ABORTED -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_REQUEST_FAILED: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_REQUEST_FAILED -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_REQUEST_IN_PROGRESS: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_REQUEST_IN_PROGRESS -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_REQUEST_NOT_SUPPORTED: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_REQUEST_NOT_SUPPORTED UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_RESULT_ACCESS_BARRED: New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_ACCESS_BARRED UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_RESULT_ERROR: @@ -3153,14 +541,6 @@ UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_RESULT_SERV New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SERVICE_PROVISION_IN_PROGRESS UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_RESULT_SUCCESS: New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_SERVER_ERROR: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_SERVER_ERROR -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_SERVICE_ERROR: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_SERVICE_ERROR -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_SERVICE_NOT_PROVISIONED: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED -UnflaggedApi: android.telephony.satellite.SatelliteManager#SATELLITE_SERVICE_PROVISION_IN_PROGRESS: - New API must be flagged with @FlaggedApi: field android.telephony.satellite.SatelliteManager.SATELLITE_SERVICE_PROVISION_IN_PROGRESS UnflaggedApi: android.telephony.satellite.SatelliteManager#deprovisionSatelliteService(String, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>): New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteManager.deprovisionSatelliteService(String,java.util.concurrent.Executor,java.util.function.Consumer<java.lang.Integer>) UnflaggedApi: android.telephony.satellite.SatelliteManager#pollPendingSatelliteDatagrams(java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>): @@ -3225,141 +605,3 @@ UnflaggedApi: android.telephony.satellite.SatelliteTransmissionUpdateCallback#on New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteTransmissionUpdateCallback.onSatellitePositionChanged(android.telephony.satellite.PointingInfo) UnflaggedApi: android.telephony.satellite.SatelliteTransmissionUpdateCallback#onSendDatagramStateChanged(int, int, int): New API must be flagged with @FlaggedApi: method android.telephony.satellite.SatelliteTransmissionUpdateCallback.onSendDatagramStateChanged(int,int,int) -UnflaggedApi: android.text.FontConfig#equals(Object): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.equals(Object) -UnflaggedApi: android.text.FontConfig#hashCode(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.hashCode() -UnflaggedApi: android.text.FontConfig#toString(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.toString() -UnflaggedApi: android.text.FontConfig.Alias#equals(Object): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.Alias.equals(Object) -UnflaggedApi: android.text.FontConfig.Alias#hashCode(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.Alias.hashCode() -UnflaggedApi: android.text.FontConfig.Alias#toString(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.Alias.toString() -UnflaggedApi: android.text.FontConfig.Font#equals(Object): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.Font.equals(Object) -UnflaggedApi: android.text.FontConfig.Font#hashCode(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.Font.hashCode() -UnflaggedApi: android.text.FontConfig.Font#toString(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.Font.toString() -UnflaggedApi: android.text.FontConfig.FontFamily#equals(Object): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.FontFamily.equals(Object) -UnflaggedApi: android.text.FontConfig.FontFamily#hashCode(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.FontFamily.hashCode() -UnflaggedApi: android.text.FontConfig.FontFamily#toString(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.FontFamily.toString() -UnflaggedApi: android.text.FontConfig.NamedFamilyList#equals(Object): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.NamedFamilyList.equals(Object) -UnflaggedApi: android.text.FontConfig.NamedFamilyList#hashCode(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.NamedFamilyList.hashCode() -UnflaggedApi: android.text.FontConfig.NamedFamilyList#toString(): - New API must be flagged with @FlaggedApi: method android.text.FontConfig.NamedFamilyList.toString() -UnflaggedApi: android.view.contentcapture.ContentCaptureEvent#toString(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ContentCaptureEvent.toString() -UnflaggedApi: android.view.contentcapture.ViewNode#getAutofillHints(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getAutofillHints() -UnflaggedApi: android.view.contentcapture.ViewNode#getAutofillId(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getAutofillId() -UnflaggedApi: android.view.contentcapture.ViewNode#getAutofillOptions(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getAutofillOptions() -UnflaggedApi: android.view.contentcapture.ViewNode#getAutofillType(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getAutofillType() -UnflaggedApi: android.view.contentcapture.ViewNode#getAutofillValue(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getAutofillValue() -UnflaggedApi: android.view.contentcapture.ViewNode#getClassName(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getClassName() -UnflaggedApi: android.view.contentcapture.ViewNode#getContentDescription(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getContentDescription() -UnflaggedApi: android.view.contentcapture.ViewNode#getExtras(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getExtras() -UnflaggedApi: android.view.contentcapture.ViewNode#getHeight(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getHeight() -UnflaggedApi: android.view.contentcapture.ViewNode#getHint(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getHint() -UnflaggedApi: android.view.contentcapture.ViewNode#getHintIdEntry(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getHintIdEntry() -UnflaggedApi: android.view.contentcapture.ViewNode#getId(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getId() -UnflaggedApi: android.view.contentcapture.ViewNode#getIdEntry(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getIdEntry() -UnflaggedApi: android.view.contentcapture.ViewNode#getIdPackage(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getIdPackage() -UnflaggedApi: android.view.contentcapture.ViewNode#getIdType(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getIdType() -UnflaggedApi: android.view.contentcapture.ViewNode#getInputType(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getInputType() -UnflaggedApi: android.view.contentcapture.ViewNode#getLeft(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getLeft() -UnflaggedApi: android.view.contentcapture.ViewNode#getLocaleList(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getLocaleList() -UnflaggedApi: android.view.contentcapture.ViewNode#getMaxTextEms(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getMaxTextEms() -UnflaggedApi: android.view.contentcapture.ViewNode#getMaxTextLength(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getMaxTextLength() -UnflaggedApi: android.view.contentcapture.ViewNode#getMinTextEms(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getMinTextEms() -UnflaggedApi: android.view.contentcapture.ViewNode#getReceiveContentMimeTypes(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getReceiveContentMimeTypes() -UnflaggedApi: android.view.contentcapture.ViewNode#getScrollX(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getScrollX() -UnflaggedApi: android.view.contentcapture.ViewNode#getScrollY(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getScrollY() -UnflaggedApi: android.view.contentcapture.ViewNode#getText(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getText() -UnflaggedApi: android.view.contentcapture.ViewNode#getTextBackgroundColor(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTextBackgroundColor() -UnflaggedApi: android.view.contentcapture.ViewNode#getTextColor(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTextColor() -UnflaggedApi: android.view.contentcapture.ViewNode#getTextIdEntry(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTextIdEntry() -UnflaggedApi: android.view.contentcapture.ViewNode#getTextLineBaselines(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTextLineBaselines() -UnflaggedApi: android.view.contentcapture.ViewNode#getTextLineCharOffsets(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTextLineCharOffsets() -UnflaggedApi: android.view.contentcapture.ViewNode#getTextSelectionEnd(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTextSelectionEnd() -UnflaggedApi: android.view.contentcapture.ViewNode#getTextSelectionStart(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTextSelectionStart() -UnflaggedApi: android.view.contentcapture.ViewNode#getTextSize(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTextSize() -UnflaggedApi: android.view.contentcapture.ViewNode#getTextStyle(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTextStyle() -UnflaggedApi: android.view.contentcapture.ViewNode#getTop(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getTop() -UnflaggedApi: android.view.contentcapture.ViewNode#getVisibility(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getVisibility() -UnflaggedApi: android.view.contentcapture.ViewNode#getWidth(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.getWidth() -UnflaggedApi: android.view.contentcapture.ViewNode#isAccessibilityFocused(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isAccessibilityFocused() -UnflaggedApi: android.view.contentcapture.ViewNode#isActivated(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isActivated() -UnflaggedApi: android.view.contentcapture.ViewNode#isAssistBlocked(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isAssistBlocked() -UnflaggedApi: android.view.contentcapture.ViewNode#isCheckable(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isCheckable() -UnflaggedApi: android.view.contentcapture.ViewNode#isChecked(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isChecked() -UnflaggedApi: android.view.contentcapture.ViewNode#isClickable(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isClickable() -UnflaggedApi: android.view.contentcapture.ViewNode#isContextClickable(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isContextClickable() -UnflaggedApi: android.view.contentcapture.ViewNode#isEnabled(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isEnabled() -UnflaggedApi: android.view.contentcapture.ViewNode#isFocusable(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isFocusable() -UnflaggedApi: android.view.contentcapture.ViewNode#isFocused(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isFocused() -UnflaggedApi: android.view.contentcapture.ViewNode#isLongClickable(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isLongClickable() -UnflaggedApi: android.view.contentcapture.ViewNode#isOpaque(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isOpaque() -UnflaggedApi: android.view.contentcapture.ViewNode#isSelected(): - New API must be flagged with @FlaggedApi: method android.view.contentcapture.ViewNode.isSelected() -UnflaggedApi: android.view.translation.UiTranslationSpec#equals(Object): - New API must be flagged with @FlaggedApi: method android.view.translation.UiTranslationSpec.equals(Object) -UnflaggedApi: android.view.translation.UiTranslationSpec#hashCode(): - New API must be flagged with @FlaggedApi: method android.view.translation.UiTranslationSpec.hashCode() -UnflaggedApi: android.view.translation.UiTranslationSpec#toString(): - New API must be flagged with @FlaggedApi: method android.view.translation.UiTranslationSpec.toString() diff --git a/core/api/test-current.txt b/core/api/test-current.txt index a4cc44646341..40c6fa8986f7 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -3506,10 +3506,6 @@ package android.view { field public static final int FLAG_IS_ACCESSIBILITY_EVENT = 2048; // 0x800 } - public static final class MotionEvent.PointerCoords { - method public boolean isResampled(); - } - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface RemotableViewMethod { method public abstract String asyncImpl() default ""; } diff --git a/core/api/test-lint-baseline.txt b/core/api/test-lint-baseline.txt index 1aaedaba3f79..107be8be42e2 100644 --- a/core/api/test-lint-baseline.txt +++ b/core/api/test-lint-baseline.txt @@ -1,985 +1,341 @@ // 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): - Acronyms should not be capitalized in method names: was `setImportanceLockedByOEM`, should this be `setImportanceLockedByOem`? +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 -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: - 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: - 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: - Method parameter should be Collection<CharSequence> (or subclass) instead of raw array; was `java.lang.CharSequence[]` - - -AutoBoxing: android.os.VintfObject#getTargetFrameworkCompatibilityMatrixVersion(): - Must avoid boxed primitives (`java.lang.Long`) - - -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: - 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(): - 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: - 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: - 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.media.audiofx.AudioEffect#setParameterListener(android.media.audiofx.AudioEffect.OnParameterChangeListener): - 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): - 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.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): - Methods must not throw generic exceptions (`java.lang.Exception`) - - -GetterSetterNames: android.net.NetworkPolicyManager#getRestrictBackground(): - Symmetric method for `setRestrictBackground` must be named `isRestrictBackground`; was `getRestrictBackground` - - -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: - Intent action constant name must be ACTION_FOO: SMS_CARRIER_PROVISION_ACTION - - -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) - - -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: - Listeners should always be at end of argument list (method `getAppPermissions`) - - -ManagerConstructor: android.content.pm.ShortcutManager#ShortcutManager(android.content.Context): - 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: - 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): - 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): - 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): - 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): - 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: - Missing nullability on parameter `config` in method `onMovedToDisplay` -MissingNullability: android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName) parameter #0: - Missing nullability on parameter `activity` in method `alwaysShowUnsupportedCompileSdkWarning` -MissingNullability: android.app.ActivityManager#holdLock(android.os.IBinder, int) 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: - Missing nullability on parameter `packageNames` in method `clearLaunchParamsForPackages` -MissingNullability: android.app.ActivityTaskManager#resizeTask(int, android.graphics.Rect) parameter #1: - 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: 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: - Missing nullability on parameter `permission` in method `permissionToOpCode` -MissingNullability: android.app.AppOpsManager#setMode(int, int, String, int) parameter #2: - 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(): - Missing nullability on method `getEffectsSuppressor` return -MissingNullability: android.app.TimePickerDialog#getTimePicker(): - 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: - Missing nullability on parameter `data` in method `SecurityEvent` -MissingNullability: android.app.prediction.AppPredictor#getSessionId(): - 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: - 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: - Missing nullability on parameter `context` in method `LauncherApps` -MissingNullability: android.content.pm.PackageManager#getHoldLockToken(): - 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: - Missing nullability on parameter `name` in method `UserInfo` -MissingNullability: android.content.pm.UserInfo#UserInfo(int, String, String, int) parameter #2: - Missing nullability on parameter `iconPath` in method `UserInfo` -MissingNullability: android.content.pm.UserInfo#UserInfo(int, String, String, int, String) parameter #1: - Missing nullability on parameter `name` in method `UserInfo` -MissingNullability: android.content.pm.UserInfo#UserInfo(int, String, String, int, String) parameter #2: - Missing nullability on parameter `iconPath` in method `UserInfo` -MissingNullability: android.content.pm.UserInfo#UserInfo(int, String, String, int, String) parameter #4: - Missing nullability on parameter `userType` in method `UserInfo` -MissingNullability: android.content.pm.UserInfo#UserInfo(int, String, int) parameter #1: - Missing nullability on parameter `name` in method `UserInfo` -MissingNullability: android.content.pm.UserInfo#getUserHandle(): - Missing nullability on method `getUserHandle` return -MissingNullability: android.content.pm.UserInfo#iconPath: - Missing nullability on field `iconPath` in class `class android.content.pm.UserInfo` -MissingNullability: android.content.pm.UserInfo#lastLoggedInFingerprint: - Missing nullability on field `lastLoggedInFingerprint` in class `class android.content.pm.UserInfo` -MissingNullability: android.content.pm.UserInfo#name: - Missing nullability on field `name` in class `class android.content.pm.UserInfo` -MissingNullability: android.content.pm.UserInfo#userType: - Missing nullability on field `userType` in class `class android.content.pm.UserInfo` -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: - 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: - 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(): - Missing nullability on method `getXfermode` return -MissingNullability: android.hardware.camera2.CameraManager#getCameraIdListNoLazy(): - Missing nullability on method `getCameraIdListNoLazy` return -MissingNullability: android.hardware.display.AmbientDisplayConfiguration#AmbientDisplayConfiguration(android.content.Context) parameter #0: - Missing nullability on parameter `context` in method `AmbientDisplayConfiguration` -MissingNullability: android.media.AudioAttributes#getSdkUsages(): - Missing nullability on method `getSdkUsages` return -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: - 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: - 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: - 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: - 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: - 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: - 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(): - 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: - Missing nullability on field `SYNC_WRITABLE_COLUMNS` in class `class android.provider.CalendarContract.Events` -MissingNullability: android.provider.ContactsContract.RawContactsEntity#CORP_CONTENT_URI: - Missing nullability on field `CORP_CONTENT_URI` in class `class android.provider.ContactsContract.RawContactsEntity` -MissingNullability: android.security.keystore.KeyProtection.Builder#setBoundToSpecificSecureUserId(long): - 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(): - Missing nullability on method `getFieldClassificationAlgorithms` return -MissingNullability: android.telecom.Call.Details#getTelecomCallId(): - 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: - Missing nullability on parameter `countryIso` in method `checkSmsShortCodeDestination` -MissingNullability: android.telephony.TelephonyManager#HAL_VERSION_UNKNOWN: - Missing nullability on field `HAL_VERSION_UNKNOWN` in class `class android.telephony.TelephonyManager` -MissingNullability: android.telephony.TelephonyManager#HAL_VERSION_UNSUPPORTED: - Missing nullability on field `HAL_VERSION_UNSUPPORTED` in class `class android.telephony.TelephonyManager` -MissingNullability: android.telephony.TelephonyManager#getLine1AlphaTag(): - Missing nullability on method `getLine1AlphaTag` return -MissingNullability: android.telephony.TelephonyManager#getRadioHalVersion(): - 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: - 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: - Missing nullability on parameter `val` in method `writeRawBuffer` -MissingNullability: android.util.proto.ProtoParseException#ProtoParseException(String) parameter #0: - 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): - 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: - 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: - 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: - 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: - Bare field creationTime must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#flags: - Bare field flags must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#guestToRemove: - Bare field guestToRemove must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#iconPath: - Bare field iconPath must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#id: - Bare field id must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#lastLoggedInFingerprint: - Bare field lastLoggedInFingerprint must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#lastLoggedInTime: - Bare field lastLoggedInTime must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#name: - Bare field name must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#partial: - Bare field partial must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#preCreated: - Bare field preCreated must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#profileBadge: - Bare field profileBadge must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#profileGroupId: - Bare field profileGroupId must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#restrictedProfileParentId: - Bare field restrictedProfileParentId must be marked final, or moved behind accessors if mutable -MutableBareField: android.content.pm.UserInfo#serialNumber: - Bare field serialNumber must be marked final, or moved behind accessors if mutable -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: - 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: - 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: - 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#HDR_CONVERSION_MODE: - New setting keys are not allowed (Field: HDR_CONVERSION_MODE); use getters/setters in relevant manager class -NoSettingsProvider: android.provider.Settings.Global#HDR_FORCE_CONVERSION_TYPE: - New setting keys are not allowed (Field: HDR_FORCE_CONVERSION_TYPE); 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: - 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: - 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: - 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: - 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: - 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: - New setting keys are not allowed (Field: AUTOFILL_SERVICE); use getters/setters in relevant manager class -NoSettingsProvider: android.provider.Settings.Secure#BIOMETRIC_VIRTUAL_ENABLED: - New setting keys are not allowed (Field: BIOMETRIC_VIRTUAL_ENABLED); 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: - 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: - 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: - 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 - - -OnNameExpected: android.service.notification.ConditionProviderService#isBound(): - If implemented by developer, should follow the on<Something> style; otherwise consider marking final -OnNameExpected: android.service.watchdog.ExplicitHealthCheckService#setCallback(android.os.RemoteCallback): - 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.credentials.ui.ProviderData#ProviderData(android.os.Parcel): - Parcelable inflation is exposed through CREATOR, not raw constructors, in android.credentials.ui.ProviderData -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): - Parcelable inflation is exposed through CREATOR, not raw constructors, in android.os.health.HealthStatsParceler - - -ParcelCreator: android.app.WindowConfiguration: - 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.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): 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()} -RethrowRemoteException: android.app.ActivityManager#resumeAppSwitches(): - Methods calling system APIs should rethrow `RemoteException` as `RuntimeException` (but do not list it in the throws clause) - - -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[]): - 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): - 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>>): - 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): - 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: - Fully-static utility classes must not have constructor -StaticUtils: android.util.FeatureFlagUtils: - 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): - 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: - Type `java.util.Locale` should be replaced with richer ICU type `android.icu.util.ULocale` - - -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): - 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): - 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: - Classes holding a set of parameters should be called `FooParams`, was `ContentCaptureOptions` - - -VisiblySynchronized: PsiThisExpression: - 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) +SamShouldBeLast: android.animation.ValueAnimator#ofObject(android.animation.TypeEvaluator, java.lang.Object...): + SAM-compatible parameters (such as parameter 1, "evaluator", in android.animation.ValueAnimator.ofObject) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +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.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#set(int, long, long, long, android.app.AlarmManager.OnAlarmListener, android.os.Handler, android.os.WorkSource): + SAM-compatible parameters (such as parameter 5, "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.PendingIntent#send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler): + 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(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler, String): + 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(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler, String, android.os.Bundle): + 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.app.UiAutomation#executeAndWaitForEvent(Runnable, android.app.UiAutomation.AccessibilityEventFilter, long): + SAM-compatible parameters (such as parameter 2, "filter", in android.app.UiAutomation.executeAndWaitForEvent) 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): + 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.pm.ActivityInfo#dump(android.util.Printer, String): + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.ActivityInfo.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.ComponentInfo#dumpBack(android.util.Printer, String): + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.ComponentInfo.dumpBack) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.content.pm.ComponentInfo#dumpFront(android.util.Printer, String): + SAM-compatible parameters (such as parameter 1, "pw", in android.content.pm.ComponentInfo.dumpFront) 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.database.sqlite.SQLiteCursorDriver#query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]): + SAM-compatible parameters (such as parameter 1, "factory", in android.database.sqlite.SQLiteCursorDriver.query) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.graphics.drawable.AdaptiveIconDrawable#scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long): + SAM-compatible parameters (such as parameter 2, "what", in android.graphics.drawable.AdaptiveIconDrawable.scheduleDrawable) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.graphics.drawable.Drawable#scheduleSelf(Runnable, long): + SAM-compatible parameters (such as parameter 1, "what", in android.graphics.drawable.Drawable.scheduleSelf) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.graphics.drawable.Drawable.Callback#scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long): + SAM-compatible parameters (such as parameter 2, "what", in android.graphics.drawable.Drawable.Callback.scheduleDrawable) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.graphics.drawable.LayerDrawable#scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long): + SAM-compatible parameters (such as parameter 2, "what", in android.graphics.drawable.LayerDrawable.scheduleDrawable) 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): + 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.AudioManager#requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy): + 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.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.AudioRecord.OnRoutingChangedListener, android.os.Handler): + 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.AudioRecord#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): + 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.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.AudioTrack#addOnRoutingChangedListener(android.media.AudioTrack.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.MediaCas#setEventListener(android.media.MediaCas.EventListener, android.os.Handler): + SAM-compatible parameters (such as parameter 1, "listener", in android.media.MediaCas.setEventListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.os.Parcel#createFixedArray(Class<T>, java.util.function.Function<android.os.IBinder,S>, int...): + SAM-compatible parameters (such as parameter 2, "asInterface", in android.os.Parcel.createFixedArray) 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.Choreographer#postFrameCallbackDelayed(android.view.Choreographer.FrameCallback, long): + SAM-compatible parameters (such as parameter 1, "callback", in android.view.Choreographer.postFrameCallbackDelayed) 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.view.inputmethod.InputMethodInfo#dump(android.util.Printer, String): + SAM-compatible parameters (such as parameter 1, "pw", in android.view.inputmethod.InputMethodInfo.dump) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions + + +UnflaggedApi: android.Manifest.permission#MANAGE_REMOTE_AUTH: + New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_REMOTE_AUTH +UnflaggedApi: android.Manifest.permission#START_ACTIVITIES_FROM_SDK_SANDBOX: + New API must be flagged with @FlaggedApi: field android.Manifest.permission.START_ACTIVITIES_FROM_SDK_SANDBOX +UnflaggedApi: android.Manifest.permission#USE_REMOTE_AUTH: + New API must be flagged with @FlaggedApi: field android.Manifest.permission.USE_REMOTE_AUTH +UnflaggedApi: android.app.admin.DevicePolicyIdentifiers#PERMITTED_INPUT_METHODS_POLICY: + New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyIdentifiers.PERMITTED_INPUT_METHODS_POLICY +UnflaggedApi: android.app.admin.DevicePolicyIdentifiers#PERSONAL_APPS_SUSPENDED_POLICY: + New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyIdentifiers.PERSONAL_APPS_SUSPENDED_POLICY +UnflaggedApi: android.app.admin.DevicePolicyIdentifiers#SCREEN_CAPTURE_DISABLED_POLICY: + New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyIdentifiers.SCREEN_CAPTURE_DISABLED_POLICY +UnflaggedApi: android.app.admin.DevicePolicyIdentifiers#USB_DATA_SIGNALING_POLICY: + New API must be flagged with @FlaggedApi: field android.app.admin.DevicePolicyIdentifiers.USB_DATA_SIGNALING_POLICY +UnflaggedApi: android.companion.AssociationInfo.Builder: + New API must be flagged with @FlaggedApi: class android.companion.AssociationInfo.Builder +UnflaggedApi: android.companion.AssociationInfo.Builder#Builder(android.companion.AssociationInfo): + New API must be flagged with @FlaggedApi: constructor android.companion.AssociationInfo.Builder(android.companion.AssociationInfo) +UnflaggedApi: android.companion.AssociationInfo.Builder#Builder(int, int, String): + New API must be flagged with @FlaggedApi: constructor android.companion.AssociationInfo.Builder(int,int,String) +UnflaggedApi: android.companion.AssociationInfo.Builder#build(): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.build() +UnflaggedApi: android.companion.AssociationInfo.Builder#setAssociatedDevice(android.companion.AssociatedDevice): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setAssociatedDevice(android.companion.AssociatedDevice) +UnflaggedApi: android.companion.AssociationInfo.Builder#setDeviceMacAddress(android.net.MacAddress): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setDeviceMacAddress(android.net.MacAddress) +UnflaggedApi: android.companion.AssociationInfo.Builder#setDeviceProfile(String): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setDeviceProfile(String) +UnflaggedApi: android.companion.AssociationInfo.Builder#setDisplayName(CharSequence): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setDisplayName(CharSequence) +UnflaggedApi: android.companion.AssociationInfo.Builder#setLastTimeConnected(long): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setLastTimeConnected(long) +UnflaggedApi: android.companion.AssociationInfo.Builder#setNotifyOnDeviceNearby(boolean): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setNotifyOnDeviceNearby(boolean) +UnflaggedApi: android.companion.AssociationInfo.Builder#setRevoked(boolean): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setRevoked(boolean) +UnflaggedApi: android.companion.AssociationInfo.Builder#setSelfManaged(boolean): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setSelfManaged(boolean) +UnflaggedApi: android.companion.AssociationInfo.Builder#setSystemDataSyncFlags(int): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setSystemDataSyncFlags(int) +UnflaggedApi: android.companion.AssociationInfo.Builder#setTag(String): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setTag(String) +UnflaggedApi: android.companion.AssociationInfo.Builder#setTimeApproved(long): + New API must be flagged with @FlaggedApi: method android.companion.AssociationInfo.Builder.setTimeApproved(long) +UnflaggedApi: android.companion.CompanionDeviceManager#MESSAGE_REQUEST_PING: + New API must be flagged with @FlaggedApi: field android.companion.CompanionDeviceManager.MESSAGE_REQUEST_PING +UnflaggedApi: android.companion.CompanionDeviceManager#enableSecureTransport(boolean): + New API must be flagged with @FlaggedApi: method android.companion.CompanionDeviceManager.enableSecureTransport(boolean) +UnflaggedApi: android.content.AttributionSource#AttributionSource(int, int, String, String, android.os.IBinder, String[], android.content.AttributionSource): + New API must be flagged with @FlaggedApi: constructor android.content.AttributionSource(int,int,String,String,android.os.IBinder,String[],android.content.AttributionSource) +UnflaggedApi: android.content.AttributionSource#AttributionSource(int, int, String, String, android.os.IBinder, String[], int, android.content.AttributionSource): + New API must be flagged with @FlaggedApi: constructor android.content.AttributionSource(int,int,String,String,android.os.IBinder,String[],int,android.content.AttributionSource) +UnflaggedApi: android.content.pm.UserInfo#isCommunalProfile(): + New API must be flagged with @FlaggedApi: method android.content.pm.UserInfo.isCommunalProfile() +UnflaggedApi: android.content.pm.UserInfo#isPrivateProfile(): + New API must be flagged with @FlaggedApi: method android.content.pm.UserInfo.isPrivateProfile() +UnflaggedApi: android.credentials.CredentialProviderInfo#isPrimary(): + New API must be flagged with @FlaggedApi: method android.credentials.CredentialProviderInfo.isPrimary() +UnflaggedApi: android.media.AudioManager#enterAudioFocusFreezeForTest(java.util.List<java.lang.Integer>): + New API must be flagged with @FlaggedApi: method android.media.AudioManager.enterAudioFocusFreezeForTest(java.util.List<java.lang.Integer>) +UnflaggedApi: android.media.AudioManager#exitAudioFocusFreezeForTest(): + New API must be flagged with @FlaggedApi: method android.media.AudioManager.exitAudioFocusFreezeForTest() +UnflaggedApi: android.media.AudioManager#getFocusDuckedUidsForTest(): + New API must be flagged with @FlaggedApi: method android.media.AudioManager.getFocusDuckedUidsForTest() +UnflaggedApi: android.media.AudioManager#getFocusFadeOutDurationForTest(): + New API must be flagged with @FlaggedApi: method android.media.AudioManager.getFocusFadeOutDurationForTest() +UnflaggedApi: android.media.AudioManager#getFocusUnmuteDelayAfterFadeOutForTest(): + New API must be flagged with @FlaggedApi: method android.media.AudioManager.getFocusUnmuteDelayAfterFadeOutForTest() +UnflaggedApi: android.media.RingtoneSelection: + New API must be flagged with @FlaggedApi: class android.media.RingtoneSelection +UnflaggedApi: android.media.RingtoneSelection#DEFAULT_SELECTION_URI_STRING: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.DEFAULT_SELECTION_URI_STRING +UnflaggedApi: android.media.RingtoneSelection#FROM_URI_RINGTONE_SELECTION_ONLY: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.FROM_URI_RINGTONE_SELECTION_ONLY +UnflaggedApi: android.media.RingtoneSelection#FROM_URI_RINGTONE_SELECTION_OR_SOUND: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.FROM_URI_RINGTONE_SELECTION_OR_SOUND +UnflaggedApi: android.media.RingtoneSelection#FROM_URI_RINGTONE_SELECTION_OR_VIBRATION: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.FROM_URI_RINGTONE_SELECTION_OR_VIBRATION +UnflaggedApi: android.media.RingtoneSelection#SOUND_SOURCE_DEFAULT: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.SOUND_SOURCE_DEFAULT +UnflaggedApi: android.media.RingtoneSelection#SOUND_SOURCE_OFF: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.SOUND_SOURCE_OFF +UnflaggedApi: android.media.RingtoneSelection#SOUND_SOURCE_URI: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.SOUND_SOURCE_URI +UnflaggedApi: android.media.RingtoneSelection#VIBRATION_SOURCE_APPLICATION_PROVIDED: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.VIBRATION_SOURCE_APPLICATION_PROVIDED +UnflaggedApi: android.media.RingtoneSelection#VIBRATION_SOURCE_AUDIO_CHANNEL: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.VIBRATION_SOURCE_AUDIO_CHANNEL +UnflaggedApi: android.media.RingtoneSelection#VIBRATION_SOURCE_DEFAULT: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.VIBRATION_SOURCE_DEFAULT +UnflaggedApi: android.media.RingtoneSelection#VIBRATION_SOURCE_HAPTIC_GENERATOR: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.VIBRATION_SOURCE_HAPTIC_GENERATOR +UnflaggedApi: android.media.RingtoneSelection#VIBRATION_SOURCE_OFF: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.VIBRATION_SOURCE_OFF +UnflaggedApi: android.media.RingtoneSelection#VIBRATION_SOURCE_URI: + New API must be flagged with @FlaggedApi: field android.media.RingtoneSelection.VIBRATION_SOURCE_URI +UnflaggedApi: android.media.RingtoneSelection#fromUri(android.net.Uri, int): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.fromUri(android.net.Uri,int) +UnflaggedApi: android.media.RingtoneSelection#getSoundSource(): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.getSoundSource() +UnflaggedApi: android.media.RingtoneSelection#getSoundUri(): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.getSoundUri() +UnflaggedApi: android.media.RingtoneSelection#getVibrationSource(): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.getVibrationSource() +UnflaggedApi: android.media.RingtoneSelection#getVibrationUri(): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.getVibrationUri() +UnflaggedApi: android.media.RingtoneSelection#isRingtoneSelectionUri(android.net.Uri): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.isRingtoneSelectionUri(android.net.Uri) +UnflaggedApi: android.media.RingtoneSelection#toUri(): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.toUri() +UnflaggedApi: android.media.RingtoneSelection.Builder: + New API must be flagged with @FlaggedApi: class android.media.RingtoneSelection.Builder +UnflaggedApi: android.media.RingtoneSelection.Builder#Builder(): + New API must be flagged with @FlaggedApi: constructor android.media.RingtoneSelection.Builder() +UnflaggedApi: android.media.RingtoneSelection.Builder#Builder(android.media.RingtoneSelection): + New API must be flagged with @FlaggedApi: constructor android.media.RingtoneSelection.Builder(android.media.RingtoneSelection) +UnflaggedApi: android.media.RingtoneSelection.Builder#build(): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.Builder.build() +UnflaggedApi: android.media.RingtoneSelection.Builder#setSoundSource(android.net.Uri): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.Builder.setSoundSource(android.net.Uri) +UnflaggedApi: android.media.RingtoneSelection.Builder#setSoundSource(int): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.Builder.setSoundSource(int) +UnflaggedApi: android.media.RingtoneSelection.Builder#setVibrationSource(android.net.Uri): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.Builder.setVibrationSource(android.net.Uri) +UnflaggedApi: android.media.RingtoneSelection.Builder#setVibrationSource(int): + New API must be flagged with @FlaggedApi: method android.media.RingtoneSelection.Builder.setVibrationSource(int) +UnflaggedApi: android.media.soundtrigger.SoundTriggerInstrumentation#setInPhoneCallState(boolean): + New API must be flagged with @FlaggedApi: method android.media.soundtrigger.SoundTriggerInstrumentation.setInPhoneCallState(boolean) +UnflaggedApi: android.media.soundtrigger.SoundTriggerManager#createManagerForModule(android.hardware.soundtrigger.SoundTrigger.ModuleProperties): + New API must be flagged with @FlaggedApi: method android.media.soundtrigger.SoundTriggerManager.createManagerForModule(android.hardware.soundtrigger.SoundTrigger.ModuleProperties) +UnflaggedApi: android.media.soundtrigger.SoundTriggerManager#createManagerForTestModule(): + New API must be flagged with @FlaggedApi: method android.media.soundtrigger.SoundTriggerManager.createManagerForTestModule() +UnflaggedApi: android.media.soundtrigger.SoundTriggerManager#listModuleProperties(): + New API must be flagged with @FlaggedApi: method android.media.soundtrigger.SoundTriggerManager.listModuleProperties() +UnflaggedApi: android.media.soundtrigger.SoundTriggerManager#loadSoundModel(android.hardware.soundtrigger.SoundTrigger.SoundModel): + New API must be flagged with @FlaggedApi: method android.media.soundtrigger.SoundTriggerManager.loadSoundModel(android.hardware.soundtrigger.SoundTrigger.SoundModel) +UnflaggedApi: android.media.soundtrigger.SoundTriggerManager.Model#getSoundModel(): + New API must be flagged with @FlaggedApi: method android.media.soundtrigger.SoundTriggerManager.Model.getSoundModel() +UnflaggedApi: android.net.wifi.sharedconnectivity.app.SharedConnectivityManager#getBroadcastReceiver(): + New API must be flagged with @FlaggedApi: method android.net.wifi.sharedconnectivity.app.SharedConnectivityManager.getBroadcastReceiver() +UnflaggedApi: android.os.BatteryManager#BATTERY_PLUGGED_ANY: + New API must be flagged with @FlaggedApi: field android.os.BatteryManager.BATTERY_PLUGGED_ANY +UnflaggedApi: android.os.BugreportParams#BUGREPORT_MODE_MAX_VALUE: + New API must be flagged with @FlaggedApi: field android.os.BugreportParams.BUGREPORT_MODE_MAX_VALUE +UnflaggedApi: android.os.PowerManager#isBatterySaverSupported(): + New API must be flagged with @FlaggedApi: method android.os.PowerManager.isBatterySaverSupported() +UnflaggedApi: android.os.UserHandle#USER_CURRENT: + New API must be flagged with @FlaggedApi: field android.os.UserHandle.USER_CURRENT +UnflaggedApi: android.os.UserManager#getAliveUsers(): + New API must be flagged with @FlaggedApi: method android.os.UserManager.getAliveUsers() +UnflaggedApi: android.os.UserManager#getUsers(): + New API must be flagged with @FlaggedApi: method android.os.UserManager.getUsers() +UnflaggedApi: android.os.vibrator.persistence.ParsedVibration: + New API must be flagged with @FlaggedApi: class android.os.vibrator.persistence.ParsedVibration +UnflaggedApi: android.os.vibrator.persistence.ParsedVibration#getVibrationEffects(): + New API must be flagged with @FlaggedApi: method android.os.vibrator.persistence.ParsedVibration.getVibrationEffects() +UnflaggedApi: android.os.vibrator.persistence.ParsedVibration#resolve(android.os.Vibrator): + New API must be flagged with @FlaggedApi: method android.os.vibrator.persistence.ParsedVibration.resolve(android.os.Vibrator) +UnflaggedApi: android.os.vibrator.persistence.VibrationXmlParser: + New API must be flagged with @FlaggedApi: class android.os.vibrator.persistence.VibrationXmlParser +UnflaggedApi: android.os.vibrator.persistence.VibrationXmlParser#parseDocument(java.io.Reader): + New API must be flagged with @FlaggedApi: method android.os.vibrator.persistence.VibrationXmlParser.parseDocument(java.io.Reader) +UnflaggedApi: android.os.vibrator.persistence.VibrationXmlParser#parseVibrationEffect(java.io.Reader): + New API must be flagged with @FlaggedApi: method android.os.vibrator.persistence.VibrationXmlParser.parseVibrationEffect(java.io.Reader) +UnflaggedApi: android.os.vibrator.persistence.VibrationXmlSerializer: + New API must be flagged with @FlaggedApi: class android.os.vibrator.persistence.VibrationXmlSerializer +UnflaggedApi: android.os.vibrator.persistence.VibrationXmlSerializer#serialize(android.os.VibrationEffect, java.io.Writer): + New API must be flagged with @FlaggedApi: method android.os.vibrator.persistence.VibrationXmlSerializer.serialize(android.os.VibrationEffect,java.io.Writer) +UnflaggedApi: android.os.vibrator.persistence.VibrationXmlSerializer.SerializationFailedException: + New API must be flagged with @FlaggedApi: class android.os.vibrator.persistence.VibrationXmlSerializer.SerializationFailedException +UnflaggedApi: android.service.notification.NotificationRankingUpdate: + New API must be flagged with @FlaggedApi: class android.service.notification.NotificationRankingUpdate +UnflaggedApi: android.service.notification.NotificationRankingUpdate#CONTENTS_FILE_DESCRIPTOR: + New API must be flagged with @FlaggedApi: field android.service.notification.NotificationRankingUpdate.CONTENTS_FILE_DESCRIPTOR +UnflaggedApi: android.service.notification.NotificationRankingUpdate#PARCELABLE_WRITE_RETURN_VALUE: + New API must be flagged with @FlaggedApi: field android.service.notification.NotificationRankingUpdate.PARCELABLE_WRITE_RETURN_VALUE +UnflaggedApi: android.service.notification.NotificationRankingUpdate#isFdNotNullAndClosed(): + New API must be flagged with @FlaggedApi: method android.service.notification.NotificationRankingUpdate.isFdNotNullAndClosed() +UnflaggedApi: android.telephony.TelephonyManager#HAL_SERVICE_SATELLITE: + New API must be flagged with @FlaggedApi: field android.telephony.TelephonyManager.HAL_SERVICE_SATELLITE +UnflaggedApi: android.telephony.ims.feature.MmTelFeature.MmTelCapabilities: + New API must be flagged with @FlaggedApi: class android.telephony.ims.feature.MmTelFeature.MmTelCapabilities +UnflaggedApi: android.text.MeasuredParagraph: + New API must be flagged with @FlaggedApi: class android.text.MeasuredParagraph +UnflaggedApi: android.text.MeasuredParagraph#buildForStaticLayoutTest(android.text.TextPaint, android.graphics.text.LineBreakConfig, CharSequence, int, int, android.text.TextDirectionHeuristic, int, boolean, android.text.MeasuredParagraph.StyleRunCallback): + New API must be flagged with @FlaggedApi: method android.text.MeasuredParagraph.buildForStaticLayoutTest(android.text.TextPaint,android.graphics.text.LineBreakConfig,CharSequence,int,int,android.text.TextDirectionHeuristic,int,boolean,android.text.MeasuredParagraph.StyleRunCallback) +UnflaggedApi: android.text.MeasuredParagraph.StyleRunCallback: + New API must be flagged with @FlaggedApi: class android.text.MeasuredParagraph.StyleRunCallback +UnflaggedApi: android.text.MeasuredParagraph.StyleRunCallback#onAppendReplacementRun(android.graphics.Paint, int, float): + New API must be flagged with @FlaggedApi: method android.text.MeasuredParagraph.StyleRunCallback.onAppendReplacementRun(android.graphics.Paint,int,float) +UnflaggedApi: android.text.MeasuredParagraph.StyleRunCallback#onAppendStyleRun(android.graphics.Paint, android.graphics.text.LineBreakConfig, int, boolean): + New API must be flagged with @FlaggedApi: method android.text.MeasuredParagraph.StyleRunCallback.onAppendStyleRun(android.graphics.Paint,android.graphics.text.LineBreakConfig,int,boolean) +UnflaggedApi: android.view.Choreographer#getFrameTimeNanos(): + New API must be flagged with @FlaggedApi: method android.view.Choreographer.getFrameTimeNanos() +UnflaggedApi: android.view.InputDevice#getAssociatedDisplayId(): + New API must be flagged with @FlaggedApi: method android.view.InputDevice.getAssociatedDisplayId() +UnflaggedApi: android.view.InputDevice#getKeyboardLanguageTag(): + New API must be flagged with @FlaggedApi: method android.view.InputDevice.getKeyboardLanguageTag() +UnflaggedApi: android.view.InputDevice#getKeyboardLayoutType(): + New API must be flagged with @FlaggedApi: method android.view.InputDevice.getKeyboardLayoutType() +UnflaggedApi: android.view.MotionEvent.PointerCoords#isResampled(): + New API must be flagged with @FlaggedApi: method android.view.MotionEvent.PointerCoords.isResampled() +UnflaggedApi: android.view.WindowManager#replaceContentOnDisplayWithMirror(int, android.view.Window): + New API must be flagged with @FlaggedApi: method android.view.WindowManager.replaceContentOnDisplayWithMirror(int,android.view.Window) +UnflaggedApi: android.view.WindowManager#replaceContentOnDisplayWithSc(int, android.view.SurfaceControl): + New API must be flagged with @FlaggedApi: method android.view.WindowManager.replaceContentOnDisplayWithSc(int,android.view.SurfaceControl) +UnflaggedApi: android.view.WindowManager.LayoutParams#preferredMaxDisplayRefreshRate: + New API must be flagged with @FlaggedApi: field android.view.WindowManager.LayoutParams.preferredMaxDisplayRefreshRate +UnflaggedApi: android.view.WindowManager.LayoutParams#preferredMinDisplayRefreshRate: + New API must be flagged with @FlaggedApi: field android.view.WindowManager.LayoutParams.preferredMinDisplayRefreshRate +UnflaggedApi: android.view.accessibility.AccessibilityWindowInfo#UNDEFINED_WINDOW_ID: + New API must be flagged with @FlaggedApi: field android.view.accessibility.AccessibilityWindowInfo.UNDEFINED_WINDOW_ID +UnflaggedApi: android.view.animation.AnimationUtils#lockAnimationClock(long, long): + New API must be flagged with @FlaggedApi: method android.view.animation.AnimationUtils.lockAnimationClock(long,long) +UnflaggedApi: android.view.inputmethod.InputMethodManager#getEnabledInputMethodListAsUser(android.os.UserHandle): + New API must be flagged with @FlaggedApi: method android.view.inputmethod.InputMethodManager.getEnabledInputMethodListAsUser(android.os.UserHandle) +UnflaggedApi: android.view.inputmethod.InputMethodManager#getEnabledInputMethodSubtypeListAsUser(String, boolean, android.os.UserHandle): + New API must be flagged with @FlaggedApi: method android.view.inputmethod.InputMethodManager.getEnabledInputMethodSubtypeListAsUser(String,boolean,android.os.UserHandle) +UnflaggedApi: android.view.inputmethod.InputMethodManager#isCurrentRootView(android.view.View): + New API must be flagged with @FlaggedApi: method android.view.inputmethod.InputMethodManager.isCurrentRootView(android.view.View) +UnflaggedApi: android.view.inputmethod.InputMethodManager#isStylusHandwritingAvailableAsUser(android.os.UserHandle): + New API must be flagged with @FlaggedApi: method android.view.inputmethod.InputMethodManager.isStylusHandwritingAvailableAsUser(android.os.UserHandle) +UnflaggedApi: android.view.inputmethod.InsertModeGesture: + New API must be flagged with @FlaggedApi: class android.view.inputmethod.InsertModeGesture +UnflaggedApi: android.window.WindowInfosListenerForTest.WindowInfo#displayId: + New API must be flagged with @FlaggedApi: field android.window.WindowInfosListenerForTest.WindowInfo.displayId +UnflaggedApi: android.window.WindowInfosListenerForTest.WindowInfo#isVisible: + New API must be flagged with @FlaggedApi: field android.window.WindowInfosListenerForTest.WindowInfo.isVisible +UnflaggedApi: android.window.WindowInfosListenerForTest.WindowInfo#transform: + New API must be flagged with @FlaggedApi: field android.window.WindowInfosListenerForTest.WindowInfo.transform diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java index 408869ec76bc..20771af7d26d 100644 --- a/core/java/android/credentials/CredentialManager.java +++ b/core/java/android/credentials/CredentialManager.java @@ -131,15 +131,35 @@ public final class CredentialManager { @Hide public void getCandidateCredentials( @NonNull GetCredentialRequest request, + @NonNull String callingPackage, @Nullable CancellationSignal cancellationSignal, @CallbackExecutor @NonNull Executor executor, - @NonNull OutcomeReceiver<GetCredentialResponse, GetCredentialException> callback) { + @NonNull OutcomeReceiver<GetCandidateCredentialsResponse, + GetCandidateCredentialsException> callback + ) { requireNonNull(request, "request must not be null"); + requireNonNull(callingPackage, "callingPackage must not be null"); requireNonNull(executor, "executor must not be null"); requireNonNull(callback, "callback must not be null"); if (cancellationSignal != null && cancellationSignal.isCanceled()) { - Log.w(TAG, "getCredential already canceled"); + Log.w(TAG, "getCandidateCredentials already canceled"); + return; + } + + ICancellationSignal cancelRemote = null; + try { + cancelRemote = + mService.getCandidateCredentials( + request, + new GetCandidateCredentialsTransport(executor, callback), + mContext.getOpPackageName()); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + + if (cancellationSignal != null && cancelRemote != null) { + cancellationSignal.setRemote(cancelRemote); } } diff --git a/core/java/android/credentials/GetCandidateCredentialsResponse.java b/core/java/android/credentials/GetCandidateCredentialsResponse.java index 1d649eb92fde..231e4bc4ac75 100644 --- a/core/java/android/credentials/GetCandidateCredentialsResponse.java +++ b/core/java/android/credentials/GetCandidateCredentialsResponse.java @@ -17,9 +17,17 @@ package android.credentials; import android.annotation.Hide; +import android.annotation.NonNull; +import android.credentials.ui.GetCredentialProviderData; import android.os.Parcel; import android.os.Parcelable; +import com.android.internal.util.AnnotationValidations; +import com.android.internal.util.Preconditions; + +import java.util.ArrayList; +import java.util.List; + /** * A list of candidate credentials. * @@ -28,11 +36,34 @@ import android.os.Parcelable; @Hide public final class GetCandidateCredentialsResponse implements Parcelable { // TODO(b/299321990): Add members + + @NonNull + private final List<GetCredentialProviderData> mCandidateProviderDataList; + + /** + * @hide + */ + @Hide + public GetCandidateCredentialsResponse( + List<GetCredentialProviderData> candidateProviderDataList + ) { + Preconditions.checkCollectionNotEmpty( + candidateProviderDataList, + /*valueName=*/ "candidateProviderDataList"); + mCandidateProviderDataList = new ArrayList<>(candidateProviderDataList); + } + protected GetCandidateCredentialsResponse(Parcel in) { + List<GetCredentialProviderData> candidateProviderDataList = new ArrayList<>(); + in.readTypedList(candidateProviderDataList, GetCredentialProviderData.CREATOR); + mCandidateProviderDataList = candidateProviderDataList; + + AnnotationValidations.validate(NonNull.class, null, mCandidateProviderDataList); } @Override public void writeToParcel(Parcel dest, int flags) { + dest.writeTypedList(mCandidateProviderDataList); } @Override @@ -41,7 +72,7 @@ public final class GetCandidateCredentialsResponse implements Parcelable { } public static final Creator<GetCandidateCredentialsResponse> CREATOR = - new Creator<GetCandidateCredentialsResponse>() { + new Creator<>() { @Override public GetCandidateCredentialsResponse createFromParcel(Parcel in) { return new GetCandidateCredentialsResponse(in); diff --git a/core/java/android/credentials/ICredentialManager.aidl b/core/java/android/credentials/ICredentialManager.aidl index 42323d66e533..d0815766024a 100644 --- a/core/java/android/credentials/ICredentialManager.aidl +++ b/core/java/android/credentials/ICredentialManager.aidl @@ -47,7 +47,7 @@ interface ICredentialManager { @nullable ICancellationSignal executeCreateCredential(in CreateCredentialRequest request, in ICreateCredentialCallback callback, String callingPackage); - @nullable ICancellationSignal getCandidateCredentials(in GetCandidateCredentialsRequest request, in IGetCandidateCredentialsCallback callback, String callingPackage); + @nullable ICancellationSignal getCandidateCredentials(in GetCredentialRequest request, in IGetCandidateCredentialsCallback callback, String callingPackage); @nullable ICancellationSignal clearCredentialState(in ClearCredentialStateRequest request, in IClearCredentialStateCallback callback, String callingPackage); diff --git a/core/java/android/inputmethodservice/SoftInputWindow.java b/core/java/android/inputmethodservice/SoftInputWindow.java index 7f6ec5821cb4..cf47786c8821 100644 --- a/core/java/android/inputmethodservice/SoftInputWindow.java +++ b/core/java/android/inputmethodservice/SoftInputWindow.java @@ -16,14 +16,12 @@ package android.inputmethodservice; -import static android.inputmethodservice.SoftInputWindowProto.BOUNDS; import static android.inputmethodservice.SoftInputWindowProto.WINDOW_STATE; import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; import android.app.Dialog; -import android.graphics.Rect; import android.os.Debug; import android.os.IBinder; import android.util.Log; @@ -45,7 +43,6 @@ final class SoftInputWindow extends Dialog { private static final String TAG = "SoftInputWindow"; private final KeyEvent.DispatcherState mDispatcherState; - private final Rect mBounds = new Rect(); private final InputMethodService mService; @Retention(SOURCE) @@ -150,22 +147,6 @@ final class SoftInputWindow extends Dialog { } @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - getWindow().getDecorView().getHitRect(mBounds); - - if (ev.isWithinBoundsNoHistory(mBounds.left, mBounds.top, - mBounds.right - 1, mBounds.bottom - 1)) { - return super.dispatchTouchEvent(ev); - } else { - MotionEvent temp = ev.clampNoHistory(mBounds.left, mBounds.top, - mBounds.right - 1, mBounds.bottom - 1); - boolean handled = super.dispatchTouchEvent(temp); - temp.recycle(); - return handled; - } - } - - @Override public void show() { switch (mWindowState) { case WindowState.TOKEN_PENDING: @@ -273,7 +254,6 @@ final class SoftInputWindow extends Dialog { void dumpDebug(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); - mBounds.dumpDebug(proto, BOUNDS); proto.write(WINDOW_STATE, mWindowState); proto.end(token); } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 7e71134f55bb..c19c20c8429d 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -3596,12 +3596,9 @@ public final class Settings { } Bundle b; - // b/252663068: if we're in system server and the caller did not call + // If we're in system server and the caller did not call // clearCallingIdentity, the read would fail due to mismatched AttributionSources. - // TODO(b/256013480): remove this bypass after fixing the callers in system server. - if (namespace.equals(DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER) - && Settings.isInSystemServer() - && Binder.getCallingUid() != Process.myUid()) { + if (Settings.isInSystemServer() && Binder.getCallingUid() != Process.myUid()) { final long token = Binder.clearCallingIdentity(); try { // Fetch all flags for the namespace at once for caching purposes diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig index cfc6f483e4ae..800149cb0a67 100644 --- a/core/java/android/security/flags.aconfig +++ b/core/java/android/security/flags.aconfig @@ -20,3 +20,11 @@ flag { description: "Feature flag for deprecating .fsv_sig" bug: "277916185" } + +flag { + name: "extend_vb_chain_to_updated_apk" + namespace: "hardware_backed_security" + description: "Use v4 signature and fs-verity to chain verification of allowlisted APKs to Verified Boot" + bug: "277916185" + is_fixed_read_only: true +} diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java index 776eeda7484e..cdf5eec32fec 100644 --- a/core/java/android/view/MotionEvent.java +++ b/core/java/android/view/MotionEvent.java @@ -18,6 +18,7 @@ package android.view; import static android.os.IInputConstants.INPUT_EVENT_FLAG_IS_ACCESSIBILITY_EVENT; import static android.view.Display.DEFAULT_DISPLAY; + import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; @@ -4360,17 +4361,6 @@ public final class MotionEvent extends InputEvent implements Parcelable { public boolean isResampled; /** - * Returns true if this pointer coords object was generated by resampling, rather than from - * an actual input event from the device at this time. - * - * @hide - */ - @TestApi - public boolean isResampled() { - return isResampled; - } - - /** * Clears the contents of this object. * Resets all axes to zero. */ diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 30fd2cfa5f28..4d53b2c6b821 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1584,11 +1584,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ static final int DISABLED = 0x00000020; - /** - * Mask for use with setFlags indicating bits used for indicating whether - * this view is enabled - * {@hide} - */ + /** + * Mask for use with setFlags indicating bits used for indicating whether + * this view is enabled + * {@hide} + */ static final int ENABLED_MASK = 0x00000020; /** @@ -15251,13 +15251,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } - /** - * @see #performAccessibilityAction(int, Bundle) - * - * Note: Called from the default {@link AccessibilityDelegate}. - * - * @hide - */ + /** + * @see #performAccessibilityAction(int, Bundle) + * + * Note: Called from the default {@link AccessibilityDelegate}. + * + * @hide + */ @UnsupportedAppUsage public boolean performAccessibilityActionInternal(int action, @Nullable Bundle arguments) { if (isNestedScrollingEnabled() @@ -17391,7 +17391,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return attachInfo.mHandler.hasCallbacks(mPendingCheckForLongPress); } - /** + /** * Remove the pending click action */ @UnsupportedAppUsage diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index fe515cd3091a..f7f39570e00c 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3752,7 +3752,15 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager && !child.isActivityDeniedForAutofillForUnimportantView()) || (shouldIncludeAllChildrenViewWithAutofillTypeNotNone(afm) && child.getAutofillType() != AUTOFILL_TYPE_NONE) - || shouldIncludeAllChildrenViews(afm)){ + || shouldIncludeAllChildrenViews(afm) + || (child instanceof ViewGroup && child.getVisibility() != View.VISIBLE)) { + // If the child is a ViewGroup object and its visibility is not visible, include + // it as part of the assist structure. The children of these invisible ViewGroup + // objects are parsed and included in the assist structure. When the Autofill + // Provider determines the visibility of these children, it looks at their + // visibility as well as their parent's visibility. Omitting invisible parents + // will lead to the Autofill Provider incorrectly assuming that these children + // of invisible parents are actually visible. list.add(child); } else if (child instanceof ViewGroup) { ((ViewGroup) child).populateChildrenForAutofill(list, flags); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index aa6d34705f8a..ff6165b8a3ba 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -4017,8 +4017,6 @@ public final class ViewRootImpl implements ViewParent, mWindowFocusChanged = false; hasWindowFocus = mUpcomingWindowFocus; } - // TODO (b/131181940): Make sure this doesn't leak Activity with mActivityConfigCallback - // config changes. if (hasWindowFocus) { mInsetsController.onWindowFocusGained( getFocusedViewOrNull() != null /* hasViewFocused */); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index ac0e493cb3c1..a0d0656a4e50 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -14151,7 +14151,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener selectionStart, OffsetMapping.MAP_STRATEGY_CURSOR); final int line = layout.getLineForOffset(offsetTransformed); final float insertionMarkerX = - layout.getPrimaryHorizontal(offsetTransformed) + layout.getPrimaryHorizontal( + offsetTransformed, layout.shouldClampCursor(line)) + viewportToContentHorizontalOffset; final float insertionMarkerTop = layout.getLineTop(line) + viewportToContentVerticalOffset; diff --git a/core/proto/android/inputmethodservice/softinputwindow.proto b/core/proto/android/inputmethodservice/softinputwindow.proto index e0ba6bf33567..32d14f0ec263 100644 --- a/core/proto/android/inputmethodservice/softinputwindow.proto +++ b/core/proto/android/inputmethodservice/softinputwindow.proto @@ -27,6 +27,6 @@ message SoftInputWindowProto { reserved 2; // window_type reserved 3; // gravity reserved 4; // takes_focus - optional .android.graphics.RectProto bounds = 5; + reserved 5; // bounds optional int32 window_state = 6; }
\ No newline at end of file diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index d09bf4413284..9ffd17fc97c4 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -5451,6 +5451,10 @@ to enroll the other eligible biometric. --> <fraction name="config_biometricNotificationFrrThreshold">25%</fraction> + <!-- Whether to enable the biometric notification for dual-modality device that enrolled a + single biometric and experiences high FRR. --> + <bool name="config_biometricFrrNotificationEnabled">false</bool> + <!-- The component name for the default profile supervisor, which can be set as a profile owner even after user setup is complete. The defined component should be used for supervision purposes only. The component must be part of a system app. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 7f1a6f9a88e3..fe1144958c52 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2604,6 +2604,7 @@ <!-- Biometric FRR config --> <java-symbol type="fraction" name="config_biometricNotificationFrrThreshold" /> + <java-symbol type="bool" name="config_biometricFrrNotificationEnabled" /> <!-- Biometric FRR notification messages --> <java-symbol type="string" name="device_unlock_notification_name" /> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java index 66e69300f45f..39e3180ffe2a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java @@ -257,8 +257,16 @@ public class BubbleViewInfoTask extends AsyncTask<Void, Void, BubbleViewInfoTask return false; } - // Badged bubble image - Drawable bubbleDrawable = iconFactory.getBubbleDrawable(c, info.shortcutInfo, b.getIcon()); + Drawable bubbleDrawable = null; + try { + // Badged bubble image + bubbleDrawable = iconFactory.getBubbleDrawable(c, info.shortcutInfo, + b.getIcon()); + } catch (Exception e) { + // If we can't create the icon we'll default to the app icon + Log.w(TAG, "Exception creating icon for the bubble: " + b.getKey()); + } + if (bubbleDrawable == null) { // Default to app icon bubbleDrawable = appIcon; @@ -268,7 +276,7 @@ public class BubbleViewInfoTask extends AsyncTask<Void, Void, BubbleViewInfoTask b.isImportantConversation()); info.badgeBitmap = badgeBitmapInfo.icon; // Raw badge bitmap never includes the important conversation ring - info.rawBadgeBitmap = b.isImportantConversation() // is this needed for bar? + info.rawBadgeBitmap = b.isImportantConversation() ? iconFactory.getBadgeBitmap(badgedIcon, false).icon : badgeBitmapInfo.icon; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index fd23d147b1b7..9f9854e7e244 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -205,6 +205,7 @@ public abstract class WMShellModule { SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopTasksController> desktopTasksController, + RecentsTransitionHandler recentsTransitionHandler, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) { if (DesktopModeStatus.isEnabled()) { return new DesktopModeWindowDecorViewModel( @@ -218,6 +219,7 @@ public abstract class WMShellModule { syncQueue, transitions, desktopTasksController, + recentsTransitionHandler, rootTaskDisplayAreaOrganizer); } return new CaptionWindowDecorViewModel( diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java index 7ae06662873f..0e617ac71463 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java @@ -134,6 +134,9 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { } final IBinder transition = mTransitions.startTransition(TRANSIT_TO_FRONT, wct, mixedHandler == null ? this : mixedHandler); + for (int i = 0; i < mStateListeners.size(); i++) { + mStateListeners.get(i).onTransitionStarted(transition); + } if (mixer != null) { mixer.setRecentsTransition(transition); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionStateListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionStateListener.java index 804dcc8a10e6..e8733ebd8f03 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionStateListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionStateListener.java @@ -16,10 +16,15 @@ package com.android.wm.shell.recents; +import android.os.IBinder; + /** The listener for the events from {@link RecentsTransitionHandler}. */ public interface RecentsTransitionStateListener { /** Notifies whether the recents animation is running. */ default void onAnimationStateChanged(boolean running) { } + + /** Notifies that a recents shell transition has started. */ + default void onTransitionStarted(IBinder transition) {} } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index b4e181808194..afa2754803f1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; + import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; import static com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler.FINAL_FREEFORM_SCALE; @@ -73,6 +74,8 @@ import com.android.wm.shell.desktopmode.DesktopModeStatus; import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition; import com.android.wm.shell.freeform.FreeformTaskTransitionStarter; +import com.android.wm.shell.recents.RecentsTransitionHandler; +import com.android.wm.shell.recents.RecentsTransitionStateListener; import com.android.wm.shell.splitscreen.SplitScreen; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.sysui.KeyguardChangeListener; @@ -102,6 +105,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private final DisplayController mDisplayController; private final SyncTransactionQueue mSyncQueue; private final Optional<DesktopTasksController> mDesktopTasksController; + private final RecentsTransitionHandler mRecentsTransitionHandler; private boolean mTransitionDragActive; private SparseArray<EventReceiver> mEventReceiversByDisplay = new SparseArray<>(); @@ -121,7 +125,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private MoveToDesktopAnimator mMoveToDesktopAnimator; private final Rect mDragToDesktopAnimationStartBounds = new Rect(); - private final DesktopModeKeyguardChangeListener mDesktopModeKeyguardChangeListener; + private final DesktopModeKeyguardChangeListener mDesktopModeKeyguardChangeListener = + new DesktopModeKeyguardChangeListener(); private final RootTaskDisplayAreaOrganizer mRootTaskDisplayAreaOrganizer; public DesktopModeWindowDecorViewModel( @@ -135,6 +140,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopTasksController> desktopTasksController, + RecentsTransitionHandler recentsTransitionHandler, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer ) { this( @@ -148,10 +154,10 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { syncQueue, transitions, desktopTasksController, + recentsTransitionHandler, new DesktopModeWindowDecoration.Factory(), new InputMonitorFactory(), SurfaceControl.Transaction::new, - new DesktopModeKeyguardChangeListener(), rootTaskDisplayAreaOrganizer); } @@ -167,10 +173,10 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopTasksController> desktopTasksController, + RecentsTransitionHandler recentsTransitionHandler, DesktopModeWindowDecoration.Factory desktopModeWindowDecorFactory, InputMonitorFactory inputMonitorFactory, Supplier<SurfaceControl.Transaction> transactionFactory, - DesktopModeKeyguardChangeListener desktopModeKeyguardChangeListener, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) { mContext = context; mMainHandler = mainHandler; @@ -182,11 +188,11 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mSyncQueue = syncQueue; mTransitions = transitions; mDesktopTasksController = desktopTasksController; + mRecentsTransitionHandler = recentsTransitionHandler; mDesktopModeWindowDecorFactory = desktopModeWindowDecorFactory; mInputMonitorFactory = inputMonitorFactory; mTransactionFactory = transactionFactory; - mDesktopModeKeyguardChangeListener = desktopModeKeyguardChangeListener; mRootTaskDisplayAreaOrganizer = rootTaskDisplayAreaOrganizer; shellInit.addInitCallback(this::onInit, this); @@ -194,6 +200,12 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private void onInit() { mShellController.addKeyguardChangeListener(mDesktopModeKeyguardChangeListener); + mRecentsTransitionHandler.addTransitionStateListener(new RecentsTransitionStateListener() { + @Override + public void onTransitionStarted(IBinder transition) { + onRecentsTransitionStarted(transition); + } + }); } @Override @@ -319,6 +331,16 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } } + private void onRecentsTransitionStarted(IBinder transition) { + // Block relayout on window decorations originating from #onTaskInfoChanges until the + // animation completes to avoid interfering with the transition animation. + for (int i = 0; i < mWindowDecorByTaskId.size(); i++) { + final DesktopModeWindowDecoration decor = mWindowDecorByTaskId.valueAt(i); + decor.incrementRelayoutBlock(); + decor.addTransitionPausingRelayout(transition); + } + } + private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener, DragDetector.MotionEventHandler{ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index dbff20e6026a..b81a415d13cd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -56,6 +56,7 @@ import com.android.wm.shell.windowdecor.viewholder.DesktopModeWindowDecorationVi import java.util.HashSet; import java.util.Set; +import java.util.function.Supplier; /** * Defines visuals and behaviors of a window decoration of a caption bar and shadows. It works with @@ -109,7 +110,30 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin Choreographer choreographer, SyncTransactionQueue syncQueue, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) { - super(context, displayController, taskOrganizer, taskInfo, taskSurface, windowDecorConfig); + this (context, displayController, taskOrganizer, taskInfo, taskSurface, windowDecorConfig, + handler, choreographer, syncQueue, rootTaskDisplayAreaOrganizer, + SurfaceControl.Builder::new, SurfaceControl.Transaction::new, + WindowContainerTransaction::new, new SurfaceControlViewHostFactory() {}); + } + + DesktopModeWindowDecoration( + Context context, + DisplayController displayController, + ShellTaskOrganizer taskOrganizer, + ActivityManager.RunningTaskInfo taskInfo, + SurfaceControl taskSurface, + Configuration windowDecorConfig, + Handler handler, + Choreographer choreographer, + SyncTransactionQueue syncQueue, + RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, + Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier, + Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier, + Supplier<WindowContainerTransaction> windowContainerTransactionSupplier, + SurfaceControlViewHostFactory surfaceControlViewHostFactory) { + super(context, displayController, taskOrganizer, taskInfo, taskSurface, windowDecorConfig, + surfaceControlBuilderSupplier, surfaceControlTransactionSupplier, + windowContainerTransactionSupplier, surfaceControlViewHostFactory); mHandler = handler; mChoreographer = choreographer; @@ -150,7 +174,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin return; } - final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + final SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get(); // Use |applyStartTransactionOnDraw| so that the transaction (that applies task crop) is // synced with the buffer transaction (that draws the View). Both will be shown on screen // at the same, whereas applying them independently causes flickering. See b/270202228. @@ -183,10 +207,20 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mRelayoutParams.mCaptionHeightId = getCaptionHeightId(); mRelayoutParams.mShadowRadiusId = shadowRadiusID; mRelayoutParams.mApplyStartTransactionOnDraw = applyStartTransactionOnDraw; - - mRelayoutParams.mWindowDecorConfig = DesktopTasksController.isDesktopDensityOverrideSet() - ? mContext.getResources().getConfiguration() // Use system context - : mTaskInfo.configuration; // Use task configuration + // The configuration used to lay out the window decoration. The system context's config is + // used when the task density has been overridden to a custom density so that the resources + // and views of the decoration aren't affected and match the rest of the System UI, if not + // then just use the task's configuration. A copy is made instead of using the original + // reference so that the configuration isn't mutated on config changes and diff checks can + // be made in WindowDecoration#relayout using the pre/post-relayout configuration. + // See b/301119301. + // TODO(b/301119301): consider moving the config data needed for diffs to relayout params + // instead of using a whole Configuration as a parameter. + final Configuration windowDecorConfig = new Configuration(); + windowDecorConfig.setTo(DesktopTasksController.isDesktopDensityOverrideSet() + ? mContext.getResources().getConfiguration() // Use system context. + : mTaskInfo.configuration); // Use task configuration. + mRelayoutParams.mWindowDecorConfig = windowDecorConfig; mRelayoutParams.mCornerRadius = (int) ScreenDecorationsUtils.getWindowCornerRadius(mContext); @@ -442,6 +476,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin @Override void releaseViews() { closeHandleMenu(); + closeMaximizeMenu(); super.releaseViews(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java index a26927586b61..2d5ef72d2362 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java @@ -196,7 +196,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> final int oldDensityDpi = mWindowDecorConfig.densityDpi; mWindowDecorConfig = params.mWindowDecorConfig != null ? params.mWindowDecorConfig : mTaskInfo.getConfiguration(); - if (oldDensityDpi != mWindowDecorConfig.densityDpi + final int newDensityDpi = mWindowDecorConfig.densityDpi; + if (oldDensityDpi != newDensityDpi || mDisplay == null || mDisplay.getDisplayId() != mTaskInfo.displayId || oldLayoutResId != mLayoutResId) { diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/AutoEnterPipFromSplitScreenOnGoToHomeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/AutoEnterPipFromSplitScreenOnGoToHomeTest.kt index 2bd6d5777ff6..b86c98ebde47 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/AutoEnterPipFromSplitScreenOnGoToHomeTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/AutoEnterPipFromSplitScreenOnGoToHomeTest.kt @@ -139,6 +139,7 @@ class AutoEnterPipFromSplitScreenOnGoToHomeTest(flicker: LegacyFlickerTest) : @JvmStatic fun getParams() = LegacyFlickerTestFactory.nonRotationTests( + supportedRotations = listOf(Rotation.ROTATION_0), // TODO(b/176061063):The 3 buttons of nav bar do not exist in the hierarchy. supportedNavigationModes = listOf(NavBar.MODE_GESTURAL) ) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java deleted file mode 100644 index d8afe68bac22..000000000000 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java +++ /dev/null @@ -1,320 +0,0 @@ -/* - * 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.wm.shell.windowdecor; - -import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; -import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; -import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; -import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; -import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; - -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.ActivityManager; -import android.app.WindowConfiguration; -import android.graphics.Rect; -import android.hardware.display.DisplayManager; -import android.hardware.display.VirtualDisplay; -import android.hardware.input.InputManager; -import android.os.Handler; -import android.os.Looper; -import android.view.Choreographer; -import android.view.Display; -import android.view.InputChannel; -import android.view.InputMonitor; -import android.view.SurfaceControl; -import android.view.SurfaceView; - -import androidx.test.filters.SmallTest; - -import com.android.wm.shell.RootTaskDisplayAreaOrganizer; -import com.android.wm.shell.ShellTaskOrganizer; -import com.android.wm.shell.ShellTestCase; -import com.android.wm.shell.TestRunningTaskInfoBuilder; -import com.android.wm.shell.common.DisplayController; -import com.android.wm.shell.common.DisplayLayout; -import com.android.wm.shell.common.SyncTransactionQueue; -import com.android.wm.shell.desktopmode.DesktopTasksController; -import com.android.wm.shell.sysui.ShellController; -import com.android.wm.shell.sysui.ShellInit; -import com.android.wm.shell.transition.Transitions; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - -/** Tests of {@link DesktopModeWindowDecorViewModel} */ -@SmallTest -public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { - - private static final String TAG = "DesktopModeWindowDecorViewModelTests"; - private static final Rect STABLE_INSETS = new Rect(0, 100, 0, 0); - - @Mock private DesktopModeWindowDecoration mDesktopModeWindowDecoration; - @Mock private DesktopModeWindowDecoration.Factory mDesktopModeWindowDecorFactory; - - @Mock private Handler mMainHandler; - @Mock private Choreographer mMainChoreographer; - @Mock private ShellTaskOrganizer mTaskOrganizer; - @Mock private DisplayController mDisplayController; - @Mock private DisplayLayout mDisplayLayout; - @Mock private SyncTransactionQueue mSyncQueue; - @Mock private DesktopTasksController mDesktopTasksController; - @Mock private InputMonitor mInputMonitor; - @Mock private InputManager mInputManager; - @Mock private Transitions mTransitions; - @Mock private DesktopModeWindowDecorViewModel.InputMonitorFactory mMockInputMonitorFactory; - @Mock private Supplier<SurfaceControl.Transaction> mTransactionFactory; - @Mock private SurfaceControl.Transaction mTransaction; - @Mock private Display mDisplay; - @Mock private ShellController mShellController; - @Mock private ShellInit mShellInit; - @Mock private DesktopModeWindowDecorViewModel.DesktopModeKeyguardChangeListener - mDesktopModeKeyguardChangeListener; - @Mock private RootTaskDisplayAreaOrganizer mRootTaskDisplayAreaOrganizer; - private final List<InputManager> mMockInputManagers = new ArrayList<>(); - - private DesktopModeWindowDecorViewModel mDesktopModeWindowDecorViewModel; - - @Before - public void setUp() { - mMockInputManagers.add(mInputManager); - - mDesktopModeWindowDecorViewModel = - new DesktopModeWindowDecorViewModel( - mContext, - mMainHandler, - mMainChoreographer, - mShellInit, - mTaskOrganizer, - mDisplayController, - mShellController, - mSyncQueue, - mTransitions, - Optional.of(mDesktopTasksController), - mDesktopModeWindowDecorFactory, - mMockInputMonitorFactory, - mTransactionFactory, - mDesktopModeKeyguardChangeListener, - mRootTaskDisplayAreaOrganizer - ); - - doReturn(mDesktopModeWindowDecoration) - .when(mDesktopModeWindowDecorFactory) - .create(any(), any(), any(), any(), any(), any(), any(), any(), any()); - doReturn(mTransaction).when(mTransactionFactory).get(); - doReturn(mDisplayLayout).when(mDisplayController).getDisplayLayout(anyInt()); - doReturn(STABLE_INSETS).when(mDisplayLayout).stableInsets(); - doNothing().when(mShellController).addKeyguardChangeListener(any()); - - when(mMockInputMonitorFactory.create(any(), any())).thenReturn(mInputMonitor); - // InputChannel cannot be mocked because it passes to InputEventReceiver. - final InputChannel[] inputChannels = InputChannel.openInputChannelPair(TAG); - inputChannels[0].dispose(); - when(mInputMonitor.getInputChannel()).thenReturn(inputChannels[1]); - - mDesktopModeWindowDecoration.mDisplay = mDisplay; - doReturn(Display.DEFAULT_DISPLAY).when(mDisplay).getDisplayId(); - } - - @Test - public void testDeleteCaptionOnChangeTransitionWhenNecessary() throws Exception { - final int taskId = 1; - final ActivityManager.RunningTaskInfo taskInfo = - createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_FREEFORM); - SurfaceControl surfaceControl = mock(SurfaceControl.class); - runOnMainThread(() -> { - final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class); - final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class); - - mDesktopModeWindowDecorViewModel.onTaskOpening( - taskInfo, surfaceControl, startT, finishT); - - taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_UNDEFINED); - taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED); - mDesktopModeWindowDecorViewModel.onTaskChanging( - taskInfo, surfaceControl, startT, finishT); - }); - verify(mDesktopModeWindowDecorFactory) - .create( - mContext, - mDisplayController, - mTaskOrganizer, - taskInfo, - surfaceControl, - mMainHandler, - mMainChoreographer, - mSyncQueue, - mRootTaskDisplayAreaOrganizer); - verify(mDesktopModeWindowDecoration).close(); - } - - @Test - public void testCreateCaptionOnChangeTransitionWhenNecessary() throws Exception { - final int taskId = 1; - final ActivityManager.RunningTaskInfo taskInfo = - createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_UNDEFINED); - SurfaceControl surfaceControl = mock(SurfaceControl.class); - runOnMainThread(() -> { - final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class); - final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class); - taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED); - - mDesktopModeWindowDecorViewModel.onTaskChanging( - taskInfo, surfaceControl, startT, finishT); - - taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM); - taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_STANDARD); - - mDesktopModeWindowDecorViewModel.onTaskChanging( - taskInfo, surfaceControl, startT, finishT); - }); - verify(mDesktopModeWindowDecorFactory, times(1)) - .create( - mContext, - mDisplayController, - mTaskOrganizer, - taskInfo, - surfaceControl, - mMainHandler, - mMainChoreographer, - mSyncQueue, - mRootTaskDisplayAreaOrganizer); - } - - @Test - public void testCreateAndDisposeEventReceiver() throws Exception { - final int taskId = 1; - final ActivityManager.RunningTaskInfo taskInfo = - createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_FREEFORM); - taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_STANDARD); - runOnMainThread(() -> { - SurfaceControl surfaceControl = mock(SurfaceControl.class); - final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class); - final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class); - - mDesktopModeWindowDecorViewModel.onTaskOpening( - taskInfo, surfaceControl, startT, finishT); - - mDesktopModeWindowDecorViewModel.destroyWindowDecoration(taskInfo); - }); - verify(mMockInputMonitorFactory).create(any(), any()); - verify(mInputMonitor).dispose(); - } - - @Test - public void testEventReceiversOnMultipleDisplays() throws Exception { - runOnMainThread(() -> { - SurfaceView surfaceView = new SurfaceView(mContext); - final DisplayManager mDm = mContext.getSystemService(DisplayManager.class); - final VirtualDisplay secondaryDisplay = mDm.createVirtualDisplay( - "testEventReceiversOnMultipleDisplays", /*width=*/ 400, /*height=*/ 400, - /*densityDpi=*/ 320, surfaceView.getHolder().getSurface(), - DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY); - try { - int secondaryDisplayId = secondaryDisplay.getDisplay().getDisplayId(); - - final int taskId = 1; - final ActivityManager.RunningTaskInfo taskInfo = - createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_FREEFORM); - final ActivityManager.RunningTaskInfo secondTaskInfo = - createTaskInfo(taskId + 1, secondaryDisplayId, WINDOWING_MODE_FREEFORM); - final ActivityManager.RunningTaskInfo thirdTaskInfo = - createTaskInfo(taskId + 2, secondaryDisplayId, WINDOWING_MODE_FREEFORM); - - SurfaceControl surfaceControl = mock(SurfaceControl.class); - final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class); - final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class); - - mDesktopModeWindowDecorViewModel.onTaskOpening(taskInfo, surfaceControl, startT, - finishT); - mDesktopModeWindowDecorViewModel.onTaskOpening(secondTaskInfo, surfaceControl, - startT, finishT); - mDesktopModeWindowDecorViewModel.onTaskOpening(thirdTaskInfo, surfaceControl, - startT, finishT); - mDesktopModeWindowDecorViewModel.destroyWindowDecoration(thirdTaskInfo); - mDesktopModeWindowDecorViewModel.destroyWindowDecoration(taskInfo); - } finally { - secondaryDisplay.release(); - } - }); - verify(mMockInputMonitorFactory, times(2)).create(any(), any()); - verify(mInputMonitor, times(1)).dispose(); - } - - @Test - public void testCaptionIsNotCreatedWhenKeyguardIsVisible() throws Exception { - doReturn(true).when( - mDesktopModeKeyguardChangeListener).isKeyguardVisibleAndOccluded(); - - final int taskId = 1; - final ActivityManager.RunningTaskInfo taskInfo = - createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_FULLSCREEN); - taskInfo.isFocused = true; - SurfaceControl surfaceControl = mock(SurfaceControl.class); - runOnMainThread(() -> { - final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class); - final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class); - - mDesktopModeWindowDecorViewModel.onTaskOpening( - taskInfo, surfaceControl, startT, finishT); - - taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_UNDEFINED); - taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED); - mDesktopModeWindowDecorViewModel.onTaskChanging( - taskInfo, surfaceControl, startT, finishT); - }); - verify(mDesktopModeWindowDecorFactory, never()) - .create(any(), any(), any(), any(), any(), any(), any(), any(), any()); - } - - private void runOnMainThread(Runnable r) throws Exception { - final Handler mainHandler = new Handler(Looper.getMainLooper()); - final CountDownLatch latch = new CountDownLatch(1); - mainHandler.post(() -> { - r.run(); - latch.countDown(); - }); - latch.await(1, TimeUnit.SECONDS); - } - - private static ActivityManager.RunningTaskInfo createTaskInfo(int taskId, - int displayId, @WindowConfiguration.WindowingMode int windowingMode) { - ActivityManager.RunningTaskInfo taskInfo = - new TestRunningTaskInfoBuilder() - .setDisplayId(displayId) - .setVisible(true) - .build(); - taskInfo.taskId = taskId; - taskInfo.configuration.windowConfiguration.setWindowingMode(windowingMode); - return taskInfo; - } -} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt new file mode 100644 index 000000000000..00d70a75837b --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt @@ -0,0 +1,344 @@ +/* + * 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.wm.shell.windowdecor + +import android.app.ActivityManager.RunningTaskInfo +import android.app.WindowConfiguration +import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD +import android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED +import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM +import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN +import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED +import android.graphics.Rect +import android.hardware.display.DisplayManager +import android.hardware.display.VirtualDisplay +import android.os.Handler +import android.os.IBinder +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper.RunWithLooper +import android.view.Choreographer +import android.view.Display.DEFAULT_DISPLAY +import android.view.InputChannel +import android.view.InputMonitor +import android.view.SurfaceControl +import android.view.SurfaceView +import androidx.core.content.getSystemService +import androidx.test.filters.SmallTest +import com.android.wm.shell.RootTaskDisplayAreaOrganizer +import com.android.wm.shell.ShellTaskOrganizer +import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.TestRunningTaskInfoBuilder +import com.android.wm.shell.common.DisplayController +import com.android.wm.shell.common.DisplayLayout +import com.android.wm.shell.common.ShellExecutor +import com.android.wm.shell.common.SyncTransactionQueue +import com.android.wm.shell.desktopmode.DesktopTasksController +import com.android.wm.shell.recents.RecentsTransitionHandler +import com.android.wm.shell.recents.RecentsTransitionStateListener +import com.android.wm.shell.sysui.KeyguardChangeListener +import com.android.wm.shell.sysui.ShellController +import com.android.wm.shell.sysui.ShellInit +import com.android.wm.shell.transition.Transitions +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.mock +import org.mockito.Mockito.never +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.kotlin.any +import org.mockito.kotlin.argumentCaptor +import org.mockito.kotlin.eq +import org.mockito.kotlin.whenever +import java.util.Optional +import java.util.function.Supplier + +/** Tests of [DesktopModeWindowDecorViewModel] */ +@SmallTest +@RunWith(AndroidTestingRunner::class) +@RunWithLooper +class DesktopModeWindowDecorViewModelTests : ShellTestCase() { + @Mock private lateinit var mockDesktopModeWindowDecorFactory: + DesktopModeWindowDecoration.Factory + @Mock private lateinit var mockMainHandler: Handler + @Mock private lateinit var mockMainChoreographer: Choreographer + @Mock private lateinit var mockTaskOrganizer: ShellTaskOrganizer + @Mock private lateinit var mockDisplayController: DisplayController + @Mock private lateinit var mockDisplayLayout: DisplayLayout + @Mock private lateinit var mockSyncQueue: SyncTransactionQueue + @Mock private lateinit var mockDesktopTasksController: DesktopTasksController + @Mock private lateinit var mockInputMonitor: InputMonitor + @Mock private lateinit var mockTransitions: Transitions + @Mock private lateinit var mockInputMonitorFactory: + DesktopModeWindowDecorViewModel.InputMonitorFactory + @Mock private lateinit var mockShellController: ShellController + @Mock private lateinit var mockShellExecutor: ShellExecutor + @Mock private lateinit var mockRootTaskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer + @Mock private lateinit var mockRecentsTransitionHandler: RecentsTransitionHandler + + private val transactionFactory = Supplier<SurfaceControl.Transaction> { + SurfaceControl.Transaction() + } + + private lateinit var shellInit: ShellInit + private lateinit var desktopModeWindowDecorViewModel: DesktopModeWindowDecorViewModel + + @Before + fun setUp() { + shellInit = ShellInit(mockShellExecutor) + desktopModeWindowDecorViewModel = DesktopModeWindowDecorViewModel( + mContext, + mockMainHandler, + mockMainChoreographer, + shellInit, + mockTaskOrganizer, + mockDisplayController, + mockShellController, + mockSyncQueue, + mockTransitions, + Optional.of(mockDesktopTasksController), + mockRecentsTransitionHandler, + mockDesktopModeWindowDecorFactory, + mockInputMonitorFactory, + transactionFactory, + mockRootTaskDisplayAreaOrganizer + ) + + whenever(mockDisplayController.getDisplayLayout(any())).thenReturn(mockDisplayLayout) + whenever(mockDisplayLayout.stableInsets()).thenReturn(STABLE_INSETS) + whenever(mockInputMonitorFactory.create(any(), any())).thenReturn(mockInputMonitor) + + // InputChannel cannot be mocked because it passes to InputEventReceiver. + val inputChannels = InputChannel.openInputChannelPair(TAG) + inputChannels.first().dispose() + whenever(mockInputMonitor.inputChannel).thenReturn(inputChannels[1]) + + shellInit.init() + } + + @Test + fun testDeleteCaptionOnChangeTransitionWhenNecessary() { + val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM) + val taskSurface = SurfaceControl() + val decoration = setUpMockDecorationForTask(task) + + onTaskOpening(task, taskSurface) + + task.setWindowingMode(WINDOWING_MODE_UNDEFINED) + task.setActivityType(ACTIVITY_TYPE_UNDEFINED) + onTaskChanging(task, taskSurface) + + verify(mockDesktopModeWindowDecorFactory).create( + mContext, + mockDisplayController, + mockTaskOrganizer, + task, + taskSurface, + mockMainHandler, + mockMainChoreographer, + mockSyncQueue, + mockRootTaskDisplayAreaOrganizer + ) + verify(decoration).close() + } + + @Test + fun testCreateCaptionOnChangeTransitionWhenNecessary() { + val task = createTask( + windowingMode = WINDOWING_MODE_UNDEFINED, + activityType = ACTIVITY_TYPE_UNDEFINED + ) + val taskSurface = SurfaceControl() + setUpMockDecorationForTask(task) + + onTaskChanging(task, taskSurface) + verify(mockDesktopModeWindowDecorFactory, never()).create( + mContext, + mockDisplayController, + mockTaskOrganizer, + task, + taskSurface, + mockMainHandler, + mockMainChoreographer, + mockSyncQueue, + mockRootTaskDisplayAreaOrganizer + ) + + task.setWindowingMode(WINDOWING_MODE_FREEFORM) + task.setActivityType(ACTIVITY_TYPE_STANDARD) + onTaskChanging(task, taskSurface) + verify(mockDesktopModeWindowDecorFactory, times(1)).create( + mContext, + mockDisplayController, + mockTaskOrganizer, + task, + taskSurface, + mockMainHandler, + mockMainChoreographer, + mockSyncQueue, + mockRootTaskDisplayAreaOrganizer + ) + } + + @Test + fun testCreateAndDisposeEventReceiver() { + val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM) + setUpMockDecorationForTask(task) + + onTaskOpening(task) + desktopModeWindowDecorViewModel.destroyWindowDecoration(task) + + verify(mockInputMonitorFactory).create(any(), any()) + verify(mockInputMonitor).dispose() + } + + @Test + fun testEventReceiversOnMultipleDisplays() { + val secondaryDisplay = createVirtualDisplay() ?: return + val secondaryDisplayId = secondaryDisplay.display.displayId + val task = createTask(displayId = DEFAULT_DISPLAY, windowingMode = WINDOWING_MODE_FREEFORM) + val secondTask = createTask( + displayId = secondaryDisplayId, + windowingMode = WINDOWING_MODE_FREEFORM + ) + val thirdTask = createTask( + displayId = secondaryDisplayId, + windowingMode = WINDOWING_MODE_FREEFORM + ) + setUpMockDecorationsForTasks(task, secondTask, thirdTask) + + onTaskOpening(task) + onTaskOpening(secondTask) + onTaskOpening(thirdTask) + desktopModeWindowDecorViewModel.destroyWindowDecoration(thirdTask) + desktopModeWindowDecorViewModel.destroyWindowDecoration(task) + secondaryDisplay.release() + + verify(mockInputMonitorFactory, times(2)).create(any(), any()) + verify(mockInputMonitor, times(1)).dispose() + } + + @Test + fun testCaptionIsNotCreatedWhenKeyguardIsVisible() { + val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN, focused = true) + val keyguardListenerCaptor = argumentCaptor<KeyguardChangeListener>() + verify(mockShellController).addKeyguardChangeListener(keyguardListenerCaptor.capture()) + + keyguardListenerCaptor.firstValue.onKeyguardVisibilityChanged( + true /* visible */, + true /* occluded */, + false /* animatingDismiss */ + ) + onTaskOpening(task) + + task.setWindowingMode(WINDOWING_MODE_UNDEFINED) + task.setWindowingMode(ACTIVITY_TYPE_UNDEFINED) + onTaskChanging(task) + + verify(mockDesktopModeWindowDecorFactory, never()) + .create(any(), any(), any(), eq(task), any(), any(), any(), any(), any()) + } + + @Test + fun testRelayoutBlockedDuringRecentsTransition() { + val recentsCaptor = argumentCaptor<RecentsTransitionStateListener>() + verify(mockRecentsTransitionHandler).addTransitionStateListener(recentsCaptor.capture()) + + val transition = mock(IBinder::class.java) + val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM) + val decoration = setUpMockDecorationForTask(task) + + // Make sure a window decorations exists first by launching a freeform task. + onTaskOpening(task) + // Now call back when a Recents transition starts. + recentsCaptor.firstValue.onTransitionStarted(transition) + + verify(decoration).incrementRelayoutBlock() + verify(decoration).addTransitionPausingRelayout(transition) + } + + private fun onTaskOpening(task: RunningTaskInfo, leash: SurfaceControl = SurfaceControl()) { + desktopModeWindowDecorViewModel.onTaskOpening( + task, + leash, + SurfaceControl.Transaction(), + SurfaceControl.Transaction() + ) + } + + private fun onTaskChanging(task: RunningTaskInfo, leash: SurfaceControl = SurfaceControl()) { + desktopModeWindowDecorViewModel.onTaskChanging( + task, + leash, + SurfaceControl.Transaction(), + SurfaceControl.Transaction() + ) + } + + private fun createTask( + displayId: Int = DEFAULT_DISPLAY, + @WindowConfiguration.WindowingMode windowingMode: Int, + activityType: Int = ACTIVITY_TYPE_STANDARD, + focused: Boolean = true + ): RunningTaskInfo { + return TestRunningTaskInfoBuilder() + .setDisplayId(displayId) + .setWindowingMode(windowingMode) + .setVisible(true) + .setActivityType(activityType) + .build().apply { + isFocused = focused + } + } + + private fun setUpMockDecorationForTask(task: RunningTaskInfo): DesktopModeWindowDecoration { + val decoration = mock(DesktopModeWindowDecoration::class.java) + whenever(mockDesktopModeWindowDecorFactory.create( + any(), any(), any(), eq(task), any(), any(), any(), any(), any()) + ).thenReturn(decoration) + return decoration + } + + private fun setUpMockDecorationsForTasks(vararg tasks: RunningTaskInfo) { + tasks.forEach { setUpMockDecorationForTask(it) } + } + + private fun createVirtualDisplay(): VirtualDisplay? { + val surfaceView = SurfaceView(mContext) + return mContext.getSystemService<DisplayManager>()?.createVirtualDisplay( + "testEventReceiversOnMultipleDisplays", + /*width=*/ 400, + /*height=*/ 400, + /*densityDpi=*/320, + surfaceView.holder.surface, + DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY + ) + } + + private fun RunningTaskInfo.setWindowingMode(@WindowConfiguration.WindowingMode mode: Int) { + configuration.windowConfiguration.windowingMode = mode + } + + private fun RunningTaskInfo.setActivityType(type: Int) { + configuration.windowConfiguration.activityType = type + } + + companion object { + private const val TAG = "DesktopModeWindowDecorViewModelTests" + private val STABLE_INSETS = Rect(0, 100, 0, 0) + } +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java new file mode 100644 index 000000000000..a2dbab197fb5 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2023 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.wm.shell.windowdecor; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.app.ActivityManager; +import android.content.ComponentName; +import android.content.res.Configuration; +import android.os.Handler; +import android.testing.AndroidTestingRunner; +import android.view.Choreographer; +import android.view.Display; +import android.view.SurfaceControl; +import android.view.SurfaceControlViewHost; +import android.window.WindowContainerTransaction; + +import androidx.test.filters.SmallTest; + +import com.android.wm.shell.RootTaskDisplayAreaOrganizer; +import com.android.wm.shell.ShellTaskOrganizer; +import com.android.wm.shell.ShellTestCase; +import com.android.wm.shell.TestRunningTaskInfoBuilder; +import com.android.wm.shell.common.DisplayController; +import com.android.wm.shell.common.SyncTransactionQueue; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; + +import java.util.function.Supplier; + +/** + * Tests for {@link DesktopModeWindowDecoration}. + * + * Build/Install/Run: + * atest WMShellUnitTests:DesktopModeWindowDecorationTests + */ +@SmallTest +@RunWith(AndroidTestingRunner.class) +public class DesktopModeWindowDecorationTests extends ShellTestCase { + @Mock + private DisplayController mMockDisplayController; + @Mock + private ShellTaskOrganizer mMockShellTaskOrganizer; + @Mock + private Handler mMockHandler; + @Mock + private Choreographer mMockChoreographer; + @Mock + private SyncTransactionQueue mMockSyncQueue; + @Mock + private RootTaskDisplayAreaOrganizer mMockRootTaskDisplayAreaOrganizer; + @Mock + private Supplier<SurfaceControl.Transaction> mMockTransactionSupplier; + @Mock + private SurfaceControl.Transaction mMockTransaction; + @Mock + private SurfaceControl mMockSurfaceControl; + @Mock + private SurfaceControlViewHost mMockSurfaceControlViewHost; + @Mock + private WindowDecoration.SurfaceControlViewHostFactory mMockSurfaceControlViewHostFactory; + + private final Configuration mConfiguration = new Configuration(); + + @Before + public void setUp() { + doReturn(mMockSurfaceControlViewHost).when(mMockSurfaceControlViewHostFactory).create( + any(), any(), any()); + doReturn(mMockTransaction).when(mMockTransactionSupplier).get(); + } + + @Test + public void testMenusClosedWhenTaskIsInvisible() { + doReturn(mMockTransaction).when(mMockTransaction).hide(any()); + + final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(false /* visible */); + final DesktopModeWindowDecoration spyWindowDecor = + spy(createWindowDecoration(taskInfo)); + + spyWindowDecor.relayout(taskInfo); + + // Menus should close if open before the task being invisible causes relayout to return. + verify(spyWindowDecor).closeHandleMenu(); + verify(spyWindowDecor).closeMaximizeMenu(); + + } + + private DesktopModeWindowDecoration createWindowDecoration( + ActivityManager.RunningTaskInfo taskInfo) { + return new DesktopModeWindowDecoration(mContext, mMockDisplayController, + mMockShellTaskOrganizer, taskInfo, mMockSurfaceControl, mConfiguration, + mMockHandler, mMockChoreographer, mMockSyncQueue, mMockRootTaskDisplayAreaOrganizer, + SurfaceControl.Builder::new, mMockTransactionSupplier, + WindowContainerTransaction::new, mMockSurfaceControlViewHostFactory); + } + + private ActivityManager.RunningTaskInfo createTaskInfo(boolean visible) { + final ActivityManager.TaskDescription.Builder taskDescriptionBuilder = + new ActivityManager.TaskDescription.Builder(); + ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder() + .setDisplayId(Display.DEFAULT_DISPLAY) + .setTaskDescriptionBuilder(taskDescriptionBuilder) + .setVisible(visible) + .build(); + taskInfo.realActivity = new ComponentName("com.android.wm.shell.windowdecor", + "DesktopModeWindowDecorationTests"); + taskInfo.baseActivity = new ComponentName("com.android.wm.shell.windowdecor", + "DesktopModeWindowDecorationTests"); + return taskInfo; + + } +} diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateToScene.kt b/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateToScene.kt index 753672820e28..88944f10eab9 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateToScene.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/AnimateToScene.kt @@ -107,6 +107,9 @@ private fun CoroutineScope.animate( reversed: Boolean = false, ) { val fromScene = layoutImpl.state.transitionState.currentScene + val isUserInput = + (layoutImpl.state.transitionState as? TransitionState.Transition)?.isUserInputDriven + ?: false val animationSpec = layoutImpl.transitions.transitionSpec(fromScene, target).spec val visibilityThreshold = @@ -116,9 +119,9 @@ private fun CoroutineScope.animate( val targetProgress = if (reversed) 0f else 1f val transition = if (reversed) { - OneOffTransition(target, fromScene, currentScene = target, animatable) + OneOffTransition(target, fromScene, currentScene = target, isUserInput, animatable) } else { - OneOffTransition(fromScene, target, currentScene = target, animatable) + OneOffTransition(fromScene, target, currentScene = target, isUserInput, animatable) } // Change the current layout state to use this new transition. @@ -139,6 +142,7 @@ private class OneOffTransition( override val fromScene: SceneKey, override val toScene: SceneKey, override val currentScene: SceneKey, + override val isUserInputDriven: Boolean, private val animatable: Animatable<Float, AnimationVector1D>, ) : TransitionState.Transition { override val progress: Float diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ObservableTransitionState.kt b/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ObservableTransitionState.kt index a625250d1e51..ccdec6ea8c5e 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ObservableTransitionState.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/ObservableTransitionState.kt @@ -42,6 +42,17 @@ sealed class ObservableTransitionState { val fromScene: SceneKey, val toScene: SceneKey, val progress: Flow<Float>, + + /** + * Whether the transition was originally triggered by user input rather than being + * programmatic. If this value is initially true, it will remain true until the transition + * fully completes, even if the user input that triggered the transition has ended. Any + * sub-transitions launched by this one will inherit this value. For example, if the user + * drags a pointer but does not exceed the threshold required to transition to another + * scene, this value will remain true after the pointer is no longer touching the screen and + * will be true in any transition created to animate back to the original position. + */ + val isUserInputDriven: Boolean, ) : ObservableTransitionState() } @@ -62,6 +73,7 @@ fun SceneTransitionLayoutState.observableTransitionState(): Flow<ObservableTrans fromScene = state.fromScene, toScene = state.toScene, progress = snapshotFlow { state.progress }, + isUserInputDriven = state.isUserInputDriven, ) } } diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt b/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt index 47e3d5add27b..7a21211c3dde 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt @@ -68,5 +68,8 @@ sealed interface TransitionState { * when flinging quickly during a swipe gesture. */ val progress: Float + + /** Whether the transition was triggered by user input rather than being programmatic. */ + val isUserInputDriven: Boolean } } diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SwipeToScene.kt b/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SwipeToScene.kt index 2069ebd32b81..790ea0832dbb 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SwipeToScene.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/animation/scene/SwipeToScene.kt @@ -137,6 +137,8 @@ private class SwipeTransition(initialScene: Scene) : TransitionState.Transition return offset / distance } + override val isUserInputDriven = true + /** The current offset caused by the drag gesture. */ var dragOffset by mutableFloatStateOf(0f) diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt index cb2607a2845e..2232370f3dc0 100644 --- a/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt +++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt @@ -122,6 +122,7 @@ class SwipeToSceneTest { assertThat(transition.toScene).isEqualTo(TestScenes.SceneB) assertThat(transition.currentScene).isEqualTo(TestScenes.SceneA) assertThat(transition.progress).isEqualTo(55.dp / LayoutWidth) + assertThat(transition.isUserInputDriven).isTrue() // Release the finger. We should now be animating back to A (currentScene = SceneA) given // that 55dp < positional threshold. @@ -133,6 +134,7 @@ class SwipeToSceneTest { assertThat(transition.toScene).isEqualTo(TestScenes.SceneB) assertThat(transition.currentScene).isEqualTo(TestScenes.SceneA) assertThat(transition.progress).isEqualTo(55.dp / LayoutWidth) + assertThat(transition.isUserInputDriven).isTrue() // Wait for the animation to finish. We should now be in scene A. rule.waitForIdle() @@ -154,6 +156,7 @@ class SwipeToSceneTest { assertThat(transition.toScene).isEqualTo(TestScenes.SceneC) assertThat(transition.currentScene).isEqualTo(TestScenes.SceneA) assertThat(transition.progress).isEqualTo(56.dp / LayoutHeight) + assertThat(transition.isUserInputDriven).isTrue() // Release the finger. We should now be animating to C (currentScene = SceneC) given // that 56dp >= positional threshold. @@ -165,6 +168,7 @@ class SwipeToSceneTest { assertThat(transition.toScene).isEqualTo(TestScenes.SceneC) assertThat(transition.currentScene).isEqualTo(TestScenes.SceneC) assertThat(transition.progress).isEqualTo(56.dp / LayoutHeight) + assertThat(transition.isUserInputDriven).isTrue() // Wait for the animation to finish. We should now be in scene C. rule.waitForIdle() diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt index 47af842c1511..ef012660ad71 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt @@ -158,6 +158,7 @@ private fun SceneTransitionObservableTransitionState.toModel(): ObservableTransi fromScene = fromScene.toModel().key, toScene = toScene.toModel().key, progress = progress, + isUserInputDriven = isUserInputDriven, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java index 7b58b1fe3014..9e5fd5572dbc 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java @@ -31,6 +31,7 @@ import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerImpl; import com.android.systemui.doze.DozeHost; import com.android.systemui.media.dagger.MediaModule; +import com.android.systemui.navigationbar.NavigationBarControllerModule; import com.android.systemui.navigationbar.gestural.GestureModule; import com.android.systemui.plugins.qs.QSFactory; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -101,6 +102,7 @@ import javax.inject.Named; GestureModule.class, MediaModule.class, MultiUserUtilsModule.class, + NavigationBarControllerModule.class, PowerModule.class, QSModule.class, ReferenceScreenshotModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 3a942bd8203f..1e002b847fb0 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -89,6 +89,7 @@ import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.connectivity.ConnectivityModule; +import com.android.systemui.statusbar.dagger.StatusBarModule; import com.android.systemui.statusbar.disableflags.dagger.DisableFlagsModule; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.notification.NotifPipelineFlags; @@ -198,6 +199,7 @@ import javax.inject.Named; SettingsUtilModule.class, SmartRepliesInflationModule.class, SmartspaceModule.class, + StatusBarModule.class, StatusBarPipelineModule.class, StatusBarPolicyModule.class, StatusBarWindowModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 4d713a2b4341..d5f9288a0b8c 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -412,16 +412,6 @@ object Flags { val NEW_SHADE_CARRIER_GROUP_MOBILE_ICONS = releasedFlag("new_shade_carrier_group_mobile_icons") - // 700 - dialer/calls - // TODO(b/254512734): Tracking Bug - val ONGOING_CALL_STATUS_BAR_CHIP = releasedFlag("ongoing_call_status_bar_chip") - - // TODO(b/254512681): Tracking Bug - val ONGOING_CALL_IN_IMMERSIVE = releasedFlag("ongoing_call_in_immersive") - - // TODO(b/254512753): Tracking Bug - val ONGOING_CALL_IN_IMMERSIVE_CHIP_TAP = releasedFlag("ongoing_call_in_immersive_chip_tap") - // 800 - general visual/theme @JvmField val MONET = resourceBooleanFlag(R.bool.flag_monet, "monet") diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt index 257006e13201..22bcf0aa2799 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt @@ -18,10 +18,8 @@ package com.android.systemui.keyguard import android.content.Context -import android.content.res.Configuration import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import com.android.keyguard.KeyguardStatusView import com.android.keyguard.KeyguardStatusViewController import com.android.keyguard.LockIconView @@ -29,38 +27,21 @@ import com.android.keyguard.LockIconViewController import com.android.keyguard.dagger.KeyguardStatusViewComponent import com.android.systemui.CoreStartable import com.android.systemui.R -import com.android.systemui.communal.ui.adapter.CommunalWidgetViewAdapter -import com.android.systemui.communal.ui.binder.CommunalWidgetViewBinder -import com.android.systemui.communal.ui.viewmodel.CommunalWidgetViewModel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags -import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor -import com.android.systemui.keyguard.ui.binder.KeyguardAmbientIndicationAreaViewBinder import com.android.systemui.keyguard.ui.binder.KeyguardBlueprintViewBinder import com.android.systemui.keyguard.ui.binder.KeyguardIndicationAreaBinder -import com.android.systemui.keyguard.ui.binder.KeyguardQuickAffordanceViewBinder import com.android.systemui.keyguard.ui.binder.KeyguardRootViewBinder -import com.android.systemui.keyguard.ui.binder.KeyguardSettingsViewBinder import com.android.systemui.keyguard.ui.view.KeyguardIndicationArea import com.android.systemui.keyguard.ui.view.KeyguardRootView import com.android.systemui.keyguard.ui.view.layout.KeyguardBlueprintCommandListener -import com.android.systemui.keyguard.ui.viewmodel.KeyguardAmbientIndicationViewModel import com.android.systemui.keyguard.ui.viewmodel.KeyguardBlueprintViewModel import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel -import com.android.systemui.keyguard.ui.viewmodel.KeyguardQuickAffordancesCombinedViewModel import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel -import com.android.systemui.keyguard.ui.viewmodel.KeyguardSettingsMenuViewModel import com.android.systemui.keyguard.ui.viewmodel.OccludingAppDeviceEntryMessageViewModel -import com.android.systemui.plugins.ActivityStarter -import com.android.systemui.plugins.FalsingManager import com.android.systemui.shade.NotificationShadeWindowView import com.android.systemui.statusbar.KeyguardIndicationController -import com.android.systemui.statusbar.VibratorHelper -import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController -import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer -import com.android.systemui.statusbar.notification.stack.ui.viewbinder.SharedNotificationContainerBinder -import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator import javax.inject.Inject @@ -74,30 +55,17 @@ class KeyguardViewConfigurator @Inject constructor( private val keyguardRootView: KeyguardRootView, - private val sharedNotificationContainer: SharedNotificationContainer, private val keyguardRootViewModel: KeyguardRootViewModel, private val keyguardIndicationAreaViewModel: KeyguardIndicationAreaViewModel, - private val sharedNotificationContainerViewModel: SharedNotificationContainerViewModel, - private val keyguardAmbientIndicationViewModel: KeyguardAmbientIndicationViewModel, private val notificationShadeWindowView: NotificationShadeWindowView, private val featureFlags: FeatureFlags, private val indicationController: KeyguardIndicationController, - private val keyguardQuickAffordancesCombinedViewModel: - KeyguardQuickAffordancesCombinedViewModel, - private val falsingManager: FalsingManager, - private val vibratorHelper: VibratorHelper, private val keyguardStateController: KeyguardStateController, - private val keyguardSettingsMenuViewModel: KeyguardSettingsMenuViewModel, - private val activityStarter: ActivityStarter, private val occludingAppDeviceEntryMessageViewModel: OccludingAppDeviceEntryMessageViewModel, private val chipbarCoordinator: ChipbarCoordinator, private val keyguardBlueprintCommandListener: KeyguardBlueprintCommandListener, private val keyguardBlueprintViewModel: KeyguardBlueprintViewModel, private val keyguardStatusViewComponentFactory: KeyguardStatusViewComponent.Factory, - private val keyguardBlueprintInteractor: KeyguardBlueprintInteractor, - private val communalWidgetViewModel: CommunalWidgetViewModel, - private val communalWidgetViewAdapter: CommunalWidgetViewAdapter, - private val notificationStackScrollerLayoutController: NotificationStackScrollLayoutController, private val context: Context, private val keyguardIndicationController: KeyguardIndicationController, private val lockIconViewController: LockIconViewController, @@ -105,10 +73,7 @@ constructor( private var rootViewHandle: DisposableHandle? = null private var indicationAreaHandle: DisposableHandle? = null - private var leftShortcutHandle: KeyguardQuickAffordanceViewBinder.Binding? = null - private var rightShortcutHandle: KeyguardQuickAffordanceViewBinder.Binding? = null - private var ambientIndicationAreaHandle: KeyguardAmbientIndicationAreaViewBinder.Binding? = null - private var settingsPopupMenuHandle: DisposableHandle? = null + var keyguardStatusViewController: KeyguardStatusViewController? = null get() { if (field == null) { @@ -127,52 +92,12 @@ constructor( override fun start() { bindKeyguardRootView() - if (featureFlags.isEnabled(Flags.LAZY_INFLATE_KEYGUARD)) { - keyguardRootView.removeAllViews() - initializeViews() - } else { - val notificationPanel = - notificationShadeWindowView.requireViewById(R.id.notification_panel) as ViewGroup - unbindKeyguardBottomArea(notificationPanel) - bindIndicationArea() - bindLockIconView(notificationPanel) - bindKeyguardStatusView(notificationPanel) - setupNotificationStackScrollLayout(notificationPanel) - bindLeftShortcut() - bindRightShortcut() - bindAmbientIndicationArea() - bindSettingsPopupMenu() - bindCommunalWidgetArea() - } + initializeViews() KeyguardBlueprintViewBinder.bind(keyguardRootView, keyguardBlueprintViewModel) keyguardBlueprintCommandListener.start() } - fun setupNotificationStackScrollLayout(legacyParent: ViewGroup) { - if (featureFlags.isEnabled(Flags.MIGRATE_NSSL)) { - // This moves the existing NSSL view to a different parent, as the controller is a - // singleton and recreating it has other bad side effects - val nssl = - legacyParent.requireViewById<View>(R.id.notification_stack_scroller).also { - (it.getParent() as ViewGroup).removeView(it) - } - sharedNotificationContainer.addNotificationStackScrollLayout(nssl) - SharedNotificationContainerBinder.bind( - sharedNotificationContainer, - sharedNotificationContainerViewModel, - notificationStackScrollerLayoutController, - ) - } - } - - override fun onConfigurationChanged(newConfig: Configuration?) { - super.onConfigurationChanged(newConfig) - leftShortcutHandle?.onConfigurationChanged() - rightShortcutHandle?.onConfigurationChanged() - ambientIndicationAreaHandle?.onConfigurationChanged() - } - fun bindIndicationArea() { indicationAreaHandle?.dispose() @@ -213,135 +138,6 @@ constructor( ) } - private fun bindLockIconView(legacyParent: ViewGroup) { - if (featureFlags.isEnabled(Flags.MIGRATE_LOCK_ICON)) { - legacyParent.requireViewById<View>(R.id.lock_icon_view).let { - legacyParent.removeView(it) - } - } else { - keyguardRootView.findViewById<View?>(R.id.lock_icon_view)?.let { - keyguardRootView.removeView(it) - } - legacyParent.requireViewById<LockIconView>(R.id.lock_icon_view).let { - lockIconViewController.setLockIconView(it) - } - } - } - - private fun bindAmbientIndicationArea() { - if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) { - ambientIndicationAreaHandle?.destroy() - ambientIndicationAreaHandle = - KeyguardAmbientIndicationAreaViewBinder.bind( - notificationShadeWindowView, - keyguardAmbientIndicationViewModel, - keyguardRootViewModel, - ) - } else { - keyguardRootView.findViewById<View?>(R.id.ambient_indication_container)?.let { - keyguardRootView.removeView(it) - } - } - } - - private fun bindSettingsPopupMenu() { - if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) { - settingsPopupMenuHandle?.dispose() - settingsPopupMenuHandle = - KeyguardSettingsViewBinder.bind( - keyguardRootView, - keyguardSettingsMenuViewModel, - vibratorHelper, - activityStarter, - ) - } else { - keyguardRootView.findViewById<View?>(R.id.keyguard_settings_button)?.let { - keyguardRootView.removeView(it) - } - } - } - - private fun unbindKeyguardBottomArea(legacyParent: ViewGroup) { - if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) { - legacyParent.requireViewById<View>(R.id.keyguard_bottom_area).let { - legacyParent.removeView(it) - } - } - } - - private fun bindLeftShortcut() { - leftShortcutHandle?.destroy() - if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) { - leftShortcutHandle = - KeyguardQuickAffordanceViewBinder.bind( - keyguardRootView.requireViewById(R.id.start_button), - keyguardQuickAffordancesCombinedViewModel.startButton, - keyguardRootViewModel.alpha, - falsingManager, - vibratorHelper, - ) { - indicationController.showTransientIndication(it) - } - } else { - keyguardRootView.findViewById<View?>(R.id.start_button)?.let { - keyguardRootView.removeView(it) - } - } - } - - private fun bindRightShortcut() { - rightShortcutHandle?.destroy() - if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) { - rightShortcutHandle = - KeyguardQuickAffordanceViewBinder.bind( - keyguardRootView.requireViewById(R.id.end_button), - keyguardQuickAffordancesCombinedViewModel.endButton, - keyguardRootViewModel.alpha, - falsingManager, - vibratorHelper, - ) { - indicationController.showTransientIndication(it) - } - } else { - keyguardRootView.findViewById<View?>(R.id.end_button)?.let { - keyguardRootView.removeView(it) - } - } - } - - fun bindKeyguardStatusView(legacyParent: ViewGroup) { - // At startup, 2 views with the ID `R.id.keyguard_status_view` will be available. - // Disable one of them - if (featureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) { - legacyParent.findViewById<View>(R.id.keyguard_status_view)?.let { - legacyParent.removeView(it) - } - - val keyguardStatusView = keyguardRootView.addStatusView() - val statusViewComponent = keyguardStatusViewComponentFactory.build(keyguardStatusView) - val controller = statusViewComponent.getKeyguardStatusViewController() - controller.init() - keyguardStatusViewController = controller - } else { - keyguardRootView.findViewById<View?>(R.id.keyguard_status_view)?.let { - keyguardRootView.removeView(it) - } - } - } - - private fun bindCommunalWidgetArea() { - if (!featureFlags.isEnabled(Flags.WIDGET_ON_KEYGUARD)) { - return - } - - CommunalWidgetViewBinder.bind( - keyguardRootView, - communalWidgetViewModel, - communalWidgetViewAdapter, - keyguardBlueprintInteractor, - ) - } - /** * Temporary, to allow NotificationPanelViewController to use the same instance while code is * migrated: b/288242803 diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/KeyguardRootView.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/KeyguardRootView.kt index a94874176a34..f2b28d964314 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/KeyguardRootView.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/KeyguardRootView.kt @@ -19,123 +19,14 @@ package com.android.systemui.keyguard.ui.view import android.content.Context import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.res.ResourcesCompat -import com.android.keyguard.KeyguardStatusView -import com.android.keyguard.LockIconView -import com.android.systemui.R -import com.android.systemui.animation.view.LaunchableImageView /** Provides a container for all keyguard ui content. */ class KeyguardRootView( context: Context, - private val attrs: AttributeSet?, + attrs: AttributeSet?, ) : ConstraintLayout( context, attrs, - ) { - - private var statusView: KeyguardStatusView? = null - - init { - addIndicationTextArea() - addLockIconView() - addAmbientIndicationArea() - addLeftShortcut() - addRightShortcut() - addSettingsPopupMenu() - addStatusView() - } - - private fun addIndicationTextArea() { - val view = KeyguardIndicationArea(context, attrs) - addView(view) - } - - private fun addLockIconView() { - val view = LockIconView(context, attrs).apply { id = R.id.lock_icon_view } - addView(view) - } - - private fun addAmbientIndicationArea() { - LayoutInflater.from(context).inflate(R.layout.ambient_indication, this) - } - - private fun addLeftShortcut() { - val padding = resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_padding) - val view = - LaunchableImageView(context, attrs).apply { - id = R.id.start_button - scaleType = ImageView.ScaleType.FIT_CENTER - background = - ResourcesCompat.getDrawable( - context.resources, - R.drawable.keyguard_bottom_affordance_bg, - context.theme - ) - foreground = - ResourcesCompat.getDrawable( - context.resources, - R.drawable.keyguard_bottom_affordance_selected_border, - context.theme - ) - visibility = View.INVISIBLE - setPadding(padding, padding, padding, padding) - } - addView(view) - } - - private fun addRightShortcut() { - val padding = resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_padding) - val view = - LaunchableImageView(context, attrs).apply { - id = R.id.end_button - scaleType = ImageView.ScaleType.FIT_CENTER - background = - ResourcesCompat.getDrawable( - context.resources, - R.drawable.keyguard_bottom_affordance_bg, - context.theme - ) - foreground = - ResourcesCompat.getDrawable( - context.resources, - R.drawable.keyguard_bottom_affordance_selected_border, - context.theme - ) - visibility = View.INVISIBLE - setPadding(padding, padding, padding, padding) - } - addView(view) - } - - private fun addSettingsPopupMenu() { - val view = - LayoutInflater.from(context) - .inflate(R.layout.keyguard_settings_popup_menu, this, false) - .apply { - id = R.id.keyguard_settings_button - visibility = GONE - } - addView(view) - } - - fun addStatusView(): KeyguardStatusView { - // StatusView may need to be rebuilt on config changes. Remove and reinflate - statusView?.let { removeView(it) } - val view = - (LayoutInflater.from(context).inflate(R.layout.keyguard_status_view, this, false) - as KeyguardStatusView) - .apply { - setClipChildren(false) - statusView = this - } - - addView(view) - return view - } -} + ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt index 43bbf69db883..1eeb0172f419 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt @@ -17,10 +17,7 @@ package com.android.systemui.keyguard.ui.view.layout.blueprints -import androidx.constraintlayout.widget.ConstraintLayout import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.keyguard.shared.model.KeyguardBlueprint import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultAmbientIndicationAreaSection @@ -54,7 +51,6 @@ constructor( defaultNotificationStackScrollLayoutSection: DefaultNotificationStackScrollLayoutSection, splitShadeGuidelines: SplitShadeGuidelines, aodNotificationIconsSection: AodNotificationIconsSection, - private val featureFlags: FeatureFlags, ) : KeyguardBlueprint { override val id: String = DEFAULT @@ -72,16 +68,6 @@ constructor( aodNotificationIconsSection, ) - override fun replaceViews( - previousBlueprint: KeyguardBlueprint?, - constraintLayout: ConstraintLayout, - bindData: Boolean - ) { - if (featureFlags.isEnabled(Flags.LAZY_INFLATE_KEYGUARD)) { - super.replaceViews(previousBlueprint, constraintLayout, bindData) - } - } - companion object { const val DEFAULT = "default" } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index 5a42028ae83e..a601d7f25b6e 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 The Android Open Source Project + * Copyright (C) 2023 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. @@ -16,483 +16,58 @@ package com.android.systemui.navigationbar; -import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; -import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; -import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; -import static com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler.DEBUG_MISSING_GESTURE_TAG; -import static com.android.systemui.shared.recents.utilities.Utilities.isLargeScreen; - -import android.content.Context; -import android.content.pm.ActivityInfo; -import android.content.res.Configuration; -import android.hardware.display.DisplayManager; -import android.os.Bundle; -import android.os.Handler; -import android.os.RemoteException; -import android.os.Trace; -import android.os.UserHandle; -import android.provider.Settings; -import android.util.Log; -import android.util.SparseArray; -import android.view.Display; -import android.view.IWindowManager; -import android.view.View; -import android.view.WindowManagerGlobal; - -import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.RegisterStatusBarResult; -import com.android.settingslib.applications.InterestingConfigChanges; -import com.android.systemui.Dumpable; -import com.android.systemui.dagger.SysUISingleton; -import com.android.systemui.dagger.qualifiers.Main; -import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; -import com.android.systemui.model.SysUiState; -import com.android.systemui.recents.OverviewProxyService; -import com.android.systemui.settings.DisplayTracker; -import com.android.systemui.shared.system.QuickStepContract; -import com.android.systemui.shared.system.TaskStackChangeListeners; -import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.phone.AutoHideController; -import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; -import com.android.systemui.statusbar.phone.LightBarController; -import com.android.systemui.statusbar.policy.ConfigurationController; -import com.android.systemui.util.settings.SecureSettings; -import com.android.wm.shell.back.BackAnimation; -import com.android.wm.shell.pip.Pip; - -import java.io.PrintWriter; -import java.util.Optional; - -import javax.inject.Inject; +import com.android.systemui.statusbar.phone.BarTransitions; /** A controller to handle navigation bars. */ -@SysUISingleton -public class NavigationBarController implements - ConfigurationController.ConfigurationListener, - NavigationModeController.ModeChangedListener, - Dumpable { - - private static final String TAG = NavigationBarController.class.getSimpleName(); - - private final Context mContext; - private final Handler mHandler; - private final NavigationBarComponent.Factory mNavigationBarComponentFactory; - private FeatureFlags mFeatureFlags; - private final SecureSettings mSecureSettings; - private final DisplayTracker mDisplayTracker; - private final DisplayManager mDisplayManager; - private final TaskbarDelegate mTaskbarDelegate; - private final NavBarHelper mNavBarHelper; - private int mNavMode; - @VisibleForTesting boolean mIsLargeScreen; - - /** A displayId - nav bar maps. */ - @VisibleForTesting - SparseArray<NavigationBar> mNavigationBars = new SparseArray<>(); - - // Tracks config changes that will actually recreate the nav bar - private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges( - ActivityInfo.CONFIG_FONT_SCALE - | ActivityInfo.CONFIG_UI_MODE); - - @Inject - public NavigationBarController(Context context, - OverviewProxyService overviewProxyService, - NavigationModeController navigationModeController, - SysUiState sysUiFlagsContainer, - CommandQueue commandQueue, - @Main Handler mainHandler, - ConfigurationController configurationController, - NavBarHelper navBarHelper, - TaskbarDelegate taskbarDelegate, - NavigationBarComponent.Factory navigationBarComponentFactory, - DumpManager dumpManager, - AutoHideController autoHideController, - LightBarController lightBarController, - TaskStackChangeListeners taskStackChangeListeners, - Optional<Pip> pipOptional, - Optional<BackAnimation> backAnimation, - FeatureFlags featureFlags, - SecureSettings secureSettings, - DisplayTracker displayTracker) { - mContext = context; - mHandler = mainHandler; - mNavigationBarComponentFactory = navigationBarComponentFactory; - mFeatureFlags = featureFlags; - mSecureSettings = secureSettings; - mDisplayTracker = displayTracker; - mDisplayManager = mContext.getSystemService(DisplayManager.class); - commandQueue.addCallback(mCommandQueueCallbacks); - configurationController.addCallback(this); - mConfigChanges.applyNewConfig(mContext.getResources()); - mNavMode = navigationModeController.addListener(this); - mNavBarHelper = navBarHelper; - mTaskbarDelegate = taskbarDelegate; - mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService, - navBarHelper, navigationModeController, sysUiFlagsContainer, - dumpManager, autoHideController, lightBarController, pipOptional, - backAnimation.orElse(null), taskStackChangeListeners); - mIsLargeScreen = isLargeScreen(mContext); - dumpManager.registerDumpable(this); - } - - @Override - public void onConfigChanged(Configuration newConfig) { - boolean isOldConfigLargeScreen = mIsLargeScreen; - mIsLargeScreen = isLargeScreen(mContext); - boolean willApplyConfig = mConfigChanges.applyNewConfig(mContext.getResources()); - boolean largeScreenChanged = mIsLargeScreen != isOldConfigLargeScreen; - // TODO(b/243765256): Disable this logging once b/243765256 is fixed. - Log.i(DEBUG_MISSING_GESTURE_TAG, "NavbarController: newConfig=" + newConfig - + " mTaskbarDelegate initialized=" + mTaskbarDelegate.isInitialized() - + " willApplyConfigToNavbars=" + willApplyConfig - + " navBarCount=" + mNavigationBars.size()); - if (mTaskbarDelegate.isInitialized()) { - mTaskbarDelegate.onConfigurationChanged(newConfig); - } - // If we folded/unfolded while in 3 button, show navbar in folded state, hide in unfolded - if (largeScreenChanged && updateNavbarForTaskbar()) { - return; - } - - if (willApplyConfig) { - for (int i = 0; i < mNavigationBars.size(); i++) { - recreateNavigationBar(mNavigationBars.keyAt(i)); - } - } else { - for (int i = 0; i < mNavigationBars.size(); i++) { - mNavigationBars.valueAt(i).onConfigurationChanged(newConfig); - } - } - } - - @Override - public void onNavigationModeChanged(int mode) { - if (mNavMode == mode) { - return; - } - final int oldMode = mNavMode; - mNavMode = mode; - updateAccessibilityButtonModeIfNeeded(); - - mHandler.post(() -> { - // create/destroy nav bar based on nav mode only in unfolded state - if (oldMode != mNavMode) { - updateNavbarForTaskbar(); - } - for (int i = 0; i < mNavigationBars.size(); i++) { - NavigationBar navBar = mNavigationBars.valueAt(i); - if (navBar == null) { - continue; - } - navBar.getView().updateStates(); - } - }); - } - - private void updateAccessibilityButtonModeIfNeeded() { - final int mode = mSecureSettings.getIntForUser( - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, - ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); - - // ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU is compatible under gestural or non-gestural - // mode, so we don't need to update it. - if (mode == ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU) { - return; - } - - // ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR is incompatible under gestural mode. Need to - // force update to ACCESSIBILITY_BUTTON_MODE_GESTURE. - if (QuickStepContract.isGesturalMode(mNavMode) - && mode == ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR) { - mSecureSettings.putIntForUser( - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_GESTURE, - UserHandle.USER_CURRENT); - // ACCESSIBILITY_BUTTON_MODE_GESTURE is incompatible under non gestural mode. Need to - // force update to ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR. - } else if (!QuickStepContract.isGesturalMode(mNavMode) - && mode == ACCESSIBILITY_BUTTON_MODE_GESTURE) { - mSecureSettings.putIntForUser( - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, - ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); - } - } - - private boolean shouldCreateNavBarAndTaskBar(int displayId) { - final IWindowManager wms = WindowManagerGlobal.getWindowManagerService(); - - try { - return wms.hasNavigationBar(displayId); - } catch (RemoteException e) { - // Cannot get wms, just return false with warning message. - Log.w(TAG, "Cannot get WindowManager."); - return false; - } - } - - /** @see #initializeTaskbarIfNecessary() */ - private boolean updateNavbarForTaskbar() { - boolean taskbarShown = initializeTaskbarIfNecessary(); - if (!taskbarShown && mNavigationBars.get(mContext.getDisplayId()) == null) { - createNavigationBar(mContext.getDisplay(), null, null); - } - return taskbarShown; - } - - /** @return {@code true} if taskbar is enabled, false otherwise */ - private boolean initializeTaskbarIfNecessary() { - // Enable for large screens or (phone AND flag is set); assuming phone = !mIsLargeScreen - boolean taskbarEnabled = (mIsLargeScreen || mFeatureFlags.isEnabled( - Flags.HIDE_NAVBAR_WINDOW)) && shouldCreateNavBarAndTaskBar(mContext.getDisplayId()); - - if (taskbarEnabled) { - Trace.beginSection("NavigationBarController#initializeTaskbarIfNecessary"); - final int displayId = mContext.getDisplayId(); - // Hint to NavBarHelper if we are replacing an existing bar to skip extra work - mNavBarHelper.setTogglingNavbarTaskbar(mNavigationBars.contains(displayId)); - // Remove navigation bar when taskbar is showing - removeNavigationBar(displayId); - mTaskbarDelegate.init(displayId); - mNavBarHelper.setTogglingNavbarTaskbar(false); - Trace.endSection(); - - } else { - mTaskbarDelegate.destroy(); - } - return taskbarEnabled; - } - - private final CommandQueue.Callbacks mCommandQueueCallbacks = new CommandQueue.Callbacks() { - @Override - public void onDisplayRemoved(int displayId) { - removeNavigationBar(displayId); - } - - @Override - public void onDisplayReady(int displayId) { - Display display = mDisplayManager.getDisplay(displayId); - mIsLargeScreen = isLargeScreen(mContext); - createNavigationBar(display, null /* savedState */, null /* result */); - } - - @Override - public void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) { - final NavigationBar navigationBar = getNavigationBar(displayId); - if (navigationBar != null) { - navigationBar.setNavigationBarLumaSamplingEnabled(enable); - } - } - - @Override - public void showPinningEnterExitToast(boolean entering) { - int displayId = mContext.getDisplayId(); - final NavigationBarView navBarView = getNavigationBarView(displayId); - if (navBarView != null) { - navBarView.showPinningEnterExitToast(entering); - } else if (displayId == mDisplayTracker.getDefaultDisplayId() - && mTaskbarDelegate.isInitialized()) { - mTaskbarDelegate.showPinningEnterExitToast(entering); - } - } - - @Override - public void showPinningEscapeToast() { - int displayId = mContext.getDisplayId(); - final NavigationBarView navBarView = getNavigationBarView(displayId); - if (navBarView != null) { - navBarView.showPinningEscapeToast(); - } else if (displayId == mDisplayTracker.getDefaultDisplayId() - && mTaskbarDelegate.isInitialized()) { - mTaskbarDelegate.showPinningEscapeToast(); - } - } - }; - - /** - * Recreates the navigation bar for the given display. - */ - private void recreateNavigationBar(int displayId) { - // TODO: Improve this flow so that we don't need to create a new nav bar but just - // the view - Bundle savedState = new Bundle(); - NavigationBar bar = mNavigationBars.get(displayId); - if (bar != null) { - bar.onSaveInstanceState(savedState); - } - removeNavigationBar(displayId); - createNavigationBar(mDisplayManager.getDisplay(displayId), savedState, null /* result */); - } - - // TODO(b/117478341): I use {@code includeDefaultDisplay} to make this method compatible to - // CarStatusBar because they have their own nav bar. Think about a better way for it. +public interface NavigationBarController { /** * Creates navigation bars when car/status bar initializes. + * <p> + * TODO(b/117478341): I use {@code includeDefaultDisplay} to make this method compatible to + * CarStatusBar because they have their own nav bar. Think about a better way for it. * * @param includeDefaultDisplay {@code true} to create navigation bar on default display. */ - public void createNavigationBars(final boolean includeDefaultDisplay, - RegisterStatusBarResult result) { - updateAccessibilityButtonModeIfNeeded(); - - // Don't need to create nav bar on the default display if we initialize TaskBar. - final boolean shouldCreateDefaultNavbar = includeDefaultDisplay - && !initializeTaskbarIfNecessary(); - Display[] displays = mDisplayTracker.getAllDisplays(); - for (Display display : displays) { - if (shouldCreateDefaultNavbar - || display.getDisplayId() != mDisplayTracker.getDefaultDisplayId()) { - createNavigationBar(display, null /* savedState */, result); - } - } - } + void createNavigationBars( + boolean includeDefaultDisplay, + RegisterStatusBarResult result); - /** - * Adds a navigation bar on default display or an external display if the display supports - * system decorations. - * - * @param display the display to add navigation bar on. - */ - @VisibleForTesting - void createNavigationBar(Display display, Bundle savedState, RegisterStatusBarResult result) { - if (display == null) { - return; - } - - final int displayId = display.getDisplayId(); - final boolean isOnDefaultDisplay = displayId == mDisplayTracker.getDefaultDisplayId(); - - if (!shouldCreateNavBarAndTaskBar(displayId)) { - return; - } - - // We may show TaskBar on the default display for large screen device. Don't need to create - // navigation bar for this case. - if (isOnDefaultDisplay && initializeTaskbarIfNecessary()) { - return; - } - - final Context context = isOnDefaultDisplay - ? mContext - : mContext.createDisplayContext(display); - NavigationBarComponent component = mNavigationBarComponentFactory.create( - context, savedState); - NavigationBar navBar = component.getNavigationBar(); - navBar.init(); - mNavigationBars.put(displayId, navBar); - - navBar.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { - @Override - public void onViewAttachedToWindow(View v) { - if (result != null) { - navBar.setImeWindowStatus(display.getDisplayId(), result.mImeToken, - result.mImeWindowVis, result.mImeBackDisposition, - result.mShowImeSwitcher); - } - } - - @Override - public void onViewDetachedFromWindow(View v) { - v.removeOnAttachStateChangeListener(this); - } - }); - } - - void removeNavigationBar(int displayId) { - NavigationBar navBar = mNavigationBars.get(displayId); - if (navBar != null) { - navBar.destroyView(); - mNavigationBars.remove(displayId); - } - } + /** Removes the navigation bar for the given display ID. */ + void removeNavigationBar(int displayId); /** @see NavigationBar#checkNavBarModes() */ - public void checkNavBarModes(int displayId) { - NavigationBar navBar = mNavigationBars.get(displayId); - if (navBar != null) { - navBar.checkNavBarModes(); - } - } + void checkNavBarModes(int displayId); /** @see NavigationBar#finishBarAnimations() */ - public void finishBarAnimations(int displayId) { - NavigationBar navBar = mNavigationBars.get(displayId); - if (navBar != null) { - navBar.finishBarAnimations(); - } - } + void finishBarAnimations(int displayId); /** @see NavigationBar#touchAutoDim() */ - public void touchAutoDim(int displayId) { - NavigationBar navBar = mNavigationBars.get(displayId); - if (navBar != null) { - navBar.touchAutoDim(); - } - } + void touchAutoDim(int displayId); /** @see NavigationBar#transitionTo(int, boolean) */ - public void transitionTo(int displayId, @TransitionMode int barMode, boolean animate) { - NavigationBar navBar = mNavigationBars.get(displayId); - if (navBar != null) { - navBar.transitionTo(barMode, animate); - } - } + void transitionTo(int displayId, @BarTransitions.TransitionMode int barMode, boolean animate); /** @see NavigationBar#disableAnimationsDuringHide(long) */ - public void disableAnimationsDuringHide(int displayId, long delay) { - NavigationBar navBar = mNavigationBars.get(displayId); - if (navBar != null) { - navBar.disableAnimationsDuringHide(delay); - } - } + void disableAnimationsDuringHide(int displayId, long delay); /** @return {@link NavigationBarView} on the default display. */ - public @Nullable NavigationBarView getDefaultNavigationBarView() { - return getNavigationBarView(mDisplayTracker.getDefaultDisplayId()); - } + @Nullable + NavigationBarView getDefaultNavigationBarView(); /** * @param displayId the ID of display which Navigation bar is on * @return {@link NavigationBarView} on the display with {@code displayId}. * {@code null} if no navigation bar on that display. */ - public @Nullable NavigationBarView getNavigationBarView(int displayId) { - NavigationBar navBar = getNavigationBar(displayId); - return (navBar == null) ? null : navBar.getView(); - } - - private @Nullable NavigationBar getNavigationBar(int displayId) { - return mNavigationBars.get(displayId); - } + @Nullable + NavigationBarView getNavigationBarView(int displayId); - public boolean isOverviewEnabled(int displayId) { - final NavigationBarView navBarView = getNavigationBarView(displayId); - if (navBarView != null) { - return navBarView.isOverviewEnabled(); - } else { - return mTaskbarDelegate.isOverviewEnabled(); - } - } + boolean isOverviewEnabled(int displayId); /** @return {@link NavigationBar} on the default display. */ @Nullable - public NavigationBar getDefaultNavigationBar() { - return mNavigationBars.get(mDisplayTracker.getDefaultDisplayId()); - } - - @Override - public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { - pw.println("mIsLargeScreen=" + mIsLargeScreen); - pw.println("mNavMode=" + mNavMode); - for (int i = 0; i < mNavigationBars.size(); i++) { - if (i > 0) { - pw.println(); - } - mNavigationBars.valueAt(i).dump(pw); - } - } + NavigationBar getDefaultNavigationBar(); } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerEmptyImpl.kt new file mode 100644 index 000000000000..e73b078a3d88 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerEmptyImpl.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2023 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.navigationbar + +import com.android.internal.statusbar.RegisterStatusBarResult +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.statusbar.phone.BarTransitions +import javax.inject.Inject + +/** A no-op version of [NavigationBarController] for variants like Arc and TV. */ +@SysUISingleton +class NavigationBarControllerEmptyImpl @Inject constructor() : NavigationBarController { + override fun createNavigationBars( + includeDefaultDisplay: Boolean, + result: RegisterStatusBarResult?, + ) {} + override fun removeNavigationBar(displayId: Int) {} + override fun checkNavBarModes(displayId: Int) {} + override fun finishBarAnimations(displayId: Int) {} + override fun touchAutoDim(displayId: Int) {} + override fun transitionTo( + displayId: Int, + @BarTransitions.TransitionMode barMode: Int, + animate: Boolean, + ) {} + override fun disableAnimationsDuringHide(displayId: Int, delay: Long) {} + override fun getDefaultNavigationBarView(): NavigationBarView? = null + override fun getNavigationBarView(displayId: Int): NavigationBarView? = null + override fun isOverviewEnabled(displayId: Int) = false + override fun getDefaultNavigationBar(): NavigationBar? = null +} diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java new file mode 100644 index 000000000000..564e984fbce2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java @@ -0,0 +1,490 @@ +/* + * Copyright (C) 2020 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.navigationbar; + +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; +import static com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler.DEBUG_MISSING_GESTURE_TAG; +import static com.android.systemui.shared.recents.utilities.Utilities.isLargeScreen; + +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; +import android.hardware.display.DisplayManager; +import android.os.Bundle; +import android.os.Handler; +import android.os.RemoteException; +import android.os.Trace; +import android.os.UserHandle; +import android.provider.Settings; +import android.util.Log; +import android.util.SparseArray; +import android.view.Display; +import android.view.IWindowManager; +import android.view.View; +import android.view.WindowManagerGlobal; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.statusbar.RegisterStatusBarResult; +import com.android.settingslib.applications.InterestingConfigChanges; +import com.android.systemui.Dumpable; +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.dump.DumpManager; +import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; +import com.android.systemui.model.SysUiState; +import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.settings.DisplayTracker; +import com.android.systemui.shared.system.QuickStepContract; +import com.android.systemui.shared.system.TaskStackChangeListeners; +import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.phone.AutoHideController; +import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; +import com.android.systemui.statusbar.phone.LightBarController; +import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.util.settings.SecureSettings; +import com.android.wm.shell.back.BackAnimation; +import com.android.wm.shell.pip.Pip; + +import java.io.PrintWriter; +import java.util.Optional; + +import javax.inject.Inject; + +@SysUISingleton +public class NavigationBarControllerImpl implements + ConfigurationController.ConfigurationListener, + NavigationModeController.ModeChangedListener, + Dumpable, NavigationBarController { + + private static final String TAG = NavigationBarControllerImpl.class.getSimpleName(); + + private final Context mContext; + private final Handler mHandler; + private final NavigationBarComponent.Factory mNavigationBarComponentFactory; + private FeatureFlags mFeatureFlags; + private final SecureSettings mSecureSettings; + private final DisplayTracker mDisplayTracker; + private final DisplayManager mDisplayManager; + private final TaskbarDelegate mTaskbarDelegate; + private final NavBarHelper mNavBarHelper; + private int mNavMode; + @VisibleForTesting boolean mIsLargeScreen; + + /** A displayId - nav bar maps. */ + @VisibleForTesting + SparseArray<NavigationBar> mNavigationBars = new SparseArray<>(); + + // Tracks config changes that will actually recreate the nav bar + private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges( + ActivityInfo.CONFIG_FONT_SCALE + | ActivityInfo.CONFIG_UI_MODE); + + @Inject + public NavigationBarControllerImpl(Context context, + OverviewProxyService overviewProxyService, + NavigationModeController navigationModeController, + SysUiState sysUiFlagsContainer, + CommandQueue commandQueue, + @Main Handler mainHandler, + ConfigurationController configurationController, + NavBarHelper navBarHelper, + TaskbarDelegate taskbarDelegate, + NavigationBarComponent.Factory navigationBarComponentFactory, + DumpManager dumpManager, + AutoHideController autoHideController, + LightBarController lightBarController, + TaskStackChangeListeners taskStackChangeListeners, + Optional<Pip> pipOptional, + Optional<BackAnimation> backAnimation, + FeatureFlags featureFlags, + SecureSettings secureSettings, + DisplayTracker displayTracker) { + mContext = context; + mHandler = mainHandler; + mNavigationBarComponentFactory = navigationBarComponentFactory; + mFeatureFlags = featureFlags; + mSecureSettings = secureSettings; + mDisplayTracker = displayTracker; + mDisplayManager = mContext.getSystemService(DisplayManager.class); + commandQueue.addCallback(mCommandQueueCallbacks); + configurationController.addCallback(this); + mConfigChanges.applyNewConfig(mContext.getResources()); + mNavMode = navigationModeController.addListener(this); + mNavBarHelper = navBarHelper; + mTaskbarDelegate = taskbarDelegate; + mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService, + navBarHelper, navigationModeController, sysUiFlagsContainer, + dumpManager, autoHideController, lightBarController, pipOptional, + backAnimation.orElse(null), taskStackChangeListeners); + mIsLargeScreen = isLargeScreen(mContext); + dumpManager.registerDumpable(this); + } + + @Override + public void onConfigChanged(Configuration newConfig) { + boolean isOldConfigLargeScreen = mIsLargeScreen; + mIsLargeScreen = isLargeScreen(mContext); + boolean willApplyConfig = mConfigChanges.applyNewConfig(mContext.getResources()); + boolean largeScreenChanged = mIsLargeScreen != isOldConfigLargeScreen; + // TODO(b/243765256): Disable this logging once b/243765256 is fixed. + Log.i(DEBUG_MISSING_GESTURE_TAG, "NavbarController: newConfig=" + newConfig + + " mTaskbarDelegate initialized=" + mTaskbarDelegate.isInitialized() + + " willApplyConfigToNavbars=" + willApplyConfig + + " navBarCount=" + mNavigationBars.size()); + if (mTaskbarDelegate.isInitialized()) { + mTaskbarDelegate.onConfigurationChanged(newConfig); + } + // If we folded/unfolded while in 3 button, show navbar in folded state, hide in unfolded + if (largeScreenChanged && updateNavbarForTaskbar()) { + return; + } + + if (willApplyConfig) { + for (int i = 0; i < mNavigationBars.size(); i++) { + recreateNavigationBar(mNavigationBars.keyAt(i)); + } + } else { + for (int i = 0; i < mNavigationBars.size(); i++) { + mNavigationBars.valueAt(i).onConfigurationChanged(newConfig); + } + } + } + + @Override + public void onNavigationModeChanged(int mode) { + if (mNavMode == mode) { + return; + } + final int oldMode = mNavMode; + mNavMode = mode; + updateAccessibilityButtonModeIfNeeded(); + + mHandler.post(() -> { + // create/destroy nav bar based on nav mode only in unfolded state + if (oldMode != mNavMode) { + updateNavbarForTaskbar(); + } + for (int i = 0; i < mNavigationBars.size(); i++) { + NavigationBar navBar = mNavigationBars.valueAt(i); + if (navBar == null) { + continue; + } + navBar.getView().updateStates(); + } + }); + } + + private void updateAccessibilityButtonModeIfNeeded() { + final int mode = mSecureSettings.getIntForUser( + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, + ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); + + // ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU is compatible under gestural or non-gestural + // mode, so we don't need to update it. + if (mode == ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU) { + return; + } + + // ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR is incompatible under gestural mode. Need to + // force update to ACCESSIBILITY_BUTTON_MODE_GESTURE. + if (QuickStepContract.isGesturalMode(mNavMode) + && mode == ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR) { + mSecureSettings.putIntForUser( + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_GESTURE, + UserHandle.USER_CURRENT); + // ACCESSIBILITY_BUTTON_MODE_GESTURE is incompatible under non gestural mode. Need to + // force update to ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR. + } else if (!QuickStepContract.isGesturalMode(mNavMode) + && mode == ACCESSIBILITY_BUTTON_MODE_GESTURE) { + mSecureSettings.putIntForUser( + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, + ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); + } + } + + private boolean shouldCreateNavBarAndTaskBar(int displayId) { + final IWindowManager wms = WindowManagerGlobal.getWindowManagerService(); + + try { + return wms.hasNavigationBar(displayId); + } catch (RemoteException e) { + // Cannot get wms, just return false with warning message. + Log.w(TAG, "Cannot get WindowManager."); + return false; + } + } + + /** @see #initializeTaskbarIfNecessary() */ + private boolean updateNavbarForTaskbar() { + boolean taskbarShown = initializeTaskbarIfNecessary(); + if (!taskbarShown && mNavigationBars.get(mContext.getDisplayId()) == null) { + createNavigationBar(mContext.getDisplay(), null, null); + } + return taskbarShown; + } + + /** @return {@code true} if taskbar is enabled, false otherwise */ + private boolean initializeTaskbarIfNecessary() { + // Enable for large screens or (phone AND flag is set); assuming phone = !mIsLargeScreen + boolean taskbarEnabled = (mIsLargeScreen || mFeatureFlags.isEnabled( + Flags.HIDE_NAVBAR_WINDOW)) && shouldCreateNavBarAndTaskBar(mContext.getDisplayId()); + + if (taskbarEnabled) { + Trace.beginSection("NavigationBarController#initializeTaskbarIfNecessary"); + final int displayId = mContext.getDisplayId(); + // Hint to NavBarHelper if we are replacing an existing bar to skip extra work + mNavBarHelper.setTogglingNavbarTaskbar(mNavigationBars.contains(displayId)); + // Remove navigation bar when taskbar is showing + removeNavigationBar(displayId); + mTaskbarDelegate.init(displayId); + mNavBarHelper.setTogglingNavbarTaskbar(false); + Trace.endSection(); + + } else { + mTaskbarDelegate.destroy(); + } + return taskbarEnabled; + } + + private final CommandQueue.Callbacks mCommandQueueCallbacks = new CommandQueue.Callbacks() { + @Override + public void onDisplayRemoved(int displayId) { + removeNavigationBar(displayId); + } + + @Override + public void onDisplayReady(int displayId) { + Display display = mDisplayManager.getDisplay(displayId); + mIsLargeScreen = isLargeScreen(mContext); + createNavigationBar(display, null /* savedState */, null /* result */); + } + + @Override + public void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) { + final NavigationBar navigationBar = getNavigationBar(displayId); + if (navigationBar != null) { + navigationBar.setNavigationBarLumaSamplingEnabled(enable); + } + } + + @Override + public void showPinningEnterExitToast(boolean entering) { + int displayId = mContext.getDisplayId(); + final NavigationBarView navBarView = getNavigationBarView(displayId); + if (navBarView != null) { + navBarView.showPinningEnterExitToast(entering); + } else if (displayId == mDisplayTracker.getDefaultDisplayId() + && mTaskbarDelegate.isInitialized()) { + mTaskbarDelegate.showPinningEnterExitToast(entering); + } + } + + @Override + public void showPinningEscapeToast() { + int displayId = mContext.getDisplayId(); + final NavigationBarView navBarView = getNavigationBarView(displayId); + if (navBarView != null) { + navBarView.showPinningEscapeToast(); + } else if (displayId == mDisplayTracker.getDefaultDisplayId() + && mTaskbarDelegate.isInitialized()) { + mTaskbarDelegate.showPinningEscapeToast(); + } + } + }; + + /** + * Recreates the navigation bar for the given display. + */ + private void recreateNavigationBar(int displayId) { + // TODO: Improve this flow so that we don't need to create a new nav bar but just + // the view + Bundle savedState = new Bundle(); + NavigationBar bar = mNavigationBars.get(displayId); + if (bar != null) { + bar.onSaveInstanceState(savedState); + } + removeNavigationBar(displayId); + createNavigationBar(mDisplayManager.getDisplay(displayId), savedState, null /* result */); + } + + @Override + public void createNavigationBars(final boolean includeDefaultDisplay, + RegisterStatusBarResult result) { + updateAccessibilityButtonModeIfNeeded(); + + // Don't need to create nav bar on the default display if we initialize TaskBar. + final boolean shouldCreateDefaultNavbar = includeDefaultDisplay + && !initializeTaskbarIfNecessary(); + Display[] displays = mDisplayTracker.getAllDisplays(); + for (Display display : displays) { + if (shouldCreateDefaultNavbar + || display.getDisplayId() != mDisplayTracker.getDefaultDisplayId()) { + createNavigationBar(display, null /* savedState */, result); + } + } + } + + /** + * Adds a navigation bar on default display or an external display if the display supports + * system decorations. + * + * @param display the display to add navigation bar on. + */ + @VisibleForTesting + void createNavigationBar(Display display, Bundle savedState, + RegisterStatusBarResult result) { + if (display == null) { + return; + } + + final int displayId = display.getDisplayId(); + final boolean isOnDefaultDisplay = displayId == mDisplayTracker.getDefaultDisplayId(); + + if (!shouldCreateNavBarAndTaskBar(displayId)) { + return; + } + + // We may show TaskBar on the default display for large screen device. Don't need to create + // navigation bar for this case. + if (isOnDefaultDisplay && initializeTaskbarIfNecessary()) { + return; + } + + final Context context = isOnDefaultDisplay + ? mContext + : mContext.createDisplayContext(display); + NavigationBarComponent component = mNavigationBarComponentFactory.create( + context, savedState); + NavigationBar navBar = component.getNavigationBar(); + navBar.init(); + mNavigationBars.put(displayId, navBar); + + navBar.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + if (result != null) { + navBar.setImeWindowStatus(display.getDisplayId(), result.mImeToken, + result.mImeWindowVis, result.mImeBackDisposition, + result.mShowImeSwitcher); + } + } + + @Override + public void onViewDetachedFromWindow(View v) { + v.removeOnAttachStateChangeListener(this); + } + }); + } + + @Override + public void removeNavigationBar(int displayId) { + NavigationBar navBar = mNavigationBars.get(displayId); + if (navBar != null) { + navBar.destroyView(); + mNavigationBars.remove(displayId); + } + } + + @Override + public void checkNavBarModes(int displayId) { + NavigationBar navBar = mNavigationBars.get(displayId); + if (navBar != null) { + navBar.checkNavBarModes(); + } + } + + @Override + public void finishBarAnimations(int displayId) { + NavigationBar navBar = mNavigationBars.get(displayId); + if (navBar != null) { + navBar.finishBarAnimations(); + } + } + + @Override + public void touchAutoDim(int displayId) { + NavigationBar navBar = mNavigationBars.get(displayId); + if (navBar != null) { + navBar.touchAutoDim(); + } + } + + @Override + public void transitionTo(int displayId, @TransitionMode int barMode, boolean animate) { + NavigationBar navBar = mNavigationBars.get(displayId); + if (navBar != null) { + navBar.transitionTo(barMode, animate); + } + } + + @Override + public void disableAnimationsDuringHide(int displayId, long delay) { + NavigationBar navBar = mNavigationBars.get(displayId); + if (navBar != null) { + navBar.disableAnimationsDuringHide(delay); + } + } + + @Override + public @Nullable NavigationBarView getDefaultNavigationBarView() { + return getNavigationBarView(mDisplayTracker.getDefaultDisplayId()); + } + + @Override + public @Nullable NavigationBarView getNavigationBarView(int displayId) { + NavigationBar navBar = getNavigationBar(displayId); + return (navBar == null) ? null : navBar.getView(); + } + + private @Nullable NavigationBar getNavigationBar(int displayId) { + return mNavigationBars.get(displayId); + } + + @Override + public boolean isOverviewEnabled(int displayId) { + final NavigationBarView navBarView = getNavigationBarView(displayId); + if (navBarView != null) { + return navBarView.isOverviewEnabled(); + } else { + return mTaskbarDelegate.isOverviewEnabled(); + } + } + + @Override + @Nullable + public NavigationBar getDefaultNavigationBar() { + return mNavigationBars.get(mDisplayTracker.getDefaultDisplayId()); + } + + @Override + public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { + pw.println("mIsLargeScreen=" + mIsLargeScreen); + pw.println("mNavMode=" + mNavMode); + for (int i = 0; i < mNavigationBars.size(); i++) { + if (i > 0) { + pw.println(); + } + mNavigationBars.valueAt(i).dump(pw); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerModule.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerModule.kt new file mode 100644 index 000000000000..448f2803e867 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerModule.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 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.navigationbar + +import dagger.Binds +import dagger.Module + +/** A module providing an instance of [NavigationBarController]. */ +@Module +abstract class NavigationBarControllerModule { + @Binds + abstract fun navigationBarController(impl: NavigationBarControllerImpl): NavigationBarController +} diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NoopNavigationBarControllerModule.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/NoopNavigationBarControllerModule.kt new file mode 100644 index 000000000000..b59912a0b8be --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NoopNavigationBarControllerModule.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2023 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.navigationbar + +import dagger.Binds +import dagger.Module + +/** A module providing a no-op instance of [NavigationBarController]. */ +@Module +abstract class NoopNavigationBarControllerModule { + @Binds + abstract fun navigationBarController( + impl: NavigationBarControllerEmptyImpl + ): NavigationBarController +} diff --git a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt index 3f609a25c3fc..338d3ed42f95 100644 --- a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt +++ b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt @@ -23,6 +23,7 @@ import android.os.UserHandle import android.view.KeyEvent import android.view.KeyEvent.KEYCODE_N import android.view.KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL +import android.view.ViewConfiguration import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.dagger.qualifiers.Background @@ -128,15 +129,39 @@ constructor( controller.updateNoteTaskForCurrentUserAndManagedProfiles() } } -} -/** - * Maps a [KeyEvent] to a [NoteTaskEntryPoint]. If the [KeyEvent] does not represent a - * [NoteTaskEntryPoint], returns null. - */ -private fun KeyEvent.toNoteTaskEntryPointOrNull(): NoteTaskEntryPoint? = - when { - keyCode == KEYCODE_STYLUS_BUTTON_TAIL && action == KeyEvent.ACTION_UP -> TAIL_BUTTON - keyCode == KEYCODE_N && isMetaPressed && isCtrlPressed -> KEYBOARD_SHORTCUT - else -> null + /** + * Tracks a [KeyEvent], and determines if it should trigger an action to show the note task. + * Returns a [NoteTaskEntryPoint] if an action should be taken, and null otherwise. + */ + private fun KeyEvent.toNoteTaskEntryPointOrNull(): NoteTaskEntryPoint? = + when { + keyCode == KEYCODE_STYLUS_BUTTON_TAIL && isTailButtonNotesGesture() -> TAIL_BUTTON + keyCode == KEYCODE_N && isMetaPressed && isCtrlPressed -> KEYBOARD_SHORTCUT + else -> null + } + + private var lastStylusButtonTailUpEventTime: Long = -MULTI_PRESS_TIMEOUT + + /** + * Perform gesture detection for the stylus tail button to make sure we only show the note task + * when there is a single press. Long presses and multi-presses are ignored for now. + */ + private fun KeyEvent.isTailButtonNotesGesture(): Boolean { + if (keyCode != KEYCODE_STYLUS_BUTTON_TAIL || action != KeyEvent.ACTION_UP) { + return false + } + + val isMultiPress = (downTime - lastStylusButtonTailUpEventTime) < MULTI_PRESS_TIMEOUT + val isLongPress = (eventTime - downTime) >= LONG_PRESS_TIMEOUT + lastStylusButtonTailUpEventTime = eventTime + // For now, trigger action immediately on UP of a single press, without waiting for + // the multi-press timeout to expire. + return !isMultiPress && !isLongPress } + + companion object { + val MULTI_PRESS_TIMEOUT = ViewConfiguration.getMultiPressTimeout().toLong() + val LONG_PRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout().toLong() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/model/ObservableTransitionState.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/model/ObservableTransitionState.kt index 9a30aa65068c..3927873f8ba8 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/shared/model/ObservableTransitionState.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/shared/model/ObservableTransitionState.kt @@ -32,5 +32,16 @@ sealed class ObservableTransitionState { val fromScene: SceneKey, val toScene: SceneKey, val progress: Flow<Float>, + + /** + * Whether the transition was originally triggered by user input rather than being + * programmatic. If this value is initially true, it will remain true until the transition + * fully completes, even if the user input that triggered the transition has ended. Any + * sub-transitions launched by this one will inherit this value. For example, if the user + * drags a pointer but does not exceed the threshold required to transition to another + * scene, this value will remain true after the pointer is no longer touching the screen and + * will be true in any transition created to animate back to the original position. + */ + val isUserInputDriven: Boolean, ) : ObservableTransitionState() } diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 1ffc2bbd775d..a5abf5825dc6 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -586,6 +586,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private boolean mGestureWaitForTouchSlop; private boolean mIgnoreXTouchSlop; private boolean mExpandLatencyTracking; + private boolean mUseExternalTouch = false; + /** * Whether we're waking up and will play the delayed doze animation in * {@link NotificationWakeUpCoordinator}. If so, we'll want to keep the clock centered until the @@ -1404,13 +1406,6 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump updateViewControllers(userAvatarView, keyguardUserSwitcherView); - if (mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW) && !mFeatureFlags.isEnabled( - Flags.LAZY_INFLATE_KEYGUARD)) { - attachSplitShadeMediaPlayerContainer( - mKeyguardViewConfigurator.getKeyguardRootView() - .findViewById(R.id.status_view_media_container)); - } - if (!mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) { // Update keyguard bottom area int index = mView.indexOfChild(mKeyguardBottomArea); @@ -4132,12 +4127,22 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump /** Sends an external (e.g. Status Bar) intercept touch event to the Shade touch handler. */ boolean handleExternalInterceptTouch(MotionEvent event) { - return mTouchHandler.onInterceptTouchEvent(event); + try { + mUseExternalTouch = true; + return mTouchHandler.onInterceptTouchEvent(event); + } finally { + mUseExternalTouch = false; + } } @Override public boolean handleExternalTouch(MotionEvent event) { - return mTouchHandler.onTouchEvent(event); + try { + mUseExternalTouch = true; + return mTouchHandler.onTouchEvent(event); + } finally { + mUseExternalTouch = false; + } } @Override @@ -4724,9 +4729,20 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump public final class TouchHandler implements View.OnTouchListener, Gefingerpoken { private long mLastTouchDownTime = -1L; - /** @see ViewGroup#onInterceptTouchEvent(MotionEvent) */ + /** + * With the shade and lockscreen being separated in the view hierarchy, touch handling now + * originates with the parent window through {@link #handleExternalTouch}. This allows for + * parity with the legacy hierarchy while not undertaking a massive refactoring of touch + * handling. + * + * @see NotificationShadeWindowViewController#didNotificationPanelInterceptEvent + */ @Override public boolean onInterceptTouchEvent(MotionEvent event) { + if (mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL) && !mUseExternalTouch) { + return false; + } + mShadeLog.logMotionEvent(event, "NPVC onInterceptTouchEvent"); if (mQsController.disallowTouches()) { mShadeLog.logMotionEvent(event, @@ -4879,8 +4895,20 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return onTouchEvent(event); } + /** + * With the shade and lockscreen being separated in the view hierarchy, touch handling now + * originates with the parent window through {@link #handleExternalTouch}. This allows for + * parity with the legacy hierarchy while not undertaking a massive refactoring of touch + * handling. + * + * @see NotificationShadeWindowViewController#didNotificationPanelInterceptEvent + */ @Override public boolean onTouchEvent(MotionEvent event) { + if (mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL) && !mUseExternalTouch) { + return false; + } + if (event.getAction() == MotionEvent.ACTION_DOWN) { if (event.getDownTime() == mLastTouchDownTime) { // An issue can occur when swiping down after unlock, where multiple down diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java index 880ba92123c6..96fae14cec60 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java @@ -267,6 +267,9 @@ public class NotificationShadeWindowViewController implements Dumpable { } mView.setLayoutInsetsController(mNotificationInsetsController); mView.setInteractionEventHandler(new NotificationShadeWindowView.InteractionEventHandler() { + boolean mUseDragDownHelperForTouch = false; + boolean mLastInterceptWasDragDownHelper = false; + @Override public Boolean handleDispatchTouchEvent(MotionEvent ev) { if (mStatusBarViewController == null) { // Fix for b/192490822 @@ -360,10 +363,8 @@ public class NotificationShadeWindowViewController implements Dumpable { ); // In case we start outside of the view bounds (below the status bar), we need to - // dispatch - // the touch manually as the view system can't accommodate for touches outside of - // the - // regular view bounds. + // dispatch the touch manually as the view system can't accommodate for touches + // outside of the regular view bounds. if (isDown && ev.getY() >= mView.getBottom()) { mExpandingBelowNotch = true; expandingBelowNotch = true; @@ -405,6 +406,15 @@ public class NotificationShadeWindowViewController implements Dumpable { @Override public boolean shouldInterceptTouchEvent(MotionEvent ev) { + boolean intercepted = shouldInterceptTouchEventInternal(ev); + if (intercepted) { + mUseDragDownHelperForTouch = mLastInterceptWasDragDownHelper; + } + return intercepted; + } + + private boolean shouldInterceptTouchEventInternal(MotionEvent ev) { + mLastInterceptWasDragDownHelper = false; if (mStatusBarStateController.isDozing() && !mDozeServiceHost.isPulsing() && !mDockManager.isDocked()) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { @@ -431,19 +441,36 @@ public class NotificationShadeWindowViewController implements Dumpable { } if (mNotificationPanelViewController.isFullyExpanded() - && mDragDownHelper.isDragDownEnabled() && !mService.isBouncerShowing() && !mStatusBarStateController.isDozing()) { - boolean result = mDragDownHelper.onInterceptTouchEvent(ev); - if (result) { - if (ev.getAction() == MotionEvent.ACTION_DOWN) { - mShadeLogger.d("NSWVC: drag down helper intercepted"); + if (mDragDownHelper.isDragDownEnabled()) { + // This handles drag down over lockscreen + boolean result = mDragDownHelper.onInterceptTouchEvent(ev); + if (mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL)) { + if (result) { + mLastInterceptWasDragDownHelper = true; + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mShadeLogger.d("NSWVC: drag down helper intercepted"); + } + } else if (didNotificationPanelInterceptEvent(ev)) { + return true; + } + } else { + if (result) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mShadeLogger.d("NSWVC: drag down helper intercepted"); + } + } + } + return result; + } else { + // This else handles interactions on the full shade while unlocked + if (didNotificationPanelInterceptEvent(ev)) { + return true; } } - return result; - } else { - return false; } + return false; } @Override @@ -451,7 +478,9 @@ public class NotificationShadeWindowViewController implements Dumpable { MotionEvent cancellation = MotionEvent.obtain(ev); cancellation.setAction(MotionEvent.ACTION_CANCEL); mStackScrollLayout.onInterceptTouchEvent(cancellation); - mNotificationPanelViewController.handleExternalInterceptTouch(cancellation); + if (!mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL)) { + mNotificationPanelViewController.handleExternalInterceptTouch(cancellation); + } cancellation.recycle(); } @@ -461,18 +490,27 @@ public class NotificationShadeWindowViewController implements Dumpable { if (mStatusBarStateController.isDozing()) { handled = !mDozeServiceHost.isPulsing(); } - if (mStatusBarKeyguardViewManager.onTouch(ev)) { return true; } - - if (mDragDownHelper.isDragDownEnabled() - || mDragDownHelper.isDraggingDown()) { - // we still want to finish our drag down gesture when locking the screen - return mDragDownHelper.onTouchEvent(ev) || handled; + if (mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL)) { + if (mLastInterceptWasDragDownHelper && (mDragDownHelper.isDraggingDown())) { + // we still want to finish our drag down gesture when locking the screen + handled |= mDragDownHelper.onTouchEvent(ev) || handled; + } + if (!handled && mNotificationPanelViewController.handleExternalTouch(ev)) { + return true; + } } else { - return handled; + if (mDragDownHelper.isDragDownEnabled() + || mDragDownHelper.isDraggingDown()) { + // we still want to finish our drag down gesture when locking the screen + return mDragDownHelper.onTouchEvent(ev) || handled; + } else { + return handled; + } } + return handled; } @Override @@ -520,6 +558,20 @@ public class NotificationShadeWindowViewController implements Dumpable { mDepthController.onPanelExpansionChanged(currentState); } + private boolean didNotificationPanelInterceptEvent(MotionEvent ev) { + if (mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL)) { + // Since NotificationStackScrollLayout is now a sibling of notification_panel, we need + // to also ask NotificationPanelViewController directly, in order to process swipe up + // events originating from notifications + if (mNotificationPanelViewController.handleExternalInterceptTouch(ev)) { + mShadeLogger.d("NSWVC: NPVC intercepted"); + return true; + } + } + + return false; + } + public NotificationShadeWindowView getView() { return mView; } diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index ff0d78f89e68..d653cb4fa9d7 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -70,6 +70,7 @@ import com.android.systemui.classifier.Classifier; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor; import com.android.systemui.media.controls.pipeline.MediaDataManager; @@ -1776,7 +1777,9 @@ public class QuickSettingsController implements Dumpable { // Dragging down on the lockscreen statusbar should prohibit other interactions // immediately, otherwise we'll wait on the touchslop. This is to allow // dragging down to expanded quick settings directly on the lockscreen. - mPanelView.getParent().requestDisallowInterceptTouchEvent(true); + if (!mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL)) { + mPanelView.getParent().requestDisallowInterceptTouchEvent(true); + } } if (mExpansionAnimator != null) { mInitialHeightOnTouch = mExpansionHeight; @@ -1819,7 +1822,9 @@ public class QuickSettingsController implements Dumpable { && Math.abs(h) > Math.abs(x - mInitialTouchX) && shouldQuickSettingsIntercept( mInitialTouchX, mInitialTouchY, h)) { - mPanelView.getParent().requestDisallowInterceptTouchEvent(true); + if (!mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL)) { + mPanelView.getParent().requestDisallowInterceptTouchEvent(true); + } mShadeLog.onQsInterceptMoveQsTrackingEnabled(h); setTracking(true); traceQsJank(true, false); diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt index 9a356ad1fd0b..19a4ee8ef6a0 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt @@ -484,11 +484,13 @@ constructor( if (largeScreenActive) { logInstantEvent("Large screen constraints set") header.setTransition(LARGE_SCREEN_HEADER_TRANSITION_ID) + systemIconsHoverContainer.isClickable = true systemIconsHoverContainer.setOnClickListener { shadeCollapseAction?.run() } } else { logInstantEvent("Small screen constraints set") header.setTransition(HEADER_TRANSITION_ID) systemIconsHoverContainer.setOnClickListener(null) + systemIconsHoverContainer.isClickable = false } header.jumpToState(header.startState) updatePosition() diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt index b77b9e488d7e..99189183f82a 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt @@ -59,6 +59,7 @@ constructor( @Application scope: CoroutineScope, disableFlagsRepository: DisableFlagsRepository, sceneContainerFlags: SceneContainerFlags, + // TODO(b/300258424) convert to direct reference instead of provider sceneInteractorProvider: Provider<SceneInteractor>, keyguardRepository: KeyguardRepository, userSetupRepository: UserSetupRepository, @@ -141,15 +142,22 @@ constructor( * if the user's input gesture has ended but a transition they initiated is animating. */ val isUserInteractingWithShade: Flow<Boolean> = - userInteractingFlow(repository.legacyShadeTracking, repository.legacyShadeExpansion) - + if (sceneContainerFlags.isEnabled()) { + sceneBasedInteracting(sceneInteractorProvider.get(), SceneKey.Shade) + } else { + userInteractingFlow(repository.legacyShadeTracking, repository.legacyShadeExpansion) + } /** * Whether the user is expanding or collapsing quick settings with user input. This will be true * even if the user's input gesture has ended but a transition they initiated is still * animating. */ val isUserInteractingWithQs: Flow<Boolean> = - userInteractingFlow(repository.legacyQsTracking, repository.qsExpansion) + if (sceneContainerFlags.isEnabled()) { + sceneBasedInteracting(sceneInteractorProvider.get(), SceneKey.QuickSettings) + } else { + userInteractingFlow(repository.legacyQsTracking, repository.qsExpansion) + } /** * Whether the user is expanding or collapsing either the shade or quick settings with user @@ -158,6 +166,7 @@ constructor( */ val isUserInteracting: Flow<Boolean> = combine(isUserInteractingWithShade, isUserInteractingWithShade) { shade, qs -> shade || qs } + .distinctUntilChanged() /** Emits true if the shade can be expanded from QQS to QS and false otherwise. */ val isExpandToQsEnabled: Flow<Boolean> = @@ -198,6 +207,18 @@ constructor( } .distinctUntilChanged() + fun sceneBasedInteracting(sceneInteractor: SceneInteractor, sceneKey: SceneKey) = + sceneInteractor.transitionState + .map { state -> + when (state) { + is ObservableTransitionState.Idle -> false + is ObservableTransitionState.Transition -> + state.isUserInputDriven && + (state.toScene == sceneKey || state.fromScene == sceneKey) + } + } + .distinctUntilChanged() + /** * Return a flow for whether a user is interacting with an expandable shade component using * tracking and expansion flows. NOTE: expansion must be a `StateFlow` to guarantee that diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 6304c1ea2635..670fb1289357 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -375,15 +375,8 @@ public class CommandQueue extends IStatusBar.Stub implements /** * @see IStatusBar#showTransient(int, int, boolean). */ - default void showTransient(int displayId, @InsetsType int types) { } - - /** - * @see IStatusBar#showTransient(int, int, boolean). - */ default void showTransient(int displayId, @InsetsType int types, - boolean isGestureOnSystemBar) { - showTransient(displayId, types); - } + boolean isGestureOnSystemBar) {} /** * @see IStatusBar#abortTransient(int, int). diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java index 3dfe068e6137..d058d04728ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.dagger; -import android.app.IActivityManager; import android.app.WallpaperManager; import android.content.Context; import android.hardware.display.DisplayManager; @@ -38,7 +37,6 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.media.controls.pipeline.MediaDataManager; -import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.settings.DisplayTracker; @@ -57,12 +55,10 @@ import com.android.systemui.statusbar.SmartReplyController; import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.commandline.CommandRegistry; -import com.android.systemui.statusbar.gesture.SwipeStatusBarAwayGestureHandler; import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.RemoteInputControllerLogger; import com.android.systemui.statusbar.notification.collection.NotifCollection; import com.android.systemui.statusbar.notification.collection.NotifPipeline; -import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; import com.android.systemui.statusbar.phone.CentralSurfacesImpl; import com.android.systemui.statusbar.phone.KeyguardBypassController; @@ -73,23 +69,15 @@ import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl; import com.android.systemui.statusbar.phone.StatusBarIconList; import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule; import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback; -import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; -import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallFlags; -import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLogger; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.RemoteInputUriController; -import com.android.systemui.statusbar.window.StatusBarWindowController; import com.android.systemui.util.concurrency.DelayableExecutor; -import com.android.systemui.util.time.SystemClock; import dagger.Binds; import dagger.Lazy; import dagger.Module; import dagger.Provides; -import java.util.Optional; -import java.util.concurrent.Executor; - /** * This module provides instances needed to construct {@link CentralSurfacesImpl}. These are moved to * this separate from {@link CentralSurfacesModule} module so that components that wish to build @@ -230,51 +218,6 @@ public interface CentralSurfacesDependenciesModule { } /** - */ - @Provides - @SysUISingleton - static OngoingCallController provideOngoingCallController( - Context context, - CommonNotifCollection notifCollection, - SystemClock systemClock, - ActivityStarter activityStarter, - @Main Executor mainExecutor, - IActivityManager iActivityManager, - OngoingCallLogger logger, - DumpManager dumpManager, - StatusBarWindowController statusBarWindowController, - SwipeStatusBarAwayGestureHandler swipeStatusBarAwayGestureHandler, - StatusBarStateController statusBarStateController, - OngoingCallFlags ongoingCallFlags) { - - boolean ongoingCallInImmersiveEnabled = ongoingCallFlags.isInImmersiveEnabled(); - Optional<StatusBarWindowController> windowController = - ongoingCallInImmersiveEnabled - ? Optional.of(statusBarWindowController) - : Optional.empty(); - Optional<SwipeStatusBarAwayGestureHandler> gestureHandler = - ongoingCallInImmersiveEnabled - ? Optional.of(swipeStatusBarAwayGestureHandler) - : Optional.empty(); - OngoingCallController ongoingCallController = - new OngoingCallController( - context, - notifCollection, - ongoingCallFlags, - systemClock, - activityStarter, - mainExecutor, - iActivityManager, - logger, - dumpManager, - windowController, - gestureHandler, - statusBarStateController); - ongoingCallController.init(); - return ongoingCallController; - } - - /** * {@link NotificationPanelViewController} implements two interfaces: * - {@link com.android.systemui.shade.ShadeViewController}, which can be used by any class * needing access to the shade. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt new file mode 100644 index 000000000000..d1464ede2bd5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2023 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.statusbar.dagger + +import com.android.systemui.CoreStartable +import com.android.systemui.statusbar.data.repository.StatusBarModeRepository +import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryImpl +import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController +import dagger.Binds +import dagger.Module +import dagger.multibindings.ClassKey +import dagger.multibindings.IntoMap + +/** + * A module for **only** classes related to the status bar **UI element**. This module specifically + * should **not** include: + * - Classes in the `statusbar` package that are unrelated to the status bar UI. + * - Status bar classes that are already provided by other modules + * ([com.android.systemui.statusbar.pipeline.dagger.StatusBarPipelineModule], + * [com.android.systemui.statusbar.policy.dagger.StatusBarPolicyModule], etc.). + */ +@Module +abstract class StatusBarModule { + @Binds + abstract fun bindStatusBarModeRepository( + impl: StatusBarModeRepositoryImpl + ): StatusBarModeRepository + + @Binds + @IntoMap + @ClassKey(StatusBarModeRepositoryImpl::class) + abstract fun bindStatusBarModeRepositoryStart(impl: StatusBarModeRepositoryImpl): CoreStartable + + @Binds + @IntoMap + @ClassKey(OngoingCallController::class) + abstract fun bindOngoingCallController(impl: OngoingCallController): CoreStartable +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepository.kt new file mode 100644 index 000000000000..1de7a2f2e698 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepository.kt @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2023 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.statusbar.data.repository + +import android.view.WindowInsets +import com.android.systemui.CoreStartable +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.DisplayId +import com.android.systemui.statusbar.CommandQueue +import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +/** + * A repository for the current mode of the status bar on the homescreen (translucent, transparent, + * opaque, lights out, hidden, etc.). + * + * Note: These status bar modes are status bar *window* states that are sent to us from + * WindowManager, not determined internally. + */ +interface StatusBarModeRepository { + /** + * True if the status bar window is showing transiently and will disappear soon, and false + * otherwise. ("Otherwise" in this case means the status bar is persistently hidden OR + * persistently shown.) + * + * This behavior is controlled by WindowManager via + * [android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE], *not* calculated + * internally. SysUI merely obeys the behavior sent to us. + */ + val isTransientShown: StateFlow<Boolean> + + /** + * Requests for the status bar to be shown transiently. + * + * TODO(b/277764509): Don't allow [CentralSurfaces] to set the transient mode; have it + * determined internally instead. + */ + fun showTransient() + + /** + * Requests for the status bar to be no longer showing transiently. + * + * TODO(b/277764509): Don't allow [CentralSurfaces] to set the transient mode; have it + * determined internally instead. + */ + fun clearTransient() +} + +@SysUISingleton +class StatusBarModeRepositoryImpl +@Inject +constructor( + @DisplayId thisDisplayId: Int, + private val commandQueue: CommandQueue, +) : StatusBarModeRepository, CoreStartable { + + private val commandQueueCallback = + object : CommandQueue.Callbacks { + override fun showTransient( + displayId: Int, + @WindowInsets.Type.InsetsType types: Int, + isGestureOnSystemBar: Boolean, + ) { + if (isTransientRelevant(displayId, types)) { + _isTransientShown.value = true + } + } + + override fun abortTransient(displayId: Int, @WindowInsets.Type.InsetsType types: Int) { + if (isTransientRelevant(displayId, types)) { + _isTransientShown.value = false + } + } + + private fun isTransientRelevant( + displayId: Int, + @WindowInsets.Type.InsetsType types: Int, + ): Boolean { + return displayId == thisDisplayId && (types and WindowInsets.Type.statusBars() != 0) + } + } + + override fun start() { + commandQueue.addCallback(commandQueueCallback) + } + + private val _isTransientShown = MutableStateFlow(false) + override val isTransientShown: StateFlow<Boolean> = _isTransientShown.asStateFlow() + + override fun showTransient() { + _isTransientShown.value = true + } + + override fun clearTransient() { + _isTransientShown.value = false + } +} 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 7d575685dcae..6ed2089a0324 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -306,10 +306,6 @@ public interface CentralSurfaces extends Dumpable, LifecycleOwner { @VisibleForTesting void setBarStateForTest(int state); - void showTransientUnchecked(); - - void clearTransient(); - void acquireGestureWakeLock(long time); boolean setAppearance(int appearance); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java index ebcfb8adb08d..c9db153ff280 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java @@ -36,7 +36,6 @@ import android.util.Log; import android.util.Slog; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; -import android.view.WindowInsets; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -192,17 +191,6 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba } @Override - public void abortTransient(int displayId, @InsetsType int types) { - if (displayId != mDisplayId) { - return; - } - if ((types & WindowInsets.Type.statusBars()) == 0) { - return; - } - mCentralSurfaces.clearTransient(); - } - - @Override public void addQsTile(ComponentName tile) { mQSHost.addTile(tile); } @@ -487,17 +475,6 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba } @Override - public void showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar) { - if (displayId != mDisplayId) { - return; - } - if ((types & WindowInsets.Type.statusBars()) == 0) { - return; - } - mCentralSurfaces.showTransientUnchecked(); - } - - @Override public void toggleKeyboardShortcutsMenu(int deviceId) { mCentralSurfaces.resendMessage(new CentralSurfaces.KeyboardShortcutsMessage(deviceId)); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt index 5e505f733c93..50d8e99dd798 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesEmptyImpl.kt @@ -86,8 +86,6 @@ abstract class CentralSurfacesEmptyImpl : CentralSurfaces { override fun updateNotificationPanelTouchState() {} override fun getRotation() = 0 override fun setBarStateForTest(state: Int) {} - override fun showTransientUnchecked() {} - override fun clearTransient() {} override fun acquireGestureWakeLock(time: Long) {} override fun setAppearance(appearance: Int) = false override fun getBarMode() = 0 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 8d35d39bceea..d968e7163496 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -207,6 +207,7 @@ import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.core.StatusBarInitializer; +import com.android.systemui.statusbar.data.repository.StatusBarModeRepository; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationActivityStarter; import com.android.systemui.statusbar.notification.NotificationLaunchAnimatorControllerProvider; @@ -238,6 +239,7 @@ import com.android.systemui.util.DumpUtilsKt; import com.android.systemui.util.WallpaperController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.concurrency.MessageRouter; +import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.volume.VolumeComponent; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.startingsurface.SplashscreenContentDrawer; @@ -410,6 +412,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private final NotificationShadeWindowController mNotificationShadeWindowController; private final StatusBarInitializer mStatusBarInitializer; private final StatusBarWindowController mStatusBarWindowController; + private final StatusBarModeRepository mStatusBarModeRepository; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @VisibleForTesting DozeServiceHost mDozeServiceHost; @@ -496,8 +499,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { /** @see android.view.WindowInsetsController#setSystemBarsAppearance(int, int) */ private @Appearance int mAppearance; - private boolean mTransientShown; - private final DisplayMetrics mDisplayMetrics; // XXX: gesture research @@ -558,6 +559,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private final ScrimController mScrimController; protected DozeScrimController mDozeScrimController; private final BackActionInteractor mBackActionInteractor; + private final JavaAdapter mJavaAdapter; private final Executor mUiBgExecutor; protected boolean mDozing; @@ -633,6 +635,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { StatusBarInitializer statusBarInitializer, StatusBarWindowController statusBarWindowController, StatusBarWindowStateController statusBarWindowStateController, + StatusBarModeRepository statusBarModeRepository, KeyguardUpdateMonitor keyguardUpdateMonitor, StatusBarSignalPolicy statusBarSignalPolicy, PulseExpansionHandler pulseExpansionHandler, @@ -651,6 +654,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { DisplayMetrics displayMetrics, MetricsLogger metricsLogger, ShadeLogger shadeLogger, + JavaAdapter javaAdapter, @UiBackground Executor uiBgExecutor, ShadeSurface shadeSurface, NotificationMediaManager notificationMediaManager, @@ -740,6 +744,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mAutoHideController = autoHideController; mStatusBarInitializer = statusBarInitializer; mStatusBarWindowController = statusBarWindowController; + mStatusBarModeRepository = statusBarModeRepository; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mPulseExpansionHandler = pulseExpansionHandler; mWakeUpCoordinator = notificationWakeUpCoordinator; @@ -759,6 +764,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mDisplayMetrics = displayMetrics; mMetricsLogger = metricsLogger; mShadeLogger = shadeLogger; + mJavaAdapter = javaAdapter; mUiBgExecutor = uiBgExecutor; mShadeSurface = shadeSurface; mMediaManager = notificationMediaManager; @@ -934,7 +940,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { setUpPresenter(); if ((result.mTransientBarTypes & WindowInsets.Type.statusBars()) != 0) { - showTransientUnchecked(); + mStatusBarModeRepository.showTransient(); } mCommandQueueCallbacks.onSystemBarAttributesChanged(mDisplayId, result.mAppearance, result.mAppearanceRegions, result.mNavbarColorManagedByIme, result.mBehavior, @@ -1184,6 +1190,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mWallpaperController.setRootView(getNotificationShadeWindowView()); mDemoModeController.addCallback(mDemoModeCallback); + mJavaAdapter.alwaysCollectFlow( + mStatusBarModeRepository.isTransientShown(), this::onTransientShownChanged); mCommandQueueCallbacks = mCommandQueueCallbacksLazy.get(); mCommandQueue.addCallback(mCommandQueueCallbacks); @@ -1249,7 +1257,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { @Override public void hide() { - clearTransient(); + mStatusBarModeRepository.clearTransient(); } }); @@ -1537,7 +1545,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { return (v, event) -> { mAutoHideController.checkUserAutoHide(event); mRemoteInputManager.checkRemoteInputOutside(event); - mShadeController.onStatusBarTouch(event); + if (!mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL)) { + mShadeController.onStatusBarTouch(event); + } return getNotificationShadeWindowView().onTouchEvent(event); }; } @@ -1716,25 +1726,15 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { return mCommandQueue.panelsEnabled(); } - @Override - public void showTransientUnchecked() { - if (!mTransientShown) { - mTransientShown = true; + private void onTransientShownChanged(boolean transientShown) { + if (transientShown) { mNoAnimationOnNextBarModeChange = true; - maybeUpdateBarMode(); - } - } - - @Override - public void clearTransient() { - if (mTransientShown) { - mTransientShown = false; - maybeUpdateBarMode(); } + maybeUpdateBarMode(); } private void maybeUpdateBarMode() { - final int barMode = barMode(mTransientShown, mAppearance); + final int barMode = barMode(isTransientShown(), mAppearance); if (updateBarMode(barMode)) { mLightBarController.onStatusBarModeChanged(barMode); updateBubblesVisibility(); @@ -3149,7 +3149,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { // End Extra BaseStatusBarMethods. boolean isTransientShown() { - return mTransientShown; + return mStatusBarModeRepository.isTransientShown().getValue(); } private void updateLightRevealScrimVisibility() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt index b3af91d9fb5b..52e444fb6bb2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt @@ -27,6 +27,7 @@ import android.util.Log import android.view.View import androidx.annotation.VisibleForTesting import com.android.internal.jank.InteractionJankMonitor +import com.android.systemui.CoreStartable import com.android.systemui.Dumpable import com.android.systemui.R import com.android.systemui.animation.ActivityLaunchAnimator @@ -43,7 +44,6 @@ import com.android.systemui.statusbar.policy.CallbackController import com.android.systemui.statusbar.window.StatusBarWindowController import com.android.systemui.util.time.SystemClock import java.io.PrintWriter -import java.util.Optional import java.util.concurrent.Executor import javax.inject.Inject @@ -54,17 +54,16 @@ import javax.inject.Inject class OngoingCallController @Inject constructor( private val context: Context, private val notifCollection: CommonNotifCollection, - private val ongoingCallFlags: OngoingCallFlags, private val systemClock: SystemClock, private val activityStarter: ActivityStarter, @Main private val mainExecutor: Executor, private val iActivityManager: IActivityManager, private val logger: OngoingCallLogger, private val dumpManager: DumpManager, - private val statusBarWindowController: Optional<StatusBarWindowController>, - private val swipeStatusBarAwayGestureHandler: Optional<SwipeStatusBarAwayGestureHandler>, + private val statusBarWindowController: StatusBarWindowController, + private val swipeStatusBarAwayGestureHandler: SwipeStatusBarAwayGestureHandler, private val statusBarStateController: StatusBarStateController -) : CallbackController<OngoingCallListener>, Dumpable { +) : CallbackController<OngoingCallListener>, Dumpable, CoreStartable { private var isFullscreen: Boolean = false /** Non-null if there's an active call notification. */ private var callNotificationInfo: CallNotificationInfo? = null @@ -120,12 +119,10 @@ class OngoingCallController @Inject constructor( } } - fun init() { + override fun start() { dumpManager.registerDumpable(this) - if (ongoingCallFlags.isStatusBarChipEnabled()) { - notifCollection.addCollectionListener(notifListener) - statusBarStateController.addCallback(statusBarStateListener) - } + notifCollection.addCollectionListener(notifListener) + statusBarStateController.addCallback(statusBarStateListener) } /** @@ -138,7 +135,7 @@ class OngoingCallController @Inject constructor( this.chipView = chipView val backgroundView: OngoingCallBackgroundContainer? = chipView.findViewById(R.id.ongoing_call_chip_background) - backgroundView?.maxHeightFetcher = { statusBarWindowController.get().statusBarHeight } + backgroundView?.maxHeightFetcher = { statusBarWindowController.statusBarHeight } if (hasOngoingCall()) { updateChip() } @@ -197,9 +194,7 @@ class OngoingCallController @Inject constructor( uidObserver.registerWithUid(currentCallNotificationInfo.uid) if (!currentCallNotificationInfo.statusBarSwipedAway) { - statusBarWindowController.ifPresent { - it.setOngoingProcessRequiresStatusBarVisible(true) - } + statusBarWindowController.setOngoingProcessRequiresStatusBarVisible(true) } updateGestureListening() mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) } @@ -217,23 +212,19 @@ class OngoingCallController @Inject constructor( private fun updateChipClickListener() { if (callNotificationInfo == null) { return } - if (isFullscreen && !ongoingCallFlags.isInImmersiveChipTapEnabled()) { - chipView?.setOnClickListener(null) - } else { - val currentChipView = chipView - val backgroundView = - currentChipView?.findViewById<View>(R.id.ongoing_call_chip_background) - val intent = callNotificationInfo?.intent - if (currentChipView != null && backgroundView != null && intent != null) { - currentChipView.setOnClickListener { - logger.logChipClicked() - activityStarter.postStartActivityDismissingKeyguard( - intent, - ActivityLaunchAnimator.Controller.fromView( - backgroundView, - InteractionJankMonitor.CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP) - ) - } + val currentChipView = chipView + val backgroundView = + currentChipView?.findViewById<View>(R.id.ongoing_call_chip_background) + val intent = callNotificationInfo?.intent + if (currentChipView != null && backgroundView != null && intent != null) { + currentChipView.setOnClickListener { + logger.logChipClicked() + activityStarter.postStartActivityDismissingKeyguard( + intent, + ActivityLaunchAnimator.Controller.fromView( + backgroundView, + InteractionJankMonitor.CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP) + ) } } } @@ -247,10 +238,10 @@ class OngoingCallController @Inject constructor( if (callNotificationInfo == null || callNotificationInfo?.statusBarSwipedAway == true || !isFullscreen) { - swipeStatusBarAwayGestureHandler.ifPresent { it.removeOnGestureDetectedCallback(TAG) } + swipeStatusBarAwayGestureHandler.removeOnGestureDetectedCallback(TAG) } else { - swipeStatusBarAwayGestureHandler.ifPresent { - it.addOnGestureDetectedCallback(TAG) { _ -> onSwipeAwayGestureDetected() } + swipeStatusBarAwayGestureHandler.addOnGestureDetectedCallback(TAG) { _ -> + onSwipeAwayGestureDetected() } } } @@ -258,8 +249,8 @@ class OngoingCallController @Inject constructor( private fun removeChip() { callNotificationInfo = null tearDownChipView() - statusBarWindowController.ifPresent { it.setOngoingProcessRequiresStatusBarVisible(false) } - swipeStatusBarAwayGestureHandler.ifPresent { it.removeOnGestureDetectedCallback(TAG) } + statusBarWindowController.setOngoingProcessRequiresStatusBarVisible(false) + swipeStatusBarAwayGestureHandler.removeOnGestureDetectedCallback(TAG) mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) } uidObserver.unregister() } @@ -283,12 +274,8 @@ class OngoingCallController @Inject constructor( private fun onSwipeAwayGestureDetected() { if (DEBUG) { Log.d(TAG, "Swipe away gesture detected") } callNotificationInfo = callNotificationInfo?.copy(statusBarSwipedAway = true) - statusBarWindowController.ifPresent { - it.setOngoingProcessRequiresStatusBarVisible(false) - } - swipeStatusBarAwayGestureHandler.ifPresent { - it.removeOnGestureDetectedCallback(TAG) - } + statusBarWindowController.setOngoingProcessRequiresStatusBarVisible(false) + swipeStatusBarAwayGestureHandler.removeOnGestureDetectedCallback(TAG) } private val statusBarStateListener = object : StatusBarStateController.StateListener { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallFlags.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallFlags.kt deleted file mode 100644 index fcfcb8f7ff31..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallFlags.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2021 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.statusbar.phone.ongoingcall - -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags -import javax.inject.Inject - -@SysUISingleton -class OngoingCallFlags @Inject constructor(private val featureFlags: FeatureFlags) { - - fun isStatusBarChipEnabled(): Boolean = - featureFlags.isEnabled(Flags.ONGOING_CALL_STATUS_BAR_CHIP) - - fun isInImmersiveEnabled(): Boolean = isStatusBarChipEnabled() - && featureFlags.isEnabled(Flags.ONGOING_CALL_IN_IMMERSIVE) - - fun isInImmersiveChipTapEnabled(): Boolean = isInImmersiveEnabled() - && featureFlags.isEnabled(Flags.ONGOING_CALL_IN_IMMERSIVE_CHIP_TAP) -}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt index decc457dc452..929604bc81b6 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt @@ -810,7 +810,8 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() { ObservableTransitionState.Transition( SceneKey.Lockscreen, SceneKey.Bouncer, - flowOf(.5f) + flowOf(.5f), + false, ) runCurrent() sceneInteractor.onSceneChanged(SceneModel(SceneKey.Bouncer, null), "reason") @@ -822,7 +823,12 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() { // keyguard. sceneInteractor.changeScene(SceneModel(SceneKey.Gone, null), "reason") sceneTransitionStateFlow.value = - ObservableTransitionState.Transition(SceneKey.Bouncer, SceneKey.Gone, flowOf(.5f)) + ObservableTransitionState.Transition( + SceneKey.Bouncer, + SceneKey.Gone, + flowOf(.5f), + false + ) runCurrent() sceneInteractor.onSceneChanged(SceneModel(SceneKey.Gone, null), "reason") sceneTransitionStateFlow.value = ObservableTransitionState.Idle(SceneKey.Gone) @@ -834,7 +840,12 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() { clearInvocations(viewMediatorCallback) sceneInteractor.changeScene(SceneModel(SceneKey.Bouncer, null), "reason") sceneTransitionStateFlow.value = - ObservableTransitionState.Transition(SceneKey.Gone, SceneKey.Bouncer, flowOf(.5f)) + ObservableTransitionState.Transition( + SceneKey.Gone, + SceneKey.Bouncer, + flowOf(.5f), + false + ) runCurrent() sceneInteractor.onSceneChanged(SceneModel(SceneKey.Bouncer, null), "reason") sceneTransitionStateFlow.value = ObservableTransitionState.Idle(SceneKey.Bouncer) @@ -847,7 +858,12 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() { underTest.onViewDetached() sceneInteractor.changeScene(SceneModel(SceneKey.Gone, null), "reason") sceneTransitionStateFlow.value = - ObservableTransitionState.Transition(SceneKey.Bouncer, SceneKey.Gone, flowOf(.5f)) + ObservableTransitionState.Transition( + SceneKey.Bouncer, + SceneKey.Gone, + flowOf(.5f), + false + ) runCurrent() sceneInteractor.onSceneChanged(SceneModel(SceneKey.Gone, null), "reason") sceneTransitionStateFlow.value = ObservableTransitionState.Idle(SceneKey.Gone) @@ -860,7 +876,8 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() { ObservableTransitionState.Transition( SceneKey.Gone, SceneKey.Lockscreen, - flowOf(.5f) + flowOf(.5f), + false, ) runCurrent() sceneInteractor.onSceneChanged(SceneModel(SceneKey.Lockscreen, null), "reason") @@ -876,7 +893,8 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() { ObservableTransitionState.Transition( SceneKey.Lockscreen, SceneKey.Gone, - flowOf(.5f) + flowOf(.5f), + false, ) runCurrent() sceneInteractor.onSceneChanged(SceneModel(SceneKey.Gone, null), "reason") diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt index 14cdf2f58a7d..90e217f3418c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt @@ -217,6 +217,7 @@ class KeyguardInteractorTest : SysuiTestCase() { fromScene = SceneKey.Gone, toScene = SceneKey.Lockscreen, progress = flowOf(0f), + isUserInputDriven = false, ) runCurrent() assertThat(isAnimate).isFalse() diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt index d6b621e55dd7..7f4755df160b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt @@ -23,8 +23,6 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.flags.FakeFeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.keyguard.shared.model.KeyguardBlueprint import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.keyguard.ui.view.KeyguardRootView @@ -66,8 +64,6 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { @Mock private lateinit var splitShadeGuidelines: SplitShadeGuidelines @Mock private lateinit var aodNotificationIconsSection: AodNotificationIconsSection - private val featureFlags = FakeFeatureFlags() - @Before fun setup() { MockitoAnnotations.initMocks(this) @@ -84,23 +80,13 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { defaultNSSLSection, splitShadeGuidelines, aodNotificationIconsSection, - featureFlags, ) - featureFlags.set(Flags.LAZY_INFLATE_KEYGUARD, false) } @Test fun replaceViews() { val constraintLayout = ConstraintLayout(context, null) underTest.replaceViews(null, constraintLayout) - underTest.sections.forEach { verify(it, never()).addViews(constraintLayout) } - } - - @Test - fun replaceViews_lazyInflateFlagOn() { - featureFlags.set(Flags.LAZY_INFLATE_KEYGUARD, true) - val constraintLayout = ConstraintLayout(context, null) - underTest.replaceViews(null, constraintLayout) underTest.sections.forEach { verify(it).addViews(constraintLayout) } } @@ -110,7 +96,6 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { val someSection = mock(KeyguardSection::class.java) whenever(prevBlueprint.sections) .thenReturn(underTest.sections.minus(defaultLockIconSection).plus(someSection)) - featureFlags.set(Flags.LAZY_INFLATE_KEYGUARD, true) val constraintLayout = ConstraintLayout(context, null) underTest.replaceViews(prevBlueprint, constraintLayout) underTest.sections.minus(defaultLockIconSection).forEach { diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerImplTest.java index 89405c109224..c835146dd974 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerImplTest.java @@ -74,11 +74,11 @@ import java.util.Optional; @RunWith(AndroidTestingRunner.class) @RunWithLooper @SmallTest -public class NavigationBarControllerTest extends SysuiTestCase { +public class NavigationBarControllerImplTest extends SysuiTestCase { private static final int SECONDARY_DISPLAY = 1; - private NavigationBarController mNavigationBarController; + private NavigationBarControllerImpl mNavigationBarController; private NavigationBar mDefaultNavBar; private NavigationBar mSecondaryNavBar; private StaticMockitoSession mMockitoSession; @@ -95,7 +95,7 @@ public class NavigationBarControllerTest extends SysuiTestCase { public void setUp() { MockitoAnnotations.initMocks(this); mNavigationBarController = spy( - new NavigationBarController(mContext, + new NavigationBarControllerImpl(mContext, mock(OverviewProxyService.class), mock(NavigationModeController.class), mock(SysUiState.class), diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarInflaterViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarInflaterViewTest.java index 7369c82e23ba..52d02b631f89 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarInflaterViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarInflaterViewTest.java @@ -33,8 +33,6 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.assist.AssistManager; import com.android.systemui.navigationbar.buttons.ButtonDispatcher; -import com.android.systemui.navigationbar.NavigationBarInflaterView; -import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.recents.OverviewProxyService; import org.junit.After; diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt index 162b7b3d41db..78330078076c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt @@ -235,4 +235,42 @@ internal class NoteTaskInitializerTest : SysuiTestCase() { verify(controller).showNoteTask(any()) } + + @Test + fun tailButtonGestureDetection_doublePress_shouldNotShowNoteTaskTwice() { + val underTest = createUnderTest(isEnabled = true, bubbles = bubbles) + underTest.initialize() + val callback = withArgCaptor { verify(commandQueue).addCallback(capture()) } + + callback.handleSystemKey( + createKeyEvent(ACTION_DOWN, KEYCODE_STYLUS_BUTTON_TAIL, downTime = 0, eventTime = 0) + ) + callback.handleSystemKey( + createKeyEvent(ACTION_UP, KEYCODE_STYLUS_BUTTON_TAIL, downTime = 0, eventTime = 50) + ) + callback.handleSystemKey( + createKeyEvent(ACTION_DOWN, KEYCODE_STYLUS_BUTTON_TAIL, downTime = 99, eventTime = 99) + ) + callback.handleSystemKey( + createKeyEvent(ACTION_UP, KEYCODE_STYLUS_BUTTON_TAIL, downTime = 99, eventTime = 150) + ) + + verify(controller, times(1)).showNoteTask(any()) + } + + @Test + fun tailButtonGestureDetection_longPress_shouldNotShowNoteTask() { + val underTest = createUnderTest(isEnabled = true, bubbles = bubbles) + underTest.initialize() + val callback = withArgCaptor { verify(commandQueue).addCallback(capture()) } + + callback.handleSystemKey( + createKeyEvent(ACTION_DOWN, KEYCODE_STYLUS_BUTTON_TAIL, downTime = 0, eventTime = 0) + ) + callback.handleSystemKey( + createKeyEvent(ACTION_UP, KEYCODE_STYLUS_BUTTON_TAIL, downTime = 0, eventTime = 1000) + ) + + verify(controller, never()).showNoteTask(any()) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt index 78385cd516c8..2662a10f432e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt @@ -433,6 +433,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { fromScene = getCurrentSceneInUi(), toScene = to.key, progress = progressFlow, + isUserInputDriven = false, ) runCurrent() diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt index 181f8a7e3003..ff28d2dbccdd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt @@ -119,6 +119,7 @@ class SceneContainerRepositoryTest : SysuiTestCase() { fromScene = SceneKey.Lockscreen, toScene = SceneKey.Shade, progress = progress, + isUserInputDriven = false, ) assertThat(reflectedTransitionState).isEqualTo(transitionState.value) diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt index ed716a97410f..afc0e6944839 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt @@ -86,6 +86,7 @@ class SceneInteractorTest : SysuiTestCase() { fromScene = SceneKey.Lockscreen, toScene = SceneKey.Shade, progress = progress, + isUserInputDriven = false, ) assertThat(reflectedTransitionState).isEqualTo(transitionState.value) @@ -123,6 +124,7 @@ class SceneInteractorTest : SysuiTestCase() { fromScene = underTest.desiredScene.value.key, toScene = SceneKey.Shade, progress = progress, + isUserInputDriven = false, ) assertThat(transitionTo).isEqualTo(SceneKey.Shade) @@ -158,7 +160,8 @@ class SceneInteractorTest : SysuiTestCase() { ObservableTransitionState.Transition( fromScene = SceneKey.Gone, toScene = SceneKey.Lockscreen, - progress = flowOf(0.5f) + progress = flowOf(0.5f), + isUserInputDriven = false, ) ) val transitioning by @@ -176,7 +179,8 @@ class SceneInteractorTest : SysuiTestCase() { ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.QuickSettings, - progress = flowOf(0.5f) + progress = flowOf(0.5f), + isUserInputDriven = false, ) ) underTest.setTransitionState(transitionState) @@ -192,7 +196,8 @@ class SceneInteractorTest : SysuiTestCase() { ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.Lockscreen, - progress = flowOf(0.5f) + progress = flowOf(0.5f), + isUserInputDriven = false, ) ) val transitioning by @@ -219,7 +224,8 @@ class SceneInteractorTest : SysuiTestCase() { ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.Lockscreen, - progress = flowOf(0.5f) + progress = flowOf(0.5f), + isUserInputDriven = false, ) assertThat(transitioning).isTrue() diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt index 145629a65f68..16fdf8e40ed1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt @@ -109,6 +109,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fromScene = SceneKey.Gone, toScene = SceneKey.Shade, progress = flowOf(0.5f), + isUserInputDriven = false, ) assertThat(isVisible).isTrue() sceneInteractor.onSceneChanged(SceneModel(SceneKey.Shade), "reason") @@ -121,6 +122,7 @@ class SceneContainerStartableTest : SysuiTestCase() { fromScene = SceneKey.Shade, toScene = SceneKey.Gone, progress = flowOf(0.5f), + isUserInputDriven = false, ) assertThat(isVisible).isTrue() sceneInteractor.onSceneChanged(SceneModel(SceneKey.Gone), "reason") diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index 0722d9a2df7d..8be817839fcc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -1100,7 +1100,18 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo mEmptySpaceClickListenerCaptor.getValue().onEmptySpaceClicked(0, 0); verify(mUpdateMonitor, never()).requestFaceAuth(anyString()); + } + + @Test + public void nsslFlagEnabled_allowOnlyExternalTouches() { + when(mFeatureFlags.isEnabled(Flags.MIGRATE_NSSL)).thenReturn(true); + + // This sets the dozing state that is read when onMiddleClicked is eventually invoked. + mTouchHandler.onTouch(mock(View.class), mDownMotionEvent); + verify(mQsController, never()).disallowTouches(); + mNotificationPanelViewController.handleExternalInterceptTouch(mDownMotionEvent); + verify(mQsController).disallowTouches(); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt index 39fe4989260e..3da5f6a4b7c0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt @@ -48,6 +48,7 @@ import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransition import com.android.systemui.log.BouncerLogger import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.shade.NotificationShadeWindowView.InteractionEventHandler +import com.android.systemui.statusbar.DragDownHelper import com.android.systemui.statusbar.LockscreenShadeTransitionController import com.android.systemui.statusbar.NotificationInsetsController import com.android.systemui.statusbar.NotificationShadeDepthController @@ -124,6 +125,7 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { private lateinit var unfoldTransitionProgressProvider: Optional<UnfoldTransitionProgressProvider> @Mock lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor + @Mock lateinit var dragDownHelper: DragDownHelper @Mock lateinit var primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel @Mock lateinit var keyEventInteractor: KeyEventInteractor @@ -137,6 +139,8 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { private lateinit var testScope: TestScope + private lateinit var featureFlags: FakeFeatureFlags + @Before fun setUp() { MockitoAnnotations.initMocks(this) @@ -150,12 +154,13 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { whenever(keyguardTransitionInteractor.lockscreenToDreamingTransition) .thenReturn(emptyFlow<TransitionStep>()) - val featureFlags = FakeFeatureFlags() + featureFlags = FakeFeatureFlags() featureFlags.set(Flags.TRACKPAD_GESTURE_COMMON, true) featureFlags.set(Flags.TRACKPAD_GESTURE_FEATURES, false) featureFlags.set(Flags.SPLIT_SHADE_SUBPIXEL_OPTIMIZATION, true) featureFlags.set(Flags.REVAMPED_BOUNCER_MESSAGES, true) featureFlags.set(Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false) + featureFlags.set(Flags.MIGRATE_NSSL, false) testScope = TestScope() fakeClock = FakeSystemClock() @@ -206,6 +211,7 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { keyEventInteractor, ) underTest.setupExpandedStatusBar() + underTest.setDragDownHelper(dragDownHelper) interactionEventHandlerCaptor = ArgumentCaptor.forClass(InteractionEventHandler::class.java) verify(view).setInteractionEventHandler(interactionEventHandlerCaptor.capture()) @@ -347,9 +353,8 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { testScope.runTest { // GIVEN touch dispatcher in a state that returns true underTest.setStatusBarViewController(phoneStatusBarViewController) - whenever(keyguardUnlockAnimationController.isPlayingCannedUnlockAnimation()).thenReturn( - true - ) + whenever(keyguardUnlockAnimationController.isPlayingCannedUnlockAnimation()) + .thenReturn(true) assertThat(interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)).isTrue() // WHEN launch animation is running for 2 seconds @@ -381,6 +386,32 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { } @Test + fun shouldInterceptTouchEvent_notificationPanelViewControllerShouldIntercept() { + // GIVEN not dozing + whenever(sysuiStatusBarStateController.isDozing()).thenReturn(false) + // AND alternate bouncer doesn't want the touch + whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT)) + .thenReturn(false) + // AND the lock icon doesn't want the touch + whenever(lockIconViewController.onInterceptTouchEvent(DOWN_EVENT)).thenReturn(false) + // AND the notification panel can accept touches + whenever(notificationPanelViewController.isFullyExpanded()).thenReturn(true) + whenever(dragDownHelper.isDragDownEnabled).thenReturn(true) + whenever(centralSurfaces.isBouncerShowing()).thenReturn(false) + + // AND the drag down helper doesn't want the touch (to pull the shade down) + whenever(dragDownHelper.onInterceptTouchEvent(DOWN_EVENT)).thenReturn(false) + + featureFlags.set(Flags.MIGRATE_NSSL, true) + + // WHEN asked if should intercept touch + interactionEventHandler.shouldInterceptTouchEvent(DOWN_EVENT) + + // Verify that NPVC gets a chance to use the touch + verify(notificationPanelViewController).handleExternalInterceptTouch(DOWN_EVENT) + } + + @Test fun testGetKeyguardMessageArea() = testScope.runTest { underTest.keyguardMessageArea diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt index 3031658d3bcc..04c4b45251f2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt @@ -164,6 +164,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { featureFlags.set(Flags.SPLIT_SHADE_SUBPIXEL_OPTIMIZATION, true) featureFlags.set(Flags.REVAMPED_BOUNCER_MESSAGES, true) featureFlags.set(Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false) + featureFlags.set(Flags.MIGRATE_NSSL, false) testScope = TestScope() controller = NotificationShadeWindowViewController( diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt index d4b69fad6097..342b1c5b1ad2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt @@ -623,6 +623,7 @@ class ShadeInteractorTest : SysuiTestCase() { fromScene = SceneKey.Lockscreen, toScene = key, progress = progress, + isUserInputDriven = false, ) ) sceneInteractor.setTransitionState(transitionState) @@ -659,6 +660,7 @@ class ShadeInteractorTest : SysuiTestCase() { fromScene = key, toScene = SceneKey.Lockscreen, progress = progress, + isUserInputDriven = false, ) ) sceneInteractor.setTransitionState(transitionState) @@ -694,6 +696,7 @@ class ShadeInteractorTest : SysuiTestCase() { fromScene = SceneKey.Lockscreen, toScene = SceneKey.Shade, progress = progress, + isUserInputDriven = false, ) ) sceneInteractor.setTransitionState(transitionState) @@ -936,4 +939,192 @@ class ShadeInteractorTest : SysuiTestCase() { // THEN user is not interacting assertThat(actual).isFalse() } + @Test + fun userInteracting_idle() = + testScope.runTest() { + // GIVEN an interacting flow based on transitions to and from a scene + val key = SceneKey.Shade + val interactingFlow = underTest.sceneBasedInteracting(sceneInteractor, key) + val interacting by collectLastValue(interactingFlow) + + // WHEN transition state is idle + val transitionState = + MutableStateFlow<ObservableTransitionState>(ObservableTransitionState.Idle(key)) + sceneInteractor.setTransitionState(transitionState) + + // THEN interacting is false + assertThat(interacting).isFalse() + } + + @Test + fun userInteracting_transitioning_toScene_programmatic() = + testScope.runTest() { + // GIVEN an interacting flow based on transitions to and from a scene + val key = SceneKey.QuickSettings + val interactingFlow = underTest.sceneBasedInteracting(sceneInteractor, key) + val interacting by collectLastValue(interactingFlow) + + // WHEN transition state is starting to move to the scene + val progress = MutableStateFlow(0f) + val transitionState = + MutableStateFlow<ObservableTransitionState>( + ObservableTransitionState.Transition( + fromScene = SceneKey.Lockscreen, + toScene = key, + progress = progress, + isUserInputDriven = false, + ) + ) + sceneInteractor.setTransitionState(transitionState) + + // THEN interacting is false + assertThat(interacting).isFalse() + + // WHEN transition state is partially to the scene + progress.value = .4f + + // THEN interacting is false + assertThat(interacting).isFalse() + + // WHEN transition completes + progress.value = 1f + + // THEN interacting is false + assertThat(interacting).isFalse() + } + + @Test + fun userInteracting_transitioning_toScene_userInputDriven() = + testScope.runTest() { + // GIVEN an interacting flow based on transitions to and from a scene + val key = SceneKey.QuickSettings + val interactingFlow = underTest.sceneBasedInteracting(sceneInteractor, key) + val interacting by collectLastValue(interactingFlow) + + // WHEN transition state is starting to move to the scene + val progress = MutableStateFlow(0f) + val transitionState = + MutableStateFlow<ObservableTransitionState>( + ObservableTransitionState.Transition( + fromScene = SceneKey.Lockscreen, + toScene = key, + progress = progress, + isUserInputDriven = true, + ) + ) + sceneInteractor.setTransitionState(transitionState) + + // THEN interacting is true + assertThat(interacting).isTrue() + + // WHEN transition state is partially to the scene + progress.value = .4f + + // THEN interacting is true + assertThat(interacting).isTrue() + + // WHEN transition completes + progress.value = 1f + + // THEN interacting is true + assertThat(interacting).isTrue() + } + + @Test + fun userInteracting_transitioning_fromScene_programmatic() = + testScope.runTest() { + // GIVEN an interacting flow based on transitions to and from a scene + val key = SceneKey.QuickSettings + val interactingFlow = underTest.sceneBasedInteracting(sceneInteractor, key) + val interacting by collectLastValue(interactingFlow) + + // WHEN transition state is starting to move to the scene + val progress = MutableStateFlow(0f) + val transitionState = + MutableStateFlow<ObservableTransitionState>( + ObservableTransitionState.Transition( + fromScene = key, + toScene = SceneKey.Lockscreen, + progress = progress, + isUserInputDriven = false, + ) + ) + sceneInteractor.setTransitionState(transitionState) + + // THEN interacting is false + assertThat(interacting).isFalse() + + // WHEN transition state is partially to the scene + progress.value = .4f + + // THEN interacting is false + assertThat(interacting).isFalse() + + // WHEN transition completes + progress.value = 1f + + // THEN interacting is false + assertThat(interacting).isFalse() + } + + @Test + fun userInteracting_transitioning_fromScene_userInputDriven() = + testScope.runTest() { + // GIVEN an interacting flow based on transitions to and from a scene + val key = SceneKey.QuickSettings + val interactingFlow = underTest.sceneBasedInteracting(sceneInteractor, key) + val interacting by collectLastValue(interactingFlow) + + // WHEN transition state is starting to move to the scene + val progress = MutableStateFlow(0f) + val transitionState = + MutableStateFlow<ObservableTransitionState>( + ObservableTransitionState.Transition( + fromScene = key, + toScene = SceneKey.Lockscreen, + progress = progress, + isUserInputDriven = true, + ) + ) + sceneInteractor.setTransitionState(transitionState) + + // THEN interacting is true + assertThat(interacting).isTrue() + + // WHEN transition state is partially to the scene + progress.value = .4f + + // THEN interacting is true + assertThat(interacting).isTrue() + + // WHEN transition completes + progress.value = 1f + + // THEN interacting is true + assertThat(interacting).isTrue() + } + + @Test + fun userInteracting_transitioning_toAndFromDifferentScenes() = + testScope.runTest() { + // GIVEN an interacting flow based on transitions to and from a scene + val interactingFlow = underTest.sceneBasedInteracting(sceneInteractor, SceneKey.Shade) + val interacting by collectLastValue(interactingFlow) + + // WHEN transition state is starting to between different scenes + val progress = MutableStateFlow(0f) + val transitionState = + MutableStateFlow<ObservableTransitionState>( + ObservableTransitionState.Transition( + fromScene = SceneKey.Lockscreen, + toScene = SceneKey.QuickSettings, + progress = progress, + isUserInputDriven = true, + ) + ) + sceneInteractor.setTransitionState(transitionState) + + // THEN interacting is false + assertThat(interacting).isFalse() + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt index a09e844c739f..0925858d740d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt @@ -83,7 +83,8 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.QuickSettings, - progress = MutableStateFlow(0.5f) + progress = MutableStateFlow(0.5f), + isUserInputDriven = false, ) ) ) @@ -100,7 +101,8 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { ObservableTransitionState.Transition( fromScene = SceneKey.QuickSettings, toScene = SceneKey.Shade, - progress = MutableStateFlow(0.5f) + progress = MutableStateFlow(0.5f), + isUserInputDriven = false, ) ) ) @@ -117,7 +119,8 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { ObservableTransitionState.Transition( fromScene = SceneKey.Gone, toScene = SceneKey.Shade, - progress = MutableStateFlow(0.5f) + progress = MutableStateFlow(0.5f), + isUserInputDriven = false, ) ) ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java index 88d853e244e0..8f06e636b479 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java @@ -181,29 +181,30 @@ public class PluginInstanceTest extends SysuiTestCase { String ACTION = "testAction"; } - public void assertInstances(Integer allocated, Integer created) { - // Run the garbage collector to finalize and deallocate outstanding - // instances. Since the GC doesn't always appear to want to run - // completely when we ask, we ask it 10 times in a short loop. - for (int i = 0; i < 10; i++) { + private void assertInstances(int allocated, int created) { + // If there are more than the expected number of allocated instances, then we run the + // garbage collector to finalize and deallocate any outstanding non-referenced instances. + // Since the GC doesn't always appear to want to run completely when we ask, we do this up + // to 10 times before failing the test. + for (int i = 0; mCounter.getAllocatedInstances() > allocated && i < 10; i++) { System.runFinalization(); System.gc(); } - mCounter.assertInstances(allocated, created); + assertEquals(allocated, mCounter.getAllocatedInstances()); + assertEquals(created, mCounter.getCreatedInstances()); } public static class RefCounter { public final AtomicInteger mAllocatedInstances = new AtomicInteger(); public final AtomicInteger mCreatedInstances = new AtomicInteger(); - public void assertInstances(Integer allocated, Integer created) { - if (allocated != null) { - assertEquals(allocated.intValue(), mAllocatedInstances.get()); - } - if (created != null) { - assertEquals(created.intValue(), mCreatedInstances.get()); - } + public int getAllocatedInstances() { + return mAllocatedInstances.get(); + } + + public int getCreatedInstances() { + return mCreatedInstances.get(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt new file mode 100644 index 000000000000..bc62e5cf6ad9 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/data/repository/FakeStatusBarModeRepository.kt @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2023 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.statusbar.data.repository + +import kotlinx.coroutines.flow.MutableStateFlow + +class FakeStatusBarModeRepository : StatusBarModeRepository { + override val isTransientShown = MutableStateFlow(false) + + override fun showTransient() { + isTransientShown.value = true + } + override fun clearTransient() { + isTransientShown.value = false + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepositoryImplTest.kt new file mode 100644 index 000000000000..fa018fdc2bb1 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepositoryImplTest.kt @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2023 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.statusbar.data.repository + +import android.view.WindowInsets +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.statusbar.CommandQueue +import com.android.systemui.util.mockito.argumentCaptor +import com.android.systemui.util.mockito.mock +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.mockito.Mockito.verify + +@SmallTest +class StatusBarModeRepositoryImplTest : SysuiTestCase() { + private val commandQueue = mock<CommandQueue>() + + private val underTest = + StatusBarModeRepositoryImpl( + DISPLAY_ID, + commandQueue, + ) + .apply { this.start() } + + private val commandQueueCallback: CommandQueue.Callbacks + get() { + val callbackCaptor = argumentCaptor<CommandQueue.Callbacks>() + verify(commandQueue).addCallback(callbackCaptor.capture()) + return callbackCaptor.value + } + + @Test + fun isTransientShown_commandQueueShow_wrongDisplayId_notUpdated() { + commandQueueCallback.showTransient( + DISPLAY_ID + 1, + WindowInsets.Type.statusBars(), + /* isGestureOnSystemBar= */ false, + ) + + assertThat(underTest.isTransientShown.value).isFalse() + } + + @Test + fun isTransientShown_commandQueueShow_notStatusBarType_notUpdated() { + commandQueueCallback.showTransient( + DISPLAY_ID, + WindowInsets.Type.navigationBars(), + /* isGestureOnSystemBar= */ false, + ) + + assertThat(underTest.isTransientShown.value).isFalse() + } + + @Test + fun isTransientShown_commandQueueShow_true() { + commandQueueCallback.showTransient( + DISPLAY_ID, + WindowInsets.Type.statusBars(), + /* isGestureOnSystemBar= */ false, + ) + + assertThat(underTest.isTransientShown.value).isTrue() + } + + @Test + fun isTransientShown_commandQueueShow_statusBarAndOtherTypes_true() { + commandQueueCallback.showTransient( + DISPLAY_ID, + WindowInsets.Type.statusBars().or(WindowInsets.Type.navigationBars()), + /* isGestureOnSystemBar= */ false, + ) + + assertThat(underTest.isTransientShown.value).isTrue() + } + + @Test + fun isTransientShown_commandQueueAbort_wrongDisplayId_notUpdated() { + // Start as true + commandQueueCallback.showTransient( + DISPLAY_ID, + WindowInsets.Type.statusBars(), + /* isGestureOnSystemBar= */ false, + ) + assertThat(underTest.isTransientShown.value).isTrue() + + // GIVEN the wrong display ID + commandQueueCallback.abortTransient(DISPLAY_ID + 1, WindowInsets.Type.statusBars()) + + // THEN the old value remains + assertThat(underTest.isTransientShown.value).isTrue() + } + + @Test + fun isTransientShown_commandQueueAbort_notStatusBarType_notUpdated() { + // Start as true + commandQueueCallback.showTransient( + DISPLAY_ID, + WindowInsets.Type.statusBars(), + /* isGestureOnSystemBar= */ false, + ) + assertThat(underTest.isTransientShown.value).isTrue() + + // GIVEN the wrong type + commandQueueCallback.abortTransient(DISPLAY_ID, WindowInsets.Type.navigationBars()) + + // THEN the old value remains + assertThat(underTest.isTransientShown.value).isTrue() + } + + @Test + fun isTransientShown_commandQueueAbort_false() { + // Start as true + commandQueueCallback.showTransient( + DISPLAY_ID, + WindowInsets.Type.statusBars(), + /* isGestureOnSystemBar= */ false, + ) + assertThat(underTest.isTransientShown.value).isTrue() + + commandQueueCallback.abortTransient(DISPLAY_ID, WindowInsets.Type.statusBars()) + + assertThat(underTest.isTransientShown.value).isFalse() + } + + @Test + fun isTransientShown_commandQueueAbort_statusBarAndOtherTypes_false() { + // Start as true + commandQueueCallback.showTransient( + DISPLAY_ID, + WindowInsets.Type.statusBars(), + /* isGestureOnSystemBar= */ false, + ) + assertThat(underTest.isTransientShown.value).isTrue() + + commandQueueCallback.abortTransient( + DISPLAY_ID, + WindowInsets.Type.statusBars().or(WindowInsets.Type.captionBar()), + ) + + assertThat(underTest.isTransientShown.value).isFalse() + } + + @Test + fun isTransientShown_showTransient_true() { + underTest.showTransient() + + assertThat(underTest.isTransientShown.value).isTrue() + } + + @Test + fun isTransientShown_clearTransient_false() { + // Start as true + commandQueueCallback.showTransient( + DISPLAY_ID, + WindowInsets.Type.statusBars(), + /* isGestureOnSystemBar= */ false, + ) + assertThat(underTest.isTransientShown.value).isTrue() + + underTest.clearTransient() + + assertThat(underTest.isTransientShown.value).isFalse() + } + + private companion object { + const val DISPLAY_ID = 5 + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index 6b944aed9368..26c0fd695b95 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -82,6 +82,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.testing.FakeMetricsLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.TestScopeProvider; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.InitController; import com.android.systemui.R; @@ -145,6 +146,7 @@ import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.core.StatusBarInitializer; +import com.android.systemui.statusbar.data.repository.FakeStatusBarModeRepository; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.NotificationActivityStarter; @@ -177,6 +179,7 @@ import com.android.systemui.statusbar.window.StatusBarWindowStateController; import com.android.systemui.util.WallpaperController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.concurrency.MessageRouterImpl; +import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.volume.VolumeComponent; import com.android.wm.shell.bubbles.Bubbles; @@ -452,6 +455,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { emptySet()), mStatusBarWindowController, mStatusBarWindowStateController, + new FakeStatusBarModeRepository(), mKeyguardUpdateMonitor, mStatusBarSignalPolicy, mPulseExpansionHandler, @@ -470,6 +474,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { new DisplayMetrics(), mMetricsLogger, mShadeLogger, + new JavaAdapter(TestScopeProvider.getTestScope()), mUiBgExecutor, mNotificationPanelViewController, mNotificationMediaManager, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt index 711e4ac937cc..6430856291b3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt @@ -84,7 +84,6 @@ class OngoingCallControllerTest : SysuiTestCase() { private lateinit var controller: OngoingCallController private lateinit var notifCollectionListener: NotifCollectionListener - @Mock private lateinit var mockOngoingCallFlags: OngoingCallFlags @Mock private lateinit var mockSwipeStatusBarAwayGestureHandler: SwipeStatusBarAwayGestureHandler @Mock private lateinit var mockOngoingCallListener: OngoingCallListener @@ -103,24 +102,22 @@ class OngoingCallControllerTest : SysuiTestCase() { } MockitoAnnotations.initMocks(this) - `when`(mockOngoingCallFlags.isStatusBarChipEnabled()).thenReturn(true) val notificationCollection = mock(CommonNotifCollection::class.java) controller = OngoingCallController( context, notificationCollection, - mockOngoingCallFlags, clock, mockActivityStarter, mainExecutor, mockIActivityManager, OngoingCallLogger(uiEventLoggerFake), DumpManager(), - Optional.of(mockStatusBarWindowController), - Optional.of(mockSwipeStatusBarAwayGestureHandler), + mockStatusBarWindowController, + mockSwipeStatusBarAwayGestureHandler, mockStatusBarStateController, ) - controller.init() + controller.start() controller.addCallback(mockOngoingCallListener) controller.setChipView(chipView) @@ -494,42 +491,7 @@ class OngoingCallControllerTest : SysuiTestCase() { } @Test - fun fullscreenIsTrue_thenCallNotificationAdded_chipNotClickable() { - `when`(mockOngoingCallFlags.isInImmersiveChipTapEnabled()).thenReturn(false) - - getStateListener().onFullscreenStateChanged(/* isFullscreen= */ true) - notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) - - assertThat(chipView.hasOnClickListeners()).isFalse() - } - - @Test - fun callNotificationAdded_thenFullscreenIsTrue_chipNotClickable() { - `when`(mockOngoingCallFlags.isInImmersiveChipTapEnabled()).thenReturn(false) - - notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) - getStateListener().onFullscreenStateChanged(/* isFullscreen= */ true) - - assertThat(chipView.hasOnClickListeners()).isFalse() - } - - @Test - fun fullscreenChangesToFalse_chipClickable() { - `when`(mockOngoingCallFlags.isInImmersiveChipTapEnabled()).thenReturn(false) - - notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) - // First, update to true - getStateListener().onFullscreenStateChanged(/* isFullscreen= */ true) - // Then, update to false - getStateListener().onFullscreenStateChanged(/* isFullscreen= */ false) - - assertThat(chipView.hasOnClickListeners()).isTrue() - } - - @Test - fun fullscreenIsTrue_butChipClickInImmersiveEnabled_chipClickable() { - `when`(mockOngoingCallFlags.isInImmersiveChipTapEnabled()).thenReturn(true) - + fun fullscreenIsTrue_chipStillClickable() { notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) getStateListener().onFullscreenStateChanged(/* isFullscreen= */ true) diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 838aae8a83c0..cd879083927f 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -112,7 +112,14 @@ public abstract class PackageManagerInternal { */ public static final int INTEGRITY_VERIFICATION_REJECT = 0; - /** Observer called whenever the list of packages changes */ + /** + * Observer called whenever the list of packages changes. + * + * @deprecated please use {@link com.android.internal.content.PackageMonitor} instead. + * PackageMonitor covers more installation and uninstallation corner cases than + * PackageListObserver. + */ + @Deprecated public interface PackageListObserver { /** A package was added to the system. */ default void onPackageAdded(@NonNull String packageName, int uid) {} @@ -723,7 +730,12 @@ public abstract class PackageManagerInternal { * notified if a package is updated. * <p>The package list will not be updated automatically as packages are * installed / uninstalled. Any changes must be handled within the observer. + * + * @deprecated please use {@link com.android.internal.content.PackageMonitor} instead. + * PackageMonitor covers more installation and uninstallation corner cases than + * PackageListObserver. */ + @Deprecated public abstract @NonNull PackageList getPackageList(@Nullable PackageListObserver observer); /** @@ -733,7 +745,12 @@ public abstract class PackageManagerInternal { * <p>Does nothing if the observer isn't currently registered. * <p>Observers are notified asynchronously and it's possible for an observer to be * invoked after its been removed. + * + * @deprecated please use {@link com.android.internal.content.PackageMonitor} instead. + * PackageMonitor covers more installation and uninstallation corner cases than + * PackageListObserver. */ + @Deprecated public abstract void removePackageListObserver(@NonNull PackageListObserver observer); /** diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 93fe0c9c18c3..553b08501925 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -97,6 +97,11 @@ import static android.os.Process.SYSTEM_UID; import static android.os.Process.ZYGOTE_POLICY_FLAG_EMPTY; import static com.android.internal.messages.nano.SystemMessageProto.SystemMessage.NOTE_FOREGROUND_SERVICE_BG_LAUNCH; +import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_DELEGATE; +import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA; +import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NONE; +import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_START_FOREGROUND_SERVICE; +import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_START_SERVICE; import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__DENIED; import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER; import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__EXIT; @@ -122,6 +127,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; import android.Manifest; +import android.Manifest.permission; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -901,7 +907,10 @@ public final class ActiveServices { showFgsBgRestrictedNotificationLocked(r); logFGSStateChangeLocked(r, FOREGROUND_SERVICE_STATE_CHANGED__STATE__DENIED, - 0, FGS_STOP_REASON_UNKNOWN, FGS_TYPE_POLICY_CHECK_UNKNOWN); + 0, FGS_STOP_REASON_UNKNOWN, FGS_TYPE_POLICY_CHECK_UNKNOWN, + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA, + false /* fgsRestrictionRecalculated */ + ); if (CompatChanges.isChangeEnabled(FGS_START_EXCEPTION_CHANGE_ID, callingUid)) { throw new ForegroundServiceStartNotAllowedException(msg); } @@ -2066,6 +2075,7 @@ public final class ActiveServices { boolean alreadyStartedOp = false; boolean stopProcStatsOp = false; + final boolean origFgRequired = r.fgRequired; if (r.fgRequired) { if (DEBUG_SERVICE || DEBUG_BACKGROUND_CHECK) { Slog.i(TAG, "Service called startForeground() as required: " + r); @@ -2117,6 +2127,9 @@ public final class ActiveServices { // Whether to extend the SHORT_SERVICE time out. boolean extendShortServiceTimeout = false; + // Whether setFgsRestrictionLocked() is called in here. Only used for logging. + boolean fgsRestrictionRecalculated = false; + int fgsTypeCheckCode = FGS_TYPE_POLICY_CHECK_UNKNOWN; if (!ignoreForeground) { if (foregroundServiceType == FOREGROUND_SERVICE_TYPE_SHORT_SERVICE @@ -2182,6 +2195,7 @@ public final class ActiveServices { r.appInfo.uid, r.intent.getIntent(), r, r.userId, BackgroundStartPrivileges.NONE, false /* isBindService */); + fgsRestrictionRecalculated = true; if (!r.isFgsAllowedStart()) { Slog.w(TAG_SERVICE, "FGS type change to/from SHORT_SERVICE: " + " BFSL DENIED."); @@ -2246,6 +2260,7 @@ public final class ActiveServices { r.appInfo.uid, r.intent.getIntent(), r, r.userId, BackgroundStartPrivileges.NONE, false /* isBindService */); + fgsRestrictionRecalculated = true; final String temp = "startForegroundDelayMs:" + delayMs; if (r.mInfoAllowStartForeground != null) { r.mInfoAllowStartForeground += "; " + temp; @@ -2266,6 +2281,25 @@ public final class ActiveServices { r.appInfo.uid, r.intent.getIntent(), r, r.userId, BackgroundStartPrivileges.NONE, false /* isBindService */); + fgsRestrictionRecalculated = true; + } + + // When startForeground() is called on a bound service, without having + // it started (i.e. no Context.startService() or startForegroundService() was + // called.) + // called on it, then we probably didn't call setFgsRestrictionLocked() + // in startService(). If fgsRestrictionRecalculated is false, then we + // didn't call setFgsRestrictionLocked() here either. + // + // In this situation, we call setFgsRestrictionLocked() with + // forBoundFgs = false, so we'd set the FGS allowed reason to the + // by-bindings fields, so we can put it in the log, without affecting the + // logic. + if (!fgsRestrictionRecalculated && !r.startRequested) { + setFgsRestrictionLocked(r.serviceInfo.packageName, r.app.getPid(), + r.appInfo.uid, r.intent.getIntent(), r, r.userId, + BackgroundStartPrivileges.NONE, + false /* isBindService */, true /* forBoundFgs */); } // If the foreground service is not started from TOP process, do not allow it to @@ -2291,7 +2325,10 @@ public final class ActiveServices { ignoreForeground = true; logFGSStateChangeLocked(r, FOREGROUND_SERVICE_STATE_CHANGED__STATE__DENIED, - 0, FGS_STOP_REASON_UNKNOWN, FGS_TYPE_POLICY_CHECK_UNKNOWN); + 0, FGS_STOP_REASON_UNKNOWN, FGS_TYPE_POLICY_CHECK_UNKNOWN, + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA, + false /* fgsRestrictionRecalculated */ + ); if (CompatChanges.isChangeEnabled(FGS_START_EXCEPTION_CHANGE_ID, r.appInfo.uid)) { throw new ForegroundServiceStartNotAllowedException(msg); @@ -2331,7 +2368,10 @@ public final class ActiveServices { if (fgsTypeResult.second != null) { logFGSStateChangeLocked(r, FOREGROUND_SERVICE_STATE_CHANGED__STATE__DENIED, - 0, FGS_STOP_REASON_UNKNOWN, fgsTypeResult.first); + 0, FGS_STOP_REASON_UNKNOWN, fgsTypeResult.first, + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA, + false /* fgsRestrictionRecalculated */ + ); throw fgsTypeResult.second; } } @@ -2403,9 +2443,24 @@ public final class ActiveServices { AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE); registerAppOpCallbackLocked(r); mAm.updateForegroundServiceUsageStats(r.name, r.userId, true); + + int fgsStartApi = FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NONE; + if (r.startRequested) { + if (origFgRequired) { + fgsStartApi = + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_START_FOREGROUND_SERVICE; + } else { + fgsStartApi = + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_START_SERVICE; + } + } + logFGSStateChangeLocked(r, FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER, - 0, FGS_STOP_REASON_UNKNOWN, fgsTypeCheckCode); + 0, FGS_STOP_REASON_UNKNOWN, fgsTypeCheckCode, + fgsStartApi, + fgsRestrictionRecalculated + ); synchronized (mFGSLogger) { mFGSLogger.logForegroundServiceStart(r.appInfo.uid, 0, r); } @@ -2499,7 +2554,10 @@ public final class ActiveServices { r.mFgsExitTime > r.mFgsEnterTime ? (int) (r.mFgsExitTime - r.mFgsEnterTime) : 0, FGS_STOP_REASON_STOP_FOREGROUND, - FGS_TYPE_POLICY_CHECK_UNKNOWN); + FGS_TYPE_POLICY_CHECK_UNKNOWN, + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA, + false /* fgsRestrictionRecalculated */ + ); synchronized (mFGSLogger) { mFGSLogger.logForegroundServiceStop(r.appInfo.uid, r); @@ -3338,7 +3396,10 @@ public final class ActiveServices { FOREGROUND_SERVICE_STATE_CHANGED__STATE__TIMED_OUT, nowUptime > sr.mFgsEnterTime ? (int) (nowUptime - sr.mFgsEnterTime) : 0, FGS_STOP_REASON_UNKNOWN, - FGS_TYPE_POLICY_CHECK_UNKNOWN); + FGS_TYPE_POLICY_CHECK_UNKNOWN, + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA, + false /* fgsRestrictionRecalculated */ + ); try { sr.app.getThread().scheduleTimeoutService(sr, sr.getShortFgsInfo().getStartId()); } catch (RemoteException e) { @@ -5705,7 +5766,10 @@ public final class ActiveServices { r.mFgsExitTime > r.mFgsEnterTime ? (int) (r.mFgsExitTime - r.mFgsEnterTime) : 0, FGS_STOP_REASON_STOP_SERVICE, - FGS_TYPE_POLICY_CHECK_UNKNOWN); + FGS_TYPE_POLICY_CHECK_UNKNOWN, + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA, + false /* fgsRestrictionRecalculated */ + ); synchronized (mFGSLogger) { mFGSLogger.logForegroundServiceStop(r.appInfo.uid, r); } @@ -7452,6 +7516,13 @@ public final class ActiveServices { } } + private void setFgsRestrictionLocked(String callingPackage, + int callingPid, int callingUid, Intent intent, ServiceRecord r, int userId, + BackgroundStartPrivileges backgroundStartPrivileges, boolean isBindService) { + setFgsRestrictionLocked(callingPackage, callingPid, callingUid, intent, r, userId, + backgroundStartPrivileges, isBindService, /*forBoundFgs*/ false); + } + /** * There are two FGS restrictions: * In R, mAllowWhileInUsePermissionInFgs is to allow while-in-use permissions in foreground @@ -7463,11 +7534,14 @@ public final class ActiveServices { * @param intent intent to start/bind service. * @param r the service to start. * @param isBindService True if it's called from bindService(). + * @param forBoundFgs set to true if it's called from Service.startForeground() for a + * service that's not started but bound. * @return true if allow, false otherwise. */ private void setFgsRestrictionLocked(String callingPackage, int callingPid, int callingUid, Intent intent, ServiceRecord r, int userId, - BackgroundStartPrivileges backgroundStartPrivileges, boolean isBindService) { + BackgroundStartPrivileges backgroundStartPrivileges, boolean isBindService, + boolean forBoundFgs) { @ReasonCode int allowWIU; @ReasonCode int allowStart; @@ -7511,9 +7585,19 @@ public final class ActiveServices { r.mAllowWIUInBindService = allowWIU; r.mAllowStartInBindService = allowStart; } else { - r.mAllowWhileInUsePermissionInFgsReasonNoBinding = allowWIU; - r.mAllowStartForegroundNoBinding = allowStart; - + if (!forBoundFgs) { + // This is for "normal" situation. + r.mAllowWhileInUsePermissionInFgsReasonNoBinding = allowWIU; + r.mAllowStartForegroundNoBinding = allowStart; + } else { + // This logic is only for logging, so we only update the "by-binding" fields. + if (r.mAllowWIUByBindings == REASON_DENIED) { + r.mAllowWIUByBindings = allowWIU; + } + if (r.mAllowStartByBindings == REASON_DENIED) { + r.mAllowStartByBindings = allowStart; + } + } // Also do a binding client check, unless called from bindService(). if (r.mAllowWIUByBindings == REASON_DENIED) { r.mAllowWIUByBindings = @@ -8137,7 +8221,10 @@ public final class ActiveServices { */ private void logFGSStateChangeLocked(ServiceRecord r, int state, int durationMs, @FgsStopReason int fgsStopReason, - @ForegroundServicePolicyCheckCode int fgsTypeCheckCode) { + @ForegroundServicePolicyCheckCode int fgsTypeCheckCode, + int fgsStartApi, // from ForegroundServiceStateChanged.FgsStartApi + boolean fgsRestrictionRecalculated + ) { if (!ActivityManagerUtils.shouldSamplePackageForAtom( r.packageName, mAm.mConstants.mFgsAtomSampleRate)) { return; @@ -8194,7 +8281,9 @@ public final class ActiveServices { r.mAllowWIUByBindings, r.mAllowStartForegroundNoBinding, r.mAllowStartInBindService, - r.mAllowStartByBindings); + r.mAllowStartByBindings, + fgsStartApi, + fgsRestrictionRecalculated); int event = 0; if (state == FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER) { @@ -8373,7 +8462,10 @@ public final class ActiveServices { } logFGSStateChangeLocked(r, FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER, - 0, FGS_STOP_REASON_UNKNOWN, FGS_TYPE_POLICY_CHECK_UNKNOWN); + 0, FGS_STOP_REASON_UNKNOWN, FGS_TYPE_POLICY_CHECK_UNKNOWN, + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_DELEGATE, + false /* fgsRestrictionRecalculated */ + ); // Notify the caller. if (connection != null) { mAm.mHandler.post(() -> { diff --git a/services/core/java/com/android/server/am/AnrTimer.java b/services/core/java/com/android/server/am/AnrTimer.java index cd6f009a4106..378a38602211 100644 --- a/services/core/java/com/android/server/am/AnrTimer.java +++ b/services/core/java/com/android/server/am/AnrTimer.java @@ -38,11 +38,13 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.Keep; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.ProcessCpuTracker; +import com.android.internal.util.RingBuffer; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; @@ -75,7 +77,7 @@ import java.util.concurrent.atomic.AtomicInteger; * * @hide */ -abstract class AnrTimer<V> { +class AnrTimer<V> { /** * The log tag. @@ -139,6 +141,8 @@ abstract class AnrTimer<V> { final String tag; /** A partial stack that localizes the caller of the operation. */ final StackTraceElement[] stack; + /** The date, in local time, the error was created. */ + final String date; Error(@NonNull String issue, @NonNull String operation, @NonNull String tag, @NonNull StackTraceElement[] stack, @NonNull String arg) { @@ -147,21 +151,17 @@ abstract class AnrTimer<V> { this.tag = tag; this.stack = stack; this.arg = arg; + this.date = new Date().toString(); } } /** * A list of errors detected during processing. Errors correspond to "timer not found" * conditions. The stack trace identifies the source of the call. The list is - * first-in/first-out, and the size is limited to MAX_SAVED_ERROR_COUNT. + * first-in/first-out, and the size is limited to 20. */ @GuardedBy("sErrors") - private static final ArrayList<Error> sErrors = new ArrayList<>(); - - /** - * The maximum number of errors that are saved in the sErrors list. - */ - private static final int MAX_SAVED_ERROR_COUNT = 20; + private static final RingBuffer<Error> sErrors = new RingBuffer<>(Error.class, 20); /** * A record of a single anr timer. The pid and uid are retained for reference but they do not @@ -420,7 +420,7 @@ abstract class AnrTimer<V> { if (extension > 0) { post(t, extension); } else { - onExpiredLocked(t, now()); + onExpiredLocked(t); } } return true; @@ -706,7 +706,7 @@ abstract class AnrTimer<V> { * The notifier that a timer has fired. The timer is not modified. */ @GuardedBy("mLock") - private void onExpiredLocked(@NonNull Timer timer, long when) { + private void onExpiredLocked(@NonNull Timer timer) { if (DEBUG) report(timer, "expire"); traceBegin(timer, "expired"); mHandler.sendMessage(Message.obtain(mHandler, mWhat, timer.arg)); @@ -757,12 +757,7 @@ abstract class AnrTimer<V> { // This should be enough to isolate the location of the call. StackTraceElement[] location = Arrays.copyOfRange(s, 6, 9); synchronized (sErrors) { - // Ensure the error list does not grow beyond the limit. - while (sErrors.size() >= MAX_SAVED_ERROR_COUNT) { - sErrors.remove(0); - } - // Add the new error to the list. - sErrors.add(new Error(errorMsg, operation, mLabel, location, what)); + sErrors.append(new Error(errorMsg, operation, mLabel, location, what)); } if (DEBUG) Log.w(TAG, operation + " " + errorMsg + " " + mLabel + " timer " + what); mTotalErrors++; @@ -790,6 +785,7 @@ abstract class AnrTimer<V> { private static void dump(IndentingPrintWriter ipw, int seq, Error err) { ipw.format("%2d: op:%s tag:%s issue:%s arg:%s\n", seq, err.operation, err.tag, err.issue, err.arg); + ipw.format(" date:%s\n", err.date); ipw.increaseIndent(); for (int i = 0; i < err.stack.length; i++) { ipw.println(" " + err.stack[i].toString()); @@ -801,15 +797,15 @@ abstract class AnrTimer<V> { * Dump all errors to the output stream. */ private static void dumpErrors(IndentingPrintWriter ipw) { - ArrayList<Error> errors; + Error errors[]; synchronized (sErrors) { if (sErrors.size() == 0) return; - errors = (ArrayList<Error>) sErrors.clone(); + errors = sErrors.toArray(); } ipw.println("Errors"); ipw.increaseIndent(); - for (int i = 0; i < errors.size(); i++) { - dump(ipw, i, errors.get(i)); + for (int i = 0; i < errors.length; i++) { + if (errors[i] != null) dump(ipw, i, errors[i]); } ipw.decreaseIndent(); } diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java index c35a3b2474aa..5d31d1545b8d 100644 --- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java +++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java @@ -1347,8 +1347,8 @@ class BroadcastProcessQueue { * Set the timeout flag to indicate that an ANR timer has been started. A value of true means a * timer is running; a value of false means there is no timer running. */ - void setTimeoutScheduled(boolean timeoutStarted) { - mTimeoutScheduled = timeoutStarted; + void setTimeoutScheduled(boolean timeoutScheduled) { + mTimeoutScheduled = timeoutScheduled; } /** diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index 6a41628601b4..a3dac6dc3404 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -1183,7 +1183,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } private class BroadcastAnrTimer extends AnrTimer<BroadcastProcessQueue> { - BroadcastAnrTimer(Handler handler) { + BroadcastAnrTimer(@NonNull Handler handler) { super(Objects.requireNonNull(handler), MSG_DELIVERY_TIMEOUT, "BROADCAST_TIMEOUT", true); } diff --git a/services/core/java/com/android/server/am/ForegroundServiceTypeLoggerModule.java b/services/core/java/com/android/server/am/ForegroundServiceTypeLoggerModule.java index f6859d1f027e..e0a71d46641a 100644 --- a/services/core/java/com/android/server/am/ForegroundServiceTypeLoggerModule.java +++ b/services/core/java/com/android/server/am/ForegroundServiceTypeLoggerModule.java @@ -27,6 +27,8 @@ import static android.app.ActivityManager.FOREGROUND_SERVICE_API_TYPE_PHONE_CALL import static android.app.ActivityManager.FOREGROUND_SERVICE_API_TYPE_USB; import static android.os.Process.INVALID_UID; +import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA; + import android.annotation.IntDef; import android.app.ActivityManager; import android.app.ActivityManager.ForegroundServiceApiType; @@ -520,7 +522,10 @@ public class ForegroundServiceTypeLoggerModule { r.mAllowWIUByBindings, r.mAllowStartForegroundNoBinding, r.mAllowStartInBindService, - r.mAllowStartByBindings); + r.mAllowStartByBindings, + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA, + false + ); } /** @@ -578,7 +583,10 @@ public class ForegroundServiceTypeLoggerModule { 0, 0, 0, - 0); + 0, + FOREGROUND_SERVICE_STATE_CHANGED__FGS_START_API__FGSSTARTAPI_NA, + false + ); } /** diff --git a/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java b/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java index 6edbfb7752a1..4df25811cc99 100644 --- a/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java +++ b/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java @@ -57,6 +57,7 @@ public class AuthenticationStatsCollector { @NonNull private final FaceManager mFaceManager; @NonNull private final FingerprintManager mFingerprintManager; + private final boolean mEnabled; private final float mThreshold; private final int mModality; @@ -80,6 +81,7 @@ public class AuthenticationStatsCollector { public AuthenticationStatsCollector(@NonNull Context context, int modality, @NonNull BiometricNotification biometricNotification) { mContext = context; + mEnabled = context.getResources().getBoolean(R.bool.config_biometricFrrNotificationEnabled); mThreshold = context.getResources() .getFraction(R.fraction.config_biometricNotificationFrrThreshold, 1, 1); mUserAuthenticationStatsMap = new HashMap<>(); @@ -110,6 +112,11 @@ public class AuthenticationStatsCollector { /** Update total authentication and rejected attempts. */ public void authenticate(int userId, boolean authenticated) { + // Don't collect data if the feature is disabled. + if (!mEnabled) { + return; + } + // Don't collect data for single-modality devices or user has both biometrics enrolled. if (isSingleModalityDevice() || (hasEnrolledFace(userId) && hasEnrolledFingerprint(userId))) { diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java index 85c140c67949..e14f7c09770f 100644 --- a/services/core/java/com/android/server/notification/PermissionHelper.java +++ b/services/core/java/com/android/server/notification/PermissionHelper.java @@ -16,7 +16,6 @@ package com.android.server.notification; -import static android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT; import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED; import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET; import static android.content.pm.PackageManager.GET_PERMISSIONS; @@ -203,7 +202,6 @@ public final class PermissionHelper { Context.DEVICE_ID_DEFAULT, userId, TAG); } int flagMask = FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED; - flagMask = userSet || !grant ? flagMask | FLAG_PERMISSION_GRANTED_BY_DEFAULT : flagMask; if (userSet) { mPermManager.updatePermissionFlags(packageName, NOTIFICATION_PERMISSION, flagMask, FLAG_PERMISSION_USER_SET, true, Context.DEVICE_ID_DEFAULT, userId); diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index 3639e1b9cb47..d2d6552a0c9c 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -661,6 +661,10 @@ final class LetterboxUiController { @ScreenOrientation int overrideOrientationIfNeeded(@ScreenOrientation int candidate) { if (shouldApplyUserFullscreenOverride()) { + Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate) + " for " + + mActivityRecord + " is overridden to " + + screenOrientationToString(SCREEN_ORIENTATION_USER) + + " by user aspect ratio settings."); return SCREEN_ORIENTATION_USER; } @@ -668,6 +672,14 @@ final class LetterboxUiController { // orientation. candidate = mActivityRecord.mWmService.mapOrientationRequest(candidate); + if (shouldApplyUserMinAspectRatioOverride() && !isFixedOrientation(candidate)) { + Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate) + " for " + + mActivityRecord + " is overridden to " + + screenOrientationToString(SCREEN_ORIENTATION_PORTRAIT) + + " by user aspect ratio settings."); + return SCREEN_ORIENTATION_PORTRAIT; + } + if (FALSE.equals(mBooleanPropertyAllowOrientationOverride)) { return candidate; } diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java index 82d39d6c6982..a4adf5866f3d 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java @@ -35,7 +35,7 @@ import android.credentials.CreateCredentialException; import android.credentials.CreateCredentialRequest; import android.credentials.CredentialOption; import android.credentials.CredentialProviderInfo; -import android.credentials.GetCandidateCredentialsRequest; +import android.credentials.GetCandidateCredentialsException; import android.credentials.GetCredentialException; import android.credentials.GetCredentialRequest; import android.credentials.IClearCredentialStateCallback; @@ -303,9 +303,9 @@ public final class CredentialManagerService ComponentName compName = ComponentName.unflattenFromString(serviceName); if (compName == null) { Slog.w( - TAG, - "Primary provider component name unflatten from string error: " - + serviceName); + TAG, + "Primary provider component name unflatten from string error: " + + serviceName); continue; } services.add(compName); @@ -474,13 +474,55 @@ public final class CredentialManagerService final class CredentialManagerServiceStub extends ICredentialManager.Stub { @Override public ICancellationSignal getCandidateCredentials( - GetCandidateCredentialsRequest request, + GetCredentialRequest request, IGetCandidateCredentialsCallback callback, final String callingPackage) { Slog.i(TAG, "starting getCandidateCredentials with callingPackage: " + callingPackage); - // TODO(): Implement - return CancellationSignal.createTransport(); + ICancellationSignal cancelTransport = CancellationSignal.createTransport(); + + final int userId = UserHandle.getCallingUserId(); + final int callingUid = Binder.getCallingUid(); + + // New request session, scoped for this request only. + final GetCandidateRequestSession session = + new GetCandidateRequestSession( + getContext(), + mSessionManager, + mLock, + userId, + callingUid, + callback, + request, + constructCallingAppInfo(callingPackage, userId, request.getOrigin()), + getEnabledProvidersForUser(userId), + CancellationSignal.fromTransport(cancelTransport) + ); + addSessionLocked(userId, session); + + List<ProviderSession> providerSessions = + initiateProviderSessions( + session, + request.getCredentialOptions().stream() + .map(CredentialOption::getType) + .collect(Collectors.toList())); + + if (providerSessions.isEmpty()) { + try { + callback.onError( + GetCandidateCredentialsException.TYPE_NO_CREDENTIAL, + "No credentials available on this device."); + } catch (RemoteException e) { + Slog.i( + TAG, + "Issue invoking onError on IGetCredentialCallback " + + "callback: " + + e.getMessage()); + } + } + + invokeProviderSessions(providerSessions); + return cancelTransport; } @Override @@ -737,7 +779,7 @@ public final class CredentialManagerService @Override public void setEnabledProviders( - List<String> primaryProviders, List<String> providers, int userId, + List<String> primaryProviders, List<String> providers, int userId, ISetEnabledProvidersCallback callback) { final int callingUid = Binder.getCallingUid(); if (!hasWriteSecureSettingsPermission()) { @@ -862,9 +904,9 @@ public final class CredentialManagerService ApiName.GET_CREDENTIAL_PROVIDER_SERVICES, ApiStatus.SUCCESS, callingUid); return CredentialProviderInfoFactory - .getCredentialProviderServices( - mContext, userId, providerFilter, getEnabledProvidersForUser(userId), - getPrimaryProvidersForUserId(mContext, userId)); + .getCredentialProviderServices( + mContext, userId, providerFilter, getEnabledProvidersForUser(userId), + getPrimaryProvidersForUserId(mContext, userId)); } @@ -894,13 +936,14 @@ public final class CredentialManagerService private Set<ComponentName> getEnabledProvidersForUser(int userId) { final int resolvedUserId = ActivityManager.handleIncomingUser( - Binder.getCallingPid(), Binder.getCallingUid(), - userId, false, false, - "getEnabledProvidersForUser", null); + Binder.getCallingPid(), Binder.getCallingUid(), + userId, false, false, + "getEnabledProvidersForUser", null); Set<ComponentName> enabledProviders = new HashSet<>(); String directValue = Settings.Secure.getStringForUser( - mContext.getContentResolver(), Settings.Secure.CREDENTIAL_SERVICE, resolvedUserId); + mContext.getContentResolver(), Settings.Secure.CREDENTIAL_SERVICE, + resolvedUserId); if (!TextUtils.isEmpty(directValue)) { String[] components = directValue.split(":"); diff --git a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java new file mode 100644 index 000000000000..6d9b7e824e28 --- /dev/null +++ b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java @@ -0,0 +1,157 @@ +/* + * 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.credentials; + +import android.annotation.Nullable; +import android.content.ComponentName; +import android.content.Context; +import android.credentials.CredentialProviderInfo; +import android.credentials.GetCandidateCredentialsException; +import android.credentials.GetCandidateCredentialsResponse; +import android.credentials.GetCredentialRequest; +import android.credentials.IGetCandidateCredentialsCallback; +import android.credentials.ui.GetCredentialProviderData; +import android.credentials.ui.ProviderData; +import android.credentials.ui.RequestInfo; +import android.os.CancellationSignal; +import android.os.RemoteException; +import android.service.credentials.CallingAppInfo; +import android.util.Slog; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** + * Central session for a single getCandidateCredentials request. This class listens to the + * responses from providers, and updates the provider(s) state. + */ +public class GetCandidateRequestSession extends RequestSession<GetCredentialRequest, + IGetCandidateCredentialsCallback, GetCandidateCredentialsResponse> + implements ProviderSession.ProviderInternalCallback<GetCandidateCredentialsResponse> { + private static final String TAG = "GetCandidateRequestSession"; + + public GetCandidateRequestSession( + Context context, SessionLifetime sessionCallback, + Object lock, int userId, int callingUid, + IGetCandidateCredentialsCallback callback, GetCredentialRequest request, + CallingAppInfo callingAppInfo, Set<ComponentName> enabledProviders, + CancellationSignal cancellationSignal) { + super(context, sessionCallback, lock, userId, callingUid, request, callback, + RequestInfo.TYPE_GET, callingAppInfo, enabledProviders, + cancellationSignal, 0L); + } + + /** + * Creates a new provider session, and adds it list of providers that are contributing to + * this session. + * + * @return the provider session created within this request session, for the given provider + * info. + */ + @Override + @Nullable + public ProviderSession initiateProviderSession(CredentialProviderInfo providerInfo, + RemoteCredentialService remoteCredentialService) { + ProviderGetSession providerGetCandidateSessions = ProviderGetSession + .createNewSession(mContext, mUserId, providerInfo, + this, remoteCredentialService); + if (providerGetCandidateSessions != null) { + Slog.d(TAG, "In startProviderSession - provider session created and " + + "being added for: " + providerInfo.getComponentName()); + mProviders.put(providerGetCandidateSessions.getComponentName().flattenToString(), + providerGetCandidateSessions); + } + return providerGetCandidateSessions; + } + + /** + * Even though there is no UI involved, this is called when all providers are ready + * in our current flow. Eventually can completely separate UI and non UI flows. + */ + @Override + protected void launchUiWithProviderData(ArrayList<ProviderData> providerDataList) { + if (providerDataList == null || providerDataList.isEmpty()) { + respondToClientWithErrorAndFinish( + GetCandidateCredentialsException.TYPE_NO_CREDENTIAL, + "No credentials found"); + return; + } + + List<GetCredentialProviderData> candidateProviderDataList = new ArrayList<>(); + for (ProviderData providerData : providerDataList) { + candidateProviderDataList.add((GetCredentialProviderData) (providerData)); + } + respondToClientWithResponseAndFinish(new GetCandidateCredentialsResponse( + candidateProviderDataList)); + } + + @Override + protected void invokeClientCallbackSuccess(GetCandidateCredentialsResponse response) + throws RemoteException { + mClientCallback.onResponse(response); + } + + @Override + protected void invokeClientCallbackError(String errorType, String errorMsg) + throws RemoteException { + mClientCallback.onError(errorType, errorMsg); + } + + @Override + public void onFinalErrorReceived(ComponentName componentName, String errorType, + String message) { + // Not applicable for session without UI + } + + @Override + public void onUiCancellation(boolean isUserCancellation) { + // Not applicable for session without UI + } + + @Override + public void onUiSelectorInvocationFailure() { + // Not applicable for session without UI + } + + @Override + public void onProviderStatusChanged(ProviderSession.Status status, + ComponentName componentName, ProviderSession.CredentialsSource source) { + Slog.d(TAG, "in onStatusChanged with status: " + status + ", and source: " + source); + + // For any other status, we check if all providers are done and then invoke UI if needed + if (!isAnyProviderPending()) { + // If all provider responses have been received, we can either need the UI, + // or we need to respond with error. The only other case is the entry being + // selected after the UI has been invoked which has a separate code path. + if (isUiInvocationNeeded()) { + Slog.d(TAG, "in onProviderStatusChanged - isUiInvocationNeeded"); + getProviderDataAndInitiateUi(); + } else { + respondToClientWithErrorAndFinish( + GetCandidateCredentialsException.TYPE_NO_CREDENTIAL, + "No credentials available"); + } + } + } + + @Override + public void onFinalResponseReceived(ComponentName componentName, + GetCandidateCredentialsResponse response) { + // Not applicable for session without UI + } +} diff --git a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java index 3c1432a320e7..3eb6718c0a95 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java @@ -119,6 +119,42 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential return null; } + /** Creates a new provider session to be used by the request session. */ + @Nullable + public static ProviderGetSession createNewSession( + Context context, + @UserIdInt int userId, + CredentialProviderInfo providerInfo, + GetCandidateRequestSession getRequestSession, + RemoteCredentialService remoteCredentialService) { + android.credentials.GetCredentialRequest filteredRequest = + filterOptions(providerInfo.getCapabilities(), + getRequestSession.mClientRequest, + providerInfo); + if (filteredRequest != null) { + Map<String, CredentialOption> beginGetOptionToCredentialOptionMap = + new HashMap<>(); + return new ProviderGetSession( + context, + providerInfo, + getRequestSession, + userId, + remoteCredentialService, + constructQueryPhaseRequest( + filteredRequest, getRequestSession.mClientAppInfo, + getRequestSession.mClientRequest.alwaysSendAppInfoToProvider(), + beginGetOptionToCredentialOptionMap), + filteredRequest, + getRequestSession.mClientAppInfo, + beginGetOptionToCredentialOptionMap, + getRequestSession.mHybridService + ); + } + Slog.i(TAG, "Unable to create provider session for: " + + providerInfo.getComponentName()); + return null; + } + private static BeginGetCredentialRequest constructQueryPhaseRequest( android.credentials.GetCredentialRequest filteredRequest, CallingAppInfo callingAppInfo, @@ -192,7 +228,7 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential public ProviderGetSession(Context context, CredentialProviderInfo info, - ProviderInternalCallback<GetCredentialResponse> callbacks, + ProviderInternalCallback callbacks, int userId, RemoteCredentialService remoteCredentialService, BeginGetCredentialRequest beginGetRequest, android.credentials.GetCredentialRequest completeGetRequest, diff --git a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyTest.kt b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyTest.kt index 3ab25479686d..3cf57a3cf57a 100644 --- a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyTest.kt +++ b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyTest.kt @@ -1445,6 +1445,192 @@ class AppIdPermissionPolicyTest { .isEqualTo(expectedNewFlags) } + @Test + fun testOnPackageAdded_runtimeExistingImplicitPermissions_sourceFlagsNotInherited() { + val oldImplicitPermissionFlags = PermissionFlags.USER_FIXED + testInheritImplicitPermissionStates( + implicitPermissionFlags = oldImplicitPermissionFlags, + isNewInstallAndNewPermission = false + ) + + val actualFlags = getPermissionFlags(APP_ID_1, USER_ID_0, PERMISSION_NAME_0) + val expectedNewFlags = oldImplicitPermissionFlags or PermissionFlags.IMPLICIT_GRANTED or + PermissionFlags.APP_OP_REVOKED + assertWithMessage( + "After onPackageAdded() is called for a package that requests a permission that is" + + " implicit, existing and runtime, it should not inherit the runtime flags from" + + " the source permission. Hence the actual permission flags $actualFlags should" + + " match the expected flags $expectedNewFlags" + ) + .that(actualFlags) + .isEqualTo(expectedNewFlags) + } + + @Test + fun testOnPackageAdded_nonRuntimeNewImplicitPermissions_sourceFlagsNotInherited() { + testInheritImplicitPermissionStates( + implicitPermissionProtectionLevel = PermissionInfo.PROTECTION_NORMAL + ) + + val actualFlags = getPermissionFlags(APP_ID_1, USER_ID_0, PERMISSION_NAME_0) + val expectedNewFlags = PermissionFlags.INSTALL_GRANTED + assertWithMessage( + "After onPackageAdded() is called for a package that requests a permission that is" + + " implicit, new and non-runtime, it should not inherit the runtime flags from" + + " the source permission. Hence the actual permission flags $actualFlags should" + + " match the expected flags $expectedNewFlags" + ) + .that(actualFlags) + .isEqualTo(expectedNewFlags) + } + + @Test + fun testOnPackageAdded_runtimeNewImplicitPermissions_sourceFlagsInherited() { + val sourceRuntimeFlags = PermissionFlags.RUNTIME_GRANTED or PermissionFlags.USER_SET + testInheritImplicitPermissionStates(sourceRuntimeFlags = sourceRuntimeFlags) + + val actualFlags = getPermissionFlags(APP_ID_1, USER_ID_0, PERMISSION_NAME_0) + val expectedNewFlags = sourceRuntimeFlags or PermissionFlags.IMPLICIT_GRANTED or + PermissionFlags.IMPLICIT + assertWithMessage( + "After onPackageAdded() is called for a package that requests a permission that is" + + " implicit, new and runtime, it should inherit the runtime flags from" + + " the source permission. Hence the actual permission flags $actualFlags should" + + " match the expected flags $expectedNewFlags" + ) + .that(actualFlags) + .isEqualTo(expectedNewFlags) + } + + @Test + fun testOnPackageAdded_grantingNewFromRevokeImplicitPermissions_onlySourceFlagsInherited() { + val sourceRuntimeFlags = PermissionFlags.RUNTIME_GRANTED or PermissionFlags.USER_SET + testInheritImplicitPermissionStates( + implicitPermissionFlags = PermissionFlags.POLICY_FIXED, + sourceRuntimeFlags = sourceRuntimeFlags, + isAnySourcePermissionNonRuntime = false + ) + + val actualFlags = getPermissionFlags(APP_ID_1, USER_ID_0, PERMISSION_NAME_0) + val expectedNewFlags = sourceRuntimeFlags or PermissionFlags.IMPLICIT + assertWithMessage( + "After onPackageAdded() is called for a package that requests a permission that is" + + " implicit, existing, runtime and revoked, it should only inherit runtime flags" + + " from source permission. Hence the actual permission flags $actualFlags should" + + " match the expected flags $expectedNewFlags" + ) + .that(actualFlags) + .isEqualTo(expectedNewFlags) + } + + /** + * If it's a media implicit permission (one of RETAIN_IMPLICIT_FLAGS_PERMISSIONS), we want to + * remove the IMPLICIT flag so that they will be granted when they are no longer implicit. + * (instead of revoking it) + */ + @Test + fun testOnPackageAdded_mediaImplicitPermissions_getsImplicitFlagRemoved() { + val sourceRuntimeFlags = PermissionFlags.RUNTIME_GRANTED or PermissionFlags.USER_SET + testInheritImplicitPermissionStates( + implicitPermissionName = PERMISSION_ACCESS_MEDIA_LOCATION, + sourceRuntimeFlags = sourceRuntimeFlags + ) + + val actualFlags = getPermissionFlags(APP_ID_1, USER_ID_0, PERMISSION_ACCESS_MEDIA_LOCATION) + val expectedNewFlags = sourceRuntimeFlags or PermissionFlags.IMPLICIT_GRANTED + assertWithMessage( + "After onPackageAdded() is called for a package that requests a media permission that" + + " is implicit, new and runtime, it should inherit the runtime flags from" + + " the source permission and have the IMPLICIT flag removed. Hence the actual" + + " permission flags $actualFlags should match the expected flags $expectedNewFlags" + ) + .that(actualFlags) + .isEqualTo(expectedNewFlags) + } + + private fun testInheritImplicitPermissionStates( + implicitPermissionName: String = PERMISSION_NAME_0, + implicitPermissionFlags: Int = 0, + implicitPermissionProtectionLevel: Int = PermissionInfo.PROTECTION_DANGEROUS, + sourceRuntimeFlags: Int = PermissionFlags.RUNTIME_GRANTED or PermissionFlags.USER_SET, + isAnySourcePermissionNonRuntime: Boolean = true, + isNewInstallAndNewPermission: Boolean = true + ) { + val implicitPermission = mockParsedPermission( + implicitPermissionName, + PACKAGE_NAME_0, + protectionLevel = implicitPermissionProtectionLevel, + ) + // For source from non-runtime in order to grant by implicit + val sourcePermission1 = mockParsedPermission( + PERMISSION_NAME_1, + PACKAGE_NAME_0, + protectionLevel = if (isAnySourcePermissionNonRuntime) { + PermissionInfo.PROTECTION_NORMAL + } else { + PermissionInfo.PROTECTION_DANGEROUS + } + ) + // For inheriting runtime flags + val sourcePermission2 = mockParsedPermission( + PERMISSION_NAME_2, + PACKAGE_NAME_0, + protectionLevel = PermissionInfo.PROTECTION_DANGEROUS, + ) + val permissionOwnerPackageState = mockPackageState( + APP_ID_0, + mockAndroidPackage( + PACKAGE_NAME_0, + permissions = listOf(implicitPermission, sourcePermission1, sourcePermission2) + ) + ) + val installedPackageState = mockPackageState( + APP_ID_1, + mockAndroidPackage( + PACKAGE_NAME_1, + requestedPermissions = setOf( + implicitPermissionName, + PERMISSION_NAME_1, + PERMISSION_NAME_2 + ), + implicitPermissions = setOf(implicitPermissionName) + ) + ) + oldState.mutateExternalState().setImplicitToSourcePermissions( + MutableIndexedMap<String, IndexedListSet<String>>().apply { + put(implicitPermissionName, MutableIndexedListSet<String>().apply { + add(PERMISSION_NAME_1) + add(PERMISSION_NAME_2) + }) + } + ) + addPackageState(permissionOwnerPackageState) + addPermission(implicitPermission) + addPermission(sourcePermission1) + addPermission(sourcePermission2) + if (!isNewInstallAndNewPermission) { + addPackageState(installedPackageState) + setPermissionFlags(APP_ID_1, USER_ID_0, implicitPermissionName, implicitPermissionFlags) + } + setPermissionFlags(APP_ID_1, USER_ID_0, PERMISSION_NAME_2, sourceRuntimeFlags) + + mutateState { + if (isNewInstallAndNewPermission) { + addPackageState(installedPackageState) + setPermissionFlags( + APP_ID_1, + USER_ID_0, + implicitPermissionName, + implicitPermissionFlags, + newState + ) + } + with(appIdPermissionPolicy) { + onPackageAdded(installedPackageState) + } + } + } + /** * Setup simple package states for testing evaluatePermissionState(). * permissionOwnerPackageState is definer of permissionName with APP_ID_0. @@ -1734,6 +1920,7 @@ class AppIdPermissionPolicyTest { private const val PERMISSION_NAME_0 = "permissionName0" private const val PERMISSION_NAME_1 = "permissionName1" + private const val PERMISSION_NAME_2 = "permissionName2" private const val PERMISSION_READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE private const val PERMISSION_POST_NOTIFICATIONS = @@ -1742,6 +1929,8 @@ class AppIdPermissionPolicyTest { Manifest.permission.BLUETOOTH_CONNECT private const val PERMISSION_ACCESS_BACKGROUND_LOCATION = Manifest.permission.ACCESS_BACKGROUND_LOCATION + private const val PERMISSION_ACCESS_MEDIA_LOCATION = + Manifest.permission.ACCESS_MEDIA_LOCATION private const val USER_ID_0 = 0 } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthenticationStatsCollectorTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthenticationStatsCollectorTest.java index a11a8f53c2cb..d2e83e9b0708 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/AuthenticationStatsCollectorTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthenticationStatsCollectorTest.java @@ -87,6 +87,8 @@ public class AuthenticationStatsCollectorTest { public void setUp() { when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(eq(R.bool.config_biometricFrrNotificationEnabled))) + .thenReturn(true); when(mResources.getFraction(eq(R.fraction.config_biometricNotificationFrrThreshold), anyInt(), anyInt())).thenReturn(FRR_THRESHOLD); @@ -110,7 +112,6 @@ public class AuthenticationStatsCollectorTest { 0 /* modality */, mBiometricNotification); } - @Test public void authenticate_authenticationSucceeded_mapShouldBeUpdated() { // Assert that the user doesn't exist in the map initially. @@ -342,4 +343,32 @@ public class AuthenticationStatsCollectorTest { // Assert that notification count has been updated. assertThat(authenticationStats.getEnrollmentNotifications()).isEqualTo(1); } + + @Test + public void authenticate_featureDisabled_mapMustNotBeUpdated() { + // Disable the feature. + when(mResources.getBoolean(eq(R.bool.config_biometricFrrNotificationEnabled))) + .thenReturn(false); + AuthenticationStatsCollector authenticationStatsCollector = + new AuthenticationStatsCollector(mContext, 0 /* modality */, + mBiometricNotification); + + authenticationStatsCollector.setAuthenticationStatsForUser(USER_ID_1, + new AuthenticationStats(USER_ID_1, 500 /* totalAttempts */, + 400 /* rejectedAttempts */, 0 /* enrollmentNotifications */, + 0 /* modality */)); + + authenticationStatsCollector.authenticate(USER_ID_1, false /* authenticated */); + + // Assert that no notification should be sent. + verify(mBiometricNotification, never()).sendFaceEnrollNotification(any()); + verify(mBiometricNotification, never()).sendFpEnrollNotification(any()); + // Assert that data hasn't been updated. + AuthenticationStats authenticationStats = authenticationStatsCollector + .getAuthenticationStatsForUser(USER_ID_1); + assertThat(authenticationStats.getTotalAttempts()).isEqualTo(500); + assertThat(authenticationStats.getRejectedAttempts()).isEqualTo(400); + assertThat(authenticationStats.getEnrollmentNotifications()).isEqualTo(0); + assertThat(authenticationStats.getFrr()).isWithin(0f).of(0.8f); + } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java index 318f932bf4e4..3034942953a1 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java @@ -248,8 +248,7 @@ public class PermissionHelperTest extends UiServiceTestCase { verify(mPermManager).grantRuntimePermission( "pkg", Manifest.permission.POST_NOTIFICATIONS, Context.DEVICE_ID_DEFAULT, 10); verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS, - USER_FLAG_MASK | FLAG_PERMISSION_GRANTED_BY_DEFAULT, - FLAG_PERMISSION_USER_SET, true, Context.DEVICE_ID_DEFAULT, 10); + USER_FLAG_MASK, FLAG_PERMISSION_USER_SET, true, Context.DEVICE_ID_DEFAULT, 10); } @Test @@ -267,8 +266,7 @@ public class PermissionHelperTest extends UiServiceTestCase { verify(mPermManager).grantRuntimePermission( "pkg", Manifest.permission.POST_NOTIFICATIONS, Context.DEVICE_ID_DEFAULT, 10); verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS, - USER_FLAG_MASK | FLAG_PERMISSION_GRANTED_BY_DEFAULT, - FLAG_PERMISSION_USER_SET, true, Context.DEVICE_ID_DEFAULT, 10); + USER_FLAG_MASK, FLAG_PERMISSION_USER_SET, true, Context.DEVICE_ID_DEFAULT, 10); } @Test @@ -282,8 +280,7 @@ public class PermissionHelperTest extends UiServiceTestCase { eq("pkg"), eq(Manifest.permission.POST_NOTIFICATIONS), eq(Context.DEVICE_ID_DEFAULT), eq(10), anyString()); verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS, - USER_FLAG_MASK | FLAG_PERMISSION_GRANTED_BY_DEFAULT, - FLAG_PERMISSION_USER_SET, true, Context.DEVICE_ID_DEFAULT, 10); + USER_FLAG_MASK, FLAG_PERMISSION_USER_SET, true, Context.DEVICE_ID_DEFAULT, 10); } @Test @@ -310,8 +307,7 @@ public class PermissionHelperTest extends UiServiceTestCase { eq("pkg"), eq(Manifest.permission.POST_NOTIFICATIONS), eq(Context.DEVICE_ID_DEFAULT), eq(10), anyString()); verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS, - USER_FLAG_MASK | FLAG_PERMISSION_GRANTED_BY_DEFAULT, 0, - true, Context.DEVICE_ID_DEFAULT, 10); + USER_FLAG_MASK, 0, true, Context.DEVICE_ID_DEFAULT, 10); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java index 0566f460c655..381b27b68b41 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java @@ -811,6 +811,28 @@ public class LetterboxUiControllerTest extends WindowTestsBase { /* candidate */ SCREEN_ORIENTATION_PORTRAIT), SCREEN_ORIENTATION_PORTRAIT); } + @Test + public void testOverrideOrientationIfNeeded_userAspectRatioApplied_unspecifiedOverridden() { + spyOn(mController); + doReturn(true).when(mController).shouldApplyUserMinAspectRatioOverride(); + + assertEquals(mController.overrideOrientationIfNeeded( + /* candidate */ SCREEN_ORIENTATION_UNSPECIFIED), SCREEN_ORIENTATION_PORTRAIT); + + // unchanged if orientation is specified + assertEquals(mController.overrideOrientationIfNeeded( + /* candidate */ SCREEN_ORIENTATION_LANDSCAPE), SCREEN_ORIENTATION_LANDSCAPE); + } + + @Test + public void testOverrideOrientationIfNeeded_userAspectRatioNotApplied_returnsUnchanged() { + spyOn(mController); + doReturn(false).when(mController).shouldApplyUserMinAspectRatioOverride(); + + assertEquals(mController.overrideOrientationIfNeeded( + /* candidate */ SCREEN_ORIENTATION_UNSPECIFIED), SCREEN_ORIENTATION_UNSPECIFIED); + } + // shouldApplyUser...Override @Test public void testShouldApplyUserFullscreenOverride_trueProperty_returnsFalse() throws Exception { |